Python 202

[Python] 9495. 스티커

tc = int(input()) for _ in range(tc): n = int(input()) # 한 라인의 스티커 개수 dp = [list(map(int, input().split())) for _ in range(2)] # 주어진 스티커 배열 if n > 1: dp[0][1] += dp[1][0] # 점화식에 i-2가 있기때문에 처음 값은 직접 더해준다. (현재자리의 왼쪽 대각선자리) dp[1][1] += dp[0][0] for i in range(2, n): # 선택할 수 있는 두 자리에 있는 점수 중, 큰 점수와 현재 스티커와 더해주기 dp[0][i] += max(dp[1][i-2], dp[1][i-1]) dp[1][i] += max(dp[0][i-2], dp[0][i-1]) print(max..

Algorithm/Baekjoon 2021.09.30

[Python] 1240. 단순 2진 암호코드

code = { '0001101': 0, '0011001': 1, '0010011': 2, '0111101': 3, '0100011': 4, '0110001': 5, '0101111': 6, '0111011': 7, '0110111': 8, '0001011': 9, } tc = int(input()) for idx in range(1, tc+1): n, m = map(int, input().split()) # 배열 받아오기 arr = [] binary = '' for n in range(n): temp = input() arr.append(temp) if not binary and '1' in temp: # 2진수가 있는 배열 저장 binary = temp p = m - binary[::-1].index..

[Python] 11047. 동전 0

n, k = map(int, input().split()) # 동전 종류 수 n, 만들 가치의 합 k coins = [int(input()) for _ in range(n)] cnt = 0 # 총 사용한 동전 개수 for i in range(n-1, -1, -1): # 큰수부터 시작 if k < coins[i]: # k보다 동전이 크면 pass continue # 동전이 k보다 작은 경우 temp = k // coins[i] # i번째의 동전으로 만들 수 있는 최대 수 k -= coins[i] * temp # i번째의 동전으로 만들 수 있는 가치만큼 빼준다. cnt += temp # 방금 사용한 동전 수를 cnt에 합쳐준다. if not k: # k가 0이 되면 중단 break print(cnt) 큰 동..

Algorithm/Baekjoon 2021.09.28

[Python] 1463. 1로 만들기

n = int(input()) dp = [0 for _ in range(n+1)] for i in range(2, n+1): dp[i] = dp[i-1] + 1# 1번 if i % 3 == 0:# 2번 dp[i] = min(dp[i], dp[i//3]+1) if i % 2 == 0:# 3번 dp[i] = min(dp[i], dp[i//2]+1) print(dp[n]) dp 리스트 안의 i 자리에는 숫자 i를 1로 만들기 위한 주어진 연산을 사용하는 횟수의 최솟값이 담기게 된다. 따라서 2부터 시작하여 (1은 연산할 필요가 없으므로 0) n까지 저장하는 dp를 이용하여 문제를 풀어야 한다. dp[i]에 이전의 숫자(i-1)에서 구한 연산 사용 횟수 +1을 저장한다. 예) i = 10이라면 dp[9] = 2..

Algorithm/Baekjoon 2021.09.28

[Python] 11052. 카드 구매하기

n = int(input()) cards = [0] + list(map(int, input().split())) dp = [0 for _ in range(n+1)] # 각 자리에는 카드 i개를 구매하는 최대 가격이 저장됨 for i in range(1, n+1): for j in range(1, i+1): # i가 4면 (3, 1), (2, 2), (1, 3)일 때를 보는것 dp[i] = max(dp[i-j] + cards[j], dp[i]) # i개 구매할때의 최대 가격 갱신 print(dp[n]) 풀이 포인트 dp 리스트의 자리 i에는 카드 i개를 구매하는 최대 가격이 저장된다. 이중 for문을 돌면서 카드 i개를 구매하는 경우, j가 1부터 돌면서 dp[i-j] + cards[j] 의 값들 중, 최..

Algorithm/Baekjoon 2021.09.26

[Python] 1912. 연속합

n = int(input()) # 수열의 크기 numbers = list(map(int, input().split())) # 수열 dp = [0 for _ in range(n)] # dp 배열 answer = -1001 # 주어진 수열의 원소 범위보다 더 작게 설정 for i in range(n): dp[i] = max(dp[i-1] + numbers[i], numbers[i]) # 이전까지의 연속 합 vs 현재 숫자 (현재 숫자 택하면 꼬리자르기) answer = max(dp[i], answer) # 현재까지의 합이 더 크다면 answer 갱신 print(answer)

Algorithm/Baekjoon 2021.09.26

[Python] 11053. 가장 긴 증가하는 부분 수열

n = int(input()) # 수열의 크기 numbers = list(map(int, input().split())) # 수열 dp = [1 for _ in range(n)] # dp 배열 만들기 (자기자신 1이니까 1로 초기화) answer = 1 # 가장 긴 증가하는 부분 수열 길이 for i in range(n): for j in range(i): # 현재 위치(i)보다 전의 숫자(j)가 작은지 확인 if numbers[j] < numbers[i]: dp[i] = max(dp[i], dp[j]+1) # 결국 i위치의 이전 길이중 최댓값에 +1 하게 된다 answer = max(dp[i], answer) # 가장 긴 이라고 했으니, 길어졌다면 큰 값으로 갱신 print(answer)

Algorithm/Baekjoon 2021.09.26

[Python] 5178. 노드의 합

처음 코드 tc = int(input()) for idx in range(1, tc+1): n, m, l = map(int, input().split()) # 노드의 개수 n, 리프 노드의 개수 m, 값을 출력할 노드 번호 l node = [0 for _ in range(n+1)] for _ in range(m): leaf, num = map(int, input().split()) node[leaf] = num if n % 2: # 노드의 개수가 홀수인경우 아래에서 자식노드 i, i+1을 더해서 부모노드에 넣어주니까 n -= 1 # -1을 해줄 필요가 있다. (즉, i+1때문에) for i in range(n, 1, -2): try: # 자식 노드 두개 더해서 부모 노드에 넣어준다. node[i//2] ..

[Python] 5177. 이진힙

tc = int(input()) for idx in range(1, tc+1): n = int(input()) # 목표 노드 node = [0] + list(map(int, input().split())) # 노드들 받아오기 answer = 0 # 위치 바꾸기 for i in range(1, n+1): while node[i//2] > node[i]: # 부모가 나보다 클때 바꿔주기 node[i//2], node[i] = node[i], node[i//2] i //= 2 # 다음 조상도 검토 # 조상 노드 다 더하기 p = n//2 # n의 부모부터 시작이니까 while p > 0: answer += node[p] p //= 2 print(node) print('#{} {}'.format(idx, ans..