유형 1 [난이도 상]
문제 1 [BOJ] 동전 0 - 그리디(실4) ⇒ [BOJ] 거스름돈 - 그리디(브2) 유사
https://www.acmicpc.net/problem/11047
# 두 수 입력 (N: n개 줄, K: 가치의 합)
N, K = map(int, input().split())
# coin 리스트 생성 - 컴프리핸션 개념 적용
coin_list = [int(input()) for _ in range(N)]
# coin 리스트 역순 정렬
coin_list.sort(reverse = True)
count = 0
# coin 리스트 요소(j)와 비교하여 K(합)가 j보다 크거나 같으면 갯수는 몫, 나머지는 거스름돈으로
for j in coin_list:
if K >= j:
count += (K // j)
K %= j
print(count)
Python
복사
문제 2 [BOJ] 다리놓기 - DP(실5)
https://www.acmicpc.net/problem/1010
# 규칙: (i, j) = (i - 1, j - 1) + (i, j - 1)
def dp(N, M):
# 초기화 - 이해 X;;;
dp = [[1] * (M + 1) for _ in range(M + 1)]
# 이 부분 역시 이해 X;;;
for i in range(2, M + 1):
dp[1][i] = i
for i in range(2, N + 1):
for j in range(i + 1, M + 1):
dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1]
return dp[N][M]
for _ in range(int(input())):
# 정수 입력 받음
N, M = map(int, input().split())
print(dp(N, M))
Python
복사
•
math 메소드의 comb
◦
참고
math.perm()
: n개의 아이템에서 k개를 선택하는 방법(중복 X, 순서 O)
math.comb()
: n개의 아이템에서 k개를 선택하는 방법(중복 X, 순서 X)
import math
T = int(input())
for _ in range(T):
west, east = map(int, input().split(' '))
# 경우의 수 조회하는 메소드 사용
print(math.comb(east, west))
Python
복사
문제 4 [PRO] 구명보트 - 그리디(lv2)
https://school.programmers.co.kr/learn/courses/30/lessons/42885
# [70, 50, 80, 50]
def solution(people, limit):
answer = 0
start = 0
end = len(people) - 1
# 순차 정렬
people.sort()
while start <= end:
if people[start] + people[end] <= limit:
start += 1
end -= 1
else:
end -= 1
answer += 1
return answer
print(solution([70, 50, 80, 50], 100))
Python
복사
문제 5 [PRO] 하노이의 탑 - 재귀(lv2)
https://school.programmers.co.kr/learn/courses/30/lessons/12946
def hanoi (from_pos, to_pos, aux_pos, n, answer):
if n == 1: # 옮겨야 하는 원판이 한 개인 경우 기둥으로 바로 옮긴다
answer.append([from_pos, to_pos])
else: # 옮겨야 하는 원판이 두 개 이상이라면 재귀의 과정을 거친다
# 가장 아래 원판 제외한 나머지 n - 1개의 원판을 남는 기둥으로 옮긴다
hanoi(from_pos, aux_pos, to_pos, n - 1, answer)
# 가장 아래의 원판을 목표 지점으로 옮긴다
hanoi(from_pos, to_pos, aux_pos, 1, answer)
# 중간, 보조 기둥으로 옮겨진 n - 1개의 원판들을 목표했던 기둥으로 옮긴다
hanoi(aux_pos, to_pos, from_pos, n - 1, answer)
return answer
def solution(n):
# from_pos: 출발 기둥 | to_pos: 목표 기둥 | aux_pos: 중간, 보조 기둥 | n: 옮겨야 할 원판 개수
answer = hanoi(1, 3, 2, n, [])
return answer
Python
복사
유형 2 [ 난이도 중 하]
문제 1 [BOJ] ACM 호텔 - 구현(브3)
https://www.acmicpc.net/problem/10250
# T개의 테스트 데이터 입력
T = int(input())
# ACM 호텔
# 층 수:
# 6 12 10 (H, W, N)
# 30 50 72
# N % H = 10 % 6 = 4
# room_num = (N // H) + 1 = 2
# T번 반복 - 언더스코어 문법 적용
for _ in range(T):
H, W, N = map(int, input().split(' '))
# 층 수 (10 % 6 = 4, 4층)
# 72 % 30 = 12, 12층
floor = N % H
# 호 수 (10 // 6 = 1 + 1 = 2)
# 72 // 30 = 2 + 1 = 3
room_num = N // H + 1
# 예외 처리 - 0층이 되면 안 됨 (ex. 4, 8, 4 or 6, 12, 6)
if floor == 0:
floor = H
room_num -= 1
# 결과: 층수 * 100 + 호수
print(floor * 100 + room_num)
Python
복사
문제 2 [BOJ] 거스름돈 - 그리디(브2)
https://www.acmicpc.net/problem/5585
money = int(input())
change = 1000 - money
count = 0
change_list = [500, 100, 50, 10, 5, 1]
for i in range(0, len(change_list)):
# 거스름돈이 0인 경우 빠져 나옴
if change == 0:
break
if change >= change_list[i]:
# 갯수는 몫, 거스름돈은 나머지
count = count + (change // change_list[i])
change = change % change_list[i]
print(count)
Python
복사
문제 3 [PRO] 체육복 - 그리디(lv1)
https://school.programmers.co.kr/learn/courses/30/lessons/42862
# 4번 학생은 "3번" 학생이나 "5번" 학생에게만 체육복을 빌려줄 수 있음
def solution(n, lost, reserve):
answer = 0
# set을 사용하여 공통 요소 제거
reserve_del = set(reserve) - set(lost) # [1, 3, 5]
lost_del = set(lost) - set(reserve) # [2, 4]
# 여벌 리스트 순회, 도난 리스트 요소의 전후값 판별하여
# 조건에 따라 만약에 여벌 리스트 (요소값 - 1) or (요소값 + 1) 이
# 도난 리스트에 존재하면 해당 요소값을 제거
for i in reserve_del:
if i - 1 in lost_del:
lost_del.remove(i - 1)
elif i + 1 in lost_del:
lost_del.remove(i + 1)
# n - 도난 리스트 길이
answer = n - len(lost_del)
return answer
print(solution(5, [2, 4], [1, 3, 5]))
Python
복사
문제 4 [PRO] 수박수박수박수박수박수? - 구현(lv1)
https://school.programmers.co.kr/learn/courses/30/lessons/12922
def solution(n):
answer = ''
str1 = "수"
str2 = "박"
# 홀수, 짝수로 구분하여 출력
for i in range(n):
if i % 2 == 0:
answer += str1
else:
answer += str2
return answer
Python
복사
문제 5 [BOJ] 부녀회장이 될테야 - DP, 구현(브1)
https://www.acmicpc.net/problem/2775
# 1층의 3호, 2층의 3호
# 0층부터 있고 각 층에는 1호부터 있음
# 0층의 i호 에는 i명이 산다
# a층의 b호에 살려면 자신의 아래(a - 1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 함
# 1층의 3호에 살려면 자신의 아래(1 - 1)층의 1호부터 3호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 함
# 2층의 3호에 살려면 자신의 아래(2 - 1)층의 1호부터 3호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 함
# 역 "ㄴ"자 패턴
# 4 => 1 6 21 56
# 3 => 1 5 15 35
# 2 => 1 4 10 20
# 1 => 1 3 6 10
# 0 => 1 2 3 4
T = int(input())
for _ in range(T):
K = int(input()) # 1층
N = int(input()) # 3호
dp = []
# 0층 i호 명수 설정
for i in range(N):
dp.append(i + 1)
# 1층부터 진행
for i in range(1, K + 1):
for j in range(N):
if j > 0:
dp[j] += dp[j - 1] # 0층인 경우 1층의 호 수에 더해준 수 만큼 추가해줌
else:
continue
print(dp[N - 1])
Python
복사