현재 상황에서 지금 당장 좋은 것만 고르는 방법
큰 단위의 화폐부터 최대한 사용하면 항상 최소 동전 개수를 보장한다.
n = 1260
count = 0
array = [500, 100, 50, 10]
for coin in array:
count += n // coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수
n %= coin
print(count)
N과 K가 주어졌을 때, N에서 1을 빼거나 K로 나누는 연산을 반복해 1로 만드는 최소 연산 횟수를 구하라.
K가 2 이상이기만 하면, K로 나누는 것이 1을 빼는 것보다 항상 빠르게 N을 줄인다. N은 항상 1에 도달하게 된다.
n, k = map(int, input().split())
result = 0
while True:
# N이 K로 나누어 떨어지는 수가 될 때까지 빼기
target = (n // k) * k # K의 배수 중 N보다 작거나 같은 가장 큰 수
result += (n - target)
n = target
# N이 K보다 작을 때 (더 이상 나눌 수 없을 때) 반복문 탈출
if n < k:
break
# K로 나누기
result += 1
n //= k
# 마지막으로 남은 수에 대하여 1씩 빼기
result += (n - 1)
print(result)
target = (n // k) * k → K로 나누어 떨어지는 가장 가까운 수를 한 번에 계산해, 1씩 빼는 횟수를 줄인다.
숫자로 이루어진 문자열이 주어졌을 때, 각 숫자 사이에 + 또는 ×를 넣어 결과값을 최대로 만들어라.
+보다 ×가 더 값을 크게 만든다. (ex. 5+6=11, 5×6=30)| 케이스 | 더하기 | 곱하기 | 선택 |
|---|---|---|---|
| 5, 6 | 11 | 30 | ✅ 곱하기 |
| 0, 6 | 6 | 0 | ✅ 더하기 |
| 1, 6 | 7 | 6 | ✅ 더하기 |
data = input()
result = int(data[0])
for i in range(1, len(data)):
num = int(data[i])
if num <= 1 or result <= 1:
result += num
else:
result *= num
print(result)
공포도가 X인 모험가는 반드시 X명 이상으로 구성된 그룹에 참여해야 한다. 최대 몇 개의 그룹을 만들 수 있는지 구하라.
n = int(input())
data = list(map(int, input().split()))
data.sort()
result = 0 # 총 그룹의 수
count = 0 # 현재 그룹에 포함된 모험가의 수
for i in data:
count += 1
if count >= i: # 현재 그룹 인원이 공포도 이상이면 그룹 결성
result += 1
count = 0
print(result)
오름차순 정렬 덕분에 현재 i가 그룹 내 최대 공포도임이 보장된다. 따라서 count >= i 조건 하나로 그룹 결성 가능 여부를 판단할 수 있다.
풀이를 떠올리는 것은 쉽지만, 소스코드로 옮기기 어려운 문제
💡 시뮬레이션 및 완전 탐색 문제에서는 2차원 방향 벡터가 자주 활용된다.
# 상하좌우 방향 벡터
dx = [0, 0, -1, 1] # 행 변화량 (L, R, U, D)
dy = [-1, 1, 0, 0] # 열 변화량
N×N 격자에서 (1,1)부터 시작해 L/R/U/D 명령어를 따라 이동할 때, 격자를 벗어나는 이동은 무시한다. 최종 위치를 구하라.
요구사항대로 구현하는 시뮬레이션 문제. 방향 벡터를 리스트로 정의해 이동을 처리한다.
n = int(input())
x, y = 1, 1
plans = input().split()
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
move_types = ['L', 'R', 'U', 'D']
for plan in plans:
for i in range(len(move_types)):
if plan == move_types[i]:
nx = x + dx[i]
ny = y + dy[i]
# 공간을 벗어나는 경우 무시
if nx < 1 or ny < 1 or nx > n or ny > n:
continue
x, y = nx, ny
print(x, y)
00:00:00부터 N:59:59까지의 모든 시각 중 숫자 3이 하나라도 포함된 경우의 수를 구하라.
하루는 86,400초. 모든 경우의 수를 직접 탐색하는 완전 탐색 문제.
h = int(input())
count = 0
for i in range(h + 1):
for j in range(60):
for k in range(60):
if '3' in str(i) + str(j) + str(k):
count += 1
print(count)
'3' in str(i) + str(j) + str(k) → 시/분/초를 문자열로 합쳐서 '3'이 포함되는지 한 번에 확인한다.
8×8 체스판에서 나이트의 위치가 주어졌을 때, 이동 가능한 경우의 수를 구하라. 나이트는 L자로만 이동한다.
나이트의 8가지 이동 방향을 모두 시도하고, 체스판을 벗어나지 않는 경우만 카운트한다.
input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1
# 나이트의 8가지 이동 방향
steps = [(-2,-1), (-1,-2), (1,-2), (2,-1),
(2,1), (1,2), (-1,2), (-2,1)]
result = 0
for step in steps:
next_row = row + step[0]
next_column = column + step[1]
if 1 <= next_row <= 8 and 1 <= next_column <= 8:
result += 1
print(result)
ord(input_data[0]) - ord('a') + 1 → 알파벳 열 좌표를 숫자로 변환한다. (a→1, b→2, ...)
알파벳 대문자와 숫자로 구성된 문자열이 주어졌을 때, 알파벳은 오름차순 정렬, 숫자는 모두 더해서 뒤에 붙여 출력하라.
K1KA5CB7 → ABCKK13문자를 하나씩 확인하며 알파벳과 숫자를 분리한 뒤, 알파벳은 정렬하고 숫자 합계를 뒤에 붙인다.
data = input()
result = []
value = 0
for x in data:
if x.isalpha():
result.append(x)
else:
value += int(x)
result.sort()
if value != 0:
result.append(str(value))
print(''.join(result))
| 유형 | 핵심 전략 |
|---|---|
| 그리디 | 현재 최선의 선택 반복 + 정당성 검토 필수 |
| 시뮬레이션 | 요구사항 그대로 구현, 방향 벡터 활용 |
| 완전 탐색 | 가능한 모든 경우 탐색 (경우의 수가 적을 때) |