목록분류 전체보기 (768)
우노
문제 링크 https://www.acmicpc.net/problem/2839 풀이 남아있는 N이 5로 딱 나눠떨어질때까지 3씩 덜어냅니다. 세부 알고리즘은 아래 코드와 같습니다. 입력이 9일땐, N이 마지막에 0이 되더라도, if (n % 5 == 0) 의 조건은 만족하므로, 3으로만 나눈 결과값이 출력됩니다. 코드 import sys # 설탕 무게 n = int(sys.stdin.readline()) # 봉지 개수 bag = 0 while n >= 0 : if n % 5 == 0 : # 남은 설탕이 5로 나눠떨어진다면 bag += (n // 5) # 5로 나눈 몫을 봉지 개수에 추가 print(bag) break n -= 3 # 남은 설탕이 5로 나눠떨어지지않는다면, 3씩 덜어내기 bag += 1 # ..
문제 링크 https://www.acmicpc.net/problem/1790 풀이 단순히 문자열을 이어붙이면 메모리초과가 발생합니다. 따라서, 각각의 자릿수에 해당하는 숫자의 개수와 각 숫자의 글자수를 활용해 문제를 해결할 수 있습니다. 1의 자리인 숫자는 9개이며, 각 숫자의 글자수는 1개입니다. 10의 자리인 숫자는 90개이며, 각 숫자의 글자수는 2개입니다. 100의 자리인 숫자는 900개이며, 각 숫자의 글자수는 3개입니다. 따라서, 원하는 자릿수 K가 200이라면 아래와 같은 방식으로 해당하는 문자를 추측할 수 있습니다. 우선, 200을 넘지 않는 선에서, 1의 자리숫자와 10의 자리숫자가 모두 사용되는 것을 알 수 있습니다. 1 x 9 + 90 x 2 = 189 200 - 189 = 11 이므..
문제 링크 https://www.acmicpc.net/problem/3020 풀이 누적 합(Prefix Sum) 문제입니다. 먼저, 전체 높이 만큼의 인덱스를 가지는 배열을 2개 생성한 뒤, 각 배열에 대해, 석순과 종유석의 높이에 맞는 인덱스에 1을 증가시키고, 인덱스를 역순으로 누적합을 계산합니다. 이는, 석순 또는 종유석을 기준으로한 높이에 따라 잘리는 개수를 의미합니다. 각 장애물을 기준으로한 높이를 의미하기 때문에, 석순의 높이가 1, 3, 5 로 이루어져있을 때, 1의 높이에서 잘리는 석순의 개수는 3이며, 종유석의 높이가 5, 3, 1 로 이루어져있을 때, 1의 높이에서 잘리는 종유석의 개수는 3입니다. 결과적으로, 해당 누적합 배열을 통해, 각 장애물을 기준으로, 높이가 i일 때 잘리는 석..
문제 링크 https://www.acmicpc.net/problem/2615 풀이 모든 칸을 순서대로 확인하며, 4가지 방향(→ ↓ ↘ ↗)을 탐색합니다. 연속된 다섯 개의 바둑알 중 가장 왼쪽에 있는 바둑알의 좌표를 출력해야하기 때문입니다. 또한, 5칸 연속으로 바둑알이 놓여져있을 경우, 육목인 케이스를 걸러줘야합니다. 첫 바둑알을 놓은 방향 이전에 바둑알이 하나 더 있는지 확인 마지막 바둑알을 놓은 방향 이후에 바둑알이 하나 더 있는지 확인 코드 import sys # 바둑판 초기화 board = [] for i in range(19): board.append(list(map(int, sys.stdin.readline().split()))) # 연속된 다섯 개의 바둑알 중 가장 왼쪽에 있는 바둑알의 ..
문제 링크 https://www.acmicpc.net/problem/6198 풀이 모든 빌딩을 순서대로 탐색하며, 아래 조건에 따라 현재 탐색하고 있는 빌딩의 높이를 Stack에 삽입 현재 탐색하고 있는 빌딩의 높이가 Stack TOP보다 크거나 같다면, 현재 탐색하고 있는 빌딩의 높이가 TOP보다 작아질때까지 Stack TOP 제거 현재 탐색하고 있는 빌딩의 높이가 Stack TOP보다 작다면, Stack에 존재하는 빌딩 수 만큼 결과에 덧셈 현재 탐색하고 있는 빌딩의 높이를 Stack에 삽입 코드 import sys # 빌딩의 개수 n = int(sys.stdin.readline()) # 빌딩들의 높이 arr = [] for _ in range(n): arr.append(int(sys.stdin.re..
문제 링크 https://www.acmicpc.net/problem/2493 풀이 모든 탑을 순서대로 탐색하며, 아래 조건에 따라 전처리한 뒤, 현재 탑의 정보를 (높이, 위치) 형식으로 Stack에 저장 현재 탐색하고 있는 탑의 높이가 Stack TOP의 높이보다 작다면, 현재 탐색하고 있는 탑의 레이저를 수신 받을 수 있는 탑의 위치를 저장 현재 탐색하고 있는 탑의 높이가 Stack TOP의 높이보다 크다면, Stack TOP 제거 코드 import sys # 탑의 수 n = int(sys.stdin.readline()) # 탑의 높이 arr = [0] + list(map(int, sys.stdin.readline().split())) # 결과 배열 result = [0] * (n+1) # 스택 초기..
문제 링크 https://www.acmicpc.net/problem/3986 풀이 Stack을 사용해서 해결할 수 있습니다. 모든 문자를 순서대로 탐색하며, 현재 탐색 중인 문자가 Stack의 TOP과 동일하다면, Stack의 TOP을 제거하고 Stack의 TOP과 동일하지 않다면, 현재 문자를 Stack에 삽입합니다. 모든 문자를 탐색한 이후, Stack에 문자들이 남아있지 않다면 좋은 단어입니다. 코드 import sys # 단어의 수 n = int(sys.stdin.readline()) # 좋은 단어의 수 result = 0 for i in range(n): line = sys.stdin.readline().rstrip() # 첫 번째 문자는 스택에 바로 삽입 stack = [line[0]] for..
문제 링크 https://www.acmicpc.net/problem/4949 풀이 기본적인 스택 문제입니다. 우선, { ‘닫는 괄호’ : ‘여는 괄호’ } 형식으로 모든 괄호를 사전으로 생성합니다. 이후, stack을 생성한 뒤, 문자열 s를 처음부터 훑으면서 열린 괄호라면 stack에 push하고 닫힌 괄호라면 stack에서 pop한 top과 비교합니다. 닫힌 괄호와 top이 짝이 맞지 않는다면 False 닫힌 괄호가 등장했지만, 스택에 열린 괄호가 없을 경우 False 세부 풀이는 아래 코드에 설명되어있습니다. 코드 import sys while True: line = sys.stdin.readline().rstrip() if line == '.': break # 스택 생성 stack ..
문제 링크 https://www.acmicpc.net/problem/1541 풀이 최솟값을 만들기 위해서는 - 기준으로 괄호를 치면 됩니다. 예를 들어, 55 - 50 + 40 - 30 + 20 을 입력 받았을 때, - 기준으로 괄호를 친다면, 55 - (50 + 40) - (30 + 20) 가 되며, 이는 최솟값이 됩니다. 세부 알고리즘은 아래 코드와 같으며, ['55', '50 + 40', '30 + 20']로 전처리했을 때, 각 원소들을 원소들의 합으로 변환한 뒤, 맨 처음의 원소는 더하고 나머지 원소들은 빼주면 됩니다. 코드 import sys # 입력 문자열 input_ = sys.stdin.readline().rstrip() # 숫자 배열 num_ar..
pandasql 란? Pandas DataFrame 기반의 SQL을 지원하는 위한 패키지입니다. sqlite의 SQL문법을 지원합니다. 원리는 다음과 같습니다. SQLAlchemy에서 sqlite의 메모리 DB를 한시적으로 생성합니다. python envrionment에서 locals()이나 globals()로 해당 dataframe을 찾아 메모리 DB에 테이블로 올립니다. SQL문으로 데이터를 추출합니다. 따라서, 해당 포스트에선 Pandas DataFrame으로 SQL을 사용하는 방법에 대해서 다뤄보겠습니다. pandasql 설치 pip install -U pandasql globals()로 환경 지정 from pandasql import sqldf dfsql = lambda q: sqldf(q, g..