SW개발/코딩테스트
[백준]1149번 RGB거리 - DP
n = int(input()) cost = [] for i in range(n): cost.append(list(map(int, input().split()))) for i in range(1, n): cost[i][0] += min(cost[i-1][1], cost[i-1][2]) # 선택할 수 있는 i-1(이전 값)에서 작은 것을 누적시켜 더함 cost[i][1] += min(cost[i-1][0], cost[i-1][2]) cost[i][2] += min(cost[i-1][0], cost[i-1][1]) print(min(cost[-1])) 코드 설명 각 집을 RGB로 칠하는 비용을 먼저 리스트에 저장한다. 그 후 반복문을 돌면서 R, G, B 각각 칠하는 비용을 누적시켜 구한다. 마지막에 저장된 ..
[백준]9461번 파도반 수열 - DP
n = int(input()) length = [] for i in range(n): case = int(input()) tri = [1, 1, 1] if case >= 3: for i in range(3, case): tri.append(tri[i - 3] + tri[i - 2]) print(tri[-1]) 코드 설명 3번째까지의 초기 값을 tri 리스트에 저장하여 준다. 3이상의 경우가 나올때는 점화식을 이용해 값을 구해준다. 1 -> 1 -> 1 -> 2-> 2 -> 3 -> 4 -> 5 -> 7 -> 9 -> 12 -> 16 과 같은 형태로 계속 늘어난다. 유심히 살펴보면 i 번째의 길이는 i-3 + i-2 의 값임을 유추할 수 있다. 이를 활용해 점화식을 세울 수 있다. Point : 수가 증가..
[백준]9184번 신나는 함수 실행 - DP
dp = [[[0] * 21 for i in range(21)] for i in range(21)] # 값 저장을 위한 3차원 리스트 def w(a, b, c): if a 20: return w(20, 20, 20) if dp[a][b][c] != 0: # 값이 기억하고 있는 것 -> 바로 출력 return dp[a][b][c] if a < b and b < c: dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c) # 점화식 return dp[a][b][c] else: # otherwise dp[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b..
[백준]1003번 피보나치 함수 - DP
n = int(input()) for i in range(n): case = int(input()) zero = [1, 0, 1] one = [0, 1, 1] if case >= 3 : for i in range(3, case+1): zero.append(zero[i-2]+zero[i-1]) one.append(one[i-2]+one[i-1]) print(zero[case], one[case]) 코드 설명 기본적으로 피보나치 수의 3번째 까지는 0과 1이 등장한 횟수로 초기화하여 준다. 3이상의 숫자가 나올 경우 피보나치의 점화식을 이용하여 zero, one 리스트에 값을 추가하여 준다. Point : DP 이론을 통하여 빠른 시간내에 구할 수 있는 문제이다. 값을 기억하면서 다음 계산에 이용하는 방식이..
[백준]13305번 주유소 - 그리디
import sys n = int(input()) length = list(map(int, sys.stdin.readline().split())) oil = list(map(int, sys.stdin.readline().split())) sum_ = 0 min_ = 0 for i in range(n - 1): if i == 0: sum_ = oil[0] * length[0] min_ = oil[0] else: min_ = min(min_, oil[i]) sum_ = sum_ + min_ * length[i] print(sum_) 코드 설명 길이와 기름 값 가격을 리스트에 저장하여 둔다. 반복문을 n-1 번 수행한다. 만약 맨 처음일 경우 첫 도로의 길이 * 첫 도시의 가격을 통해 기름을 넣어준다. 다음 ..
[백준]1449번 수리공 항승 - 그리디
n, l = map(int, input().split()) where = list(map(int, input().split())) where.sort() start = 0 cnt = 0 for loc in where: if start < loc: # 덮혀진 곳은 더 이상 탐색 필요 없음. start = loc + l - 1 # 하나의 테잎으로 끝나는 위치로 갱신해줌. cnt += 1 print(cnt) 코드 설명 수리해야 하는 곳의 위치를 순서대로 하기 위해 입력 받은 후 정렬을 해준다. 이미 끝난 위치를 기록하기 위한 start 변수를 선언하여 준다. 반복문을 돌면서 탐색 시작 위치 보다 수리하려는 위치가 클 경우에만 테잎을 붙히고, 시작 위치를 loc + 테잎의 길이 - 1 로 계속 갱신한다. Poi..
[백준]4796번 캠핑 - 그리디
cnt = 1 while True: a = list(map(int, input().split())) if a[0] == 0: break result = (a[2] // a[1]) * a[0] if a[0] < a[2] - ((a[2] // a[1]) * a[1]): result += a[0] else: result += a[2] - ((a[2] // a[1]) * a[1]) print("Case ", cnt, ": ", sep="", end="") print(result) cnt += 1 코드 설명 테스트 케이스를 입력 받으면서 숫자가 0이 나온다면 반복을 종료한다. 먼저 result 값을 V // P * L 의 연산을 이용해 계산하여 준다. 그 후에 이용 가능한 남은 일수를 체크하는데 만약 남은 일수가..
[백준]1339번 단어 수학 - 그리디
n = int(input()) word = [] for i in range(n): word.append(input()) digit = {} for each_list in word: cnt = 0 for i in each_list: if i not in digit: digit[i] = 10 ** (len(each_list) - cnt - 1) # 10의 거듭제곱 형태로 자릿수 설정 else: digit[i] += 10 ** (len(each_list) - cnt - 1) # 자릿수 * 등장 횟수 누적 cnt += 1 digit = sorted(list(digit.values()), reverse=True) # 내림차순으로 정렬 sum = 0 for i in range(len(digit)): sum += d..
[백준]1946번 신입 사원 - 그리디
import sys t = int(sys.stdin.readline()) for i in range(t): n = int(sys.stdin.readline()) grade = [[0] * 2 for i in range(n)] cnt = 1 for j in range(n): grade[j][0], grade[j][1] = map(int, sys.stdin.readline().strip().split()) grade.sort(key=lambda x: int(x[0])) minV = grade[0][1] for x in range(n): if minV > grade[x][1]: minV = grade[x][1] cnt += 1 print(cnt) 코드 설명 테스트 케이스의 숫자 만큼 반복문을 진행한다. 반복문..