티스토리 뷰

📍 문제 탐색하기
이번 문제는 정수를 1, 2, 3의 합으로 나타내는 방법의 수를 계산하는 문제이다. 이를 동적 계획법(DP)을 사용해 효율적으로 해결할 수 있다.
문제 조건
- 정수 n(1 ≤ n ≤ 10)을 1, 2, 3의 합으로 나타내는 방법의 수를 구한다.
- 테스트 케이스 개수 T가 주어지고, 각 테스트 케이스에 대해 결과를 출력한다.
- 예를 들어, n = 4라면 결과는 다음과 같습니다:
- 1 + 1 + 1 + 1
- 1 + 1 + 2
- 1 + 2 + 1
- 2 + 1 + 1
- 2 + 2
- 1 + 3
- 3 + 1
→ 총 7가지.
입력 범위
- 1 ≤ T ≤ 10 (테스트 케이스 개수)
- 1 ≤ n ≤ 10 (계산할 정수)
가능한 시간 복잡도
- 최대 n = 10이므로, 동적 계획법(DP)을 사용하면 O(n)으로 해결 가능하다.
- 최대 테스트 케이스가 T = 10이므로, 전체 복잡도는 O(T × n) = O(100)으로 충분히 처리 가능하다.
📍 코드 설계하기
입력 처리
- 테스트 케이스 개수 T를 입력받는다.
- 각 테스트 케이스에서 계산할 정수 n을 입력받는다.
DP 배열 초기화
- hap 배열을 초기화하여 각 hap[n]에 n을 1, 2, 3의 합으로 나타내는 방법의 수를 저장한다.
- 초기값:
- hap[1] = 1 (1)
- hap[2] = 2 (1+1, 2)
- hap[3] = 4 (1+1+1, 1+2, 2+1, 3)
DP 점화식
- hap[n] = hap[n-1] + hap[n-2] + hap[n-3]
- 마지막에 더해지는 숫자가 각각 1, 2, 3일 때의 경우의 수를 합친다.
결과 출력
- 각 테스트 케이스에 대해 hap[n] 값을 출력한다.
📍 시도 회차 및 수정 사항
1차 시도 (틀림) ❌
T=int(input())
hap=[0]*11
for i in range(T):
n=int(input())
if n==1:
hap[1]=1
elif n==2:
hap[2]=2
elif n==3:
hap[3]=4
else:
hap[n]=hap[n-1]+hap[n-2]+hap[n-3]
print(hap[n])
문제점:
- hap[n] 계산 시, 이전 값(hap[n-1], hap[n-2], hap[n-3])이 미리 계산되어 있지 않을 수 있다.
- 테스트 케이스마다 hap 값을 올바르게 초기화하거나 순차적으로 계산하지 않았기 때문에 올바른 결과가 나오지 않았다.
2차 시도 (맞음) ✅
T = int(input())
hap = [0] * 11
for _ in range(T):
n = int(input())
for i in range(1, n + 1): # 순차적으로 1부터 n까지 계산
if i == 1:
hap[1] = 1
elif i == 2:
hap[2] = 2
elif i == 3:
hap[3] = 4
else:
hap[i] = hap[i-1] + hap[i-2] + hap[i-3]
print(hap[n])
hap 값 계산을 순차적으로 수행하도록 수정해주었따.
- for i in range(1, n + 1)을 사용하여 필요한 값(hap[1], ..., hap[n])을 순차적으로 계산해주었다.
- 이로써 테스트 케이스마다 hap 값을 재사용할 수 있고, n값에 대해 항상 정확한 결과를 출력할 수 있게 되었다!
📍 느낀점
- 동적 계획법에서 이전 값이 필요하다는 점을 항상 유의하자!
- 문제의 조건과 초기값(hap[1], hap[2], hap[3])을 정확히 이해하자!
'알고리즘' 카테고리의 다른 글
[알고리즘] 백준 파이썬 1149 RGB거리 (0) | 2025.01.12 |
---|---|
[알고리즘] 백준 파이썬 14430 자원캐기 (0) | 2025.01.11 |
[알고리즘] 백준 파이썬 10026 적록색약 (0) | 2025.01.09 |
[알고리즘] 백준 파이썬 27737 버섯 농장 (0) | 2025.01.08 |
[알고리즘] 백준 4963 섬의 개수 파이썬 (0) | 2025.01.07 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- SQL 레벨업
- 준영속
- DP
- 스프링 커뮤니티
- 다이나믹 프로그래밍
- 프론트엔드
- 백준
- 북마크
- 인텔리제이
- 회원탈퇴
- 스프링 북마크
- 스프링
- SQLD
- SQL
- 로그아웃
- 파이썬
- 웹 MVC
- 스프링부트
- 자바
- 로깅
- 자바 스프링
- 지연로딩
- elasticsearch
- JPA
- EnumType.ORDINAL
- 백준 파이썬
- 커뮤니티
- 비영속
- 영속
- 웹MVC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함