Backend
home

2주차

생성일
2025/01/24 05:52
태그

유형 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
복사