B. 냉동식품
1. 시간을시뮬레이션 한다.
시작H : 시작M ~ 종료H : 종료M
2. 각각의 시간과 분을 검사한다.
H:M정수 > 문자열 변환, 각각의 문자를 비교
3. 찾는 숫자 N과 같으면 COUNT 증가
4.
C. ISBN
1. 훼손된번호 부분(X)을 제외한 값에 각각의
가중치(1 혹은 3)를 곱해 합을 구한다.
2. M = 10 – (X 자리의 가중치 * N + 합)%10
3. 알맞은 M이 나올 때까지 N의 값을 증가시키
며 N를 찾는다.
5.
D. 파닭파닭
이분탐색(Binary Search)문제
1. 파닭에 넣을 수 있는 파의 최대길이를 구해서
남은 파의 양을 구하는 문제
2. 쉬운 풀이 : 1cm 부터 다 잘라보면서 시도
시간 복잡도 : O(SL) -> 시간초과!
6.
D. 파닭파닭
이분탐색(Binary Search)문제
1. 자르는 파의 길이가 짧아질수록 만들 수 있는
파닭의 개수가 증가함
2. 이진탐색을 적용할 수 있다!
3. 자르는 파의 길이에 대해 이진탐색
시간 복잡도 : O(SlgL)
7.
E. 입 챌린저
•스킬을 한 번씩 사용하면서 모든 경우를 시뮬레이션
• 필요한 정보
– 모든 스킬의 사용 횟수
– 현재 체력
• 스킬을 사용하는 순서를 고정하면?
– 지금 사용할 스킬 & 현재 체력
8.
E. 입 챌린저
•지금 사용할 스킬과 현재 체력으로 구할 수 있는 최소값은
이전의 선택이 영향을 미치지 않음
• DP식이 성립
• D[pos][hp] = pos번째 스킬부터 시작하여 체력 hp를 0으
로 만들때 드는 마나 비용의 최소값
9.
E. 입 챌린저
•D[pos][hp] = pos번째 스킬부터 시작하여 체력 hp를 0으로 만
들때 드는 마나 비용의 최소값
• D[pos][hp] = min {
mana[pos] + D[pos + 1][hp – deal[pos]],
mana[pos] * 2 + K + D[pos + 1][hp – deal[pos] * 2],
…
}
• 시간 복잡도 : O(NM^ 2)
10.
F. 숫자 조각
•0~9의 숫자를 한 번만 사용해서 만든 숫자 중 N하고 가장 가까운
숫자를 찾는 문제
• 완전탐색
– 모든 숫자를 직접 구해서 직접 비교
– 시간 복잡도 : O(digit!)
11.
F. 숫자 조각
•규칙성
– 맨 앞자리부터 N과 똑같이 숫자를 만들어가면서 불가능한 위치를 찾음
– 불가능한 위치의 숫자를 1 더하거나 1 빼는것이 가장 가까운 수
– 그 뒤는 남은 수들로 가장 크게 만들어주거나 가장 작게 만들어줌
– Ex) 44223344
• 45012367
• 43987652
• 둘 중 더 가까운걸 선택
– 자리수를 한자리 늘려보거나 줄여보고 체크
• 시간 복잡도 : O(lgN)
12.
G. 변신로봇
• 변신을거듭하면서 원하는 상태를 만드는 가장 적은 비용을 찾는
문제
• 변신의 상태를 정점, 변신에 필요한 비용을 간선으로
• 정점에서 정점으로 가는 최단경로를 구하는 문제
• 다익스트라!
13.
G. 변신로봇
• 전처리로완전 그래프를 구성해주어야 함
– 시간초과 발생가능
– 무향 그래프이므로 전처리의 반복 횟수를 반으로 줄일 수 있음
• 시간 복잡도 : O(N^2lgN + N^2K) (N : 변신 상태 수, K : 부품길
이)
14.
H. 명탐정 준하
•모든 미술관과 흔적을 방문할 때 걸리는 최소 거리를 구하는 문제
• 각 좌표마다 이동거리는 항상 1로 같으므로 BFS로 해결
• 그래프 모델링
– 현재 위치, 지금까지 방문한 좌표들, 다음 방문할 미술관 번호를 정점으로
– 방문한 좌표는 bitmask를 사용!
– V[y][x][visit][no] => 4 * 5 * 2^20 * 20 ??
15.
H. 명탐정 준하
•지금까지 방문한 좌표를 알고 있으면 다음 방문할 미술관의 위치를
구할 수 있다
• V[y][x][visit][no] -> V[y][x][visit]!
• 4 * 5 * 2^20 * 20 -> 4 * 5 * 2^20
• 시간 복잡도 : O(yx2^(yx))
• 사실 이전의 모델로도 최적화를 잘 하면 정답을 받을 수 있다
– 테스트케이스 최적화
16.
I. 고급작품
• N* M의 도화지에 K개의 도장을 Q번 찍었을 때 도화지의 상태를 출력하는 문제
• 그때그때 그대로 도장을 찍는 경우의 시간 복잡도 : O(KHW + QHW + NM)
• 시간초과!
17.
I. 고급작품
• 도장을찍는 순서를 반대로 생각해보자
– 이미 도장이 찍혀있는 곳은 더 이상 덧씌워지지 않음
– 반복 횟수를 줄일 기회!
18.
I. 고급작품
• 도화지의세로좌표마다 가로 좌표들을 연결리스트로 저장한다면?
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
19.
I. 고급작품
• 도화지의세로좌표마다 가로 좌표들을 연결리스트로 저장한다면?
– 한번 찍은 좌표를 삭제하면 더 이상 참조하지 않음
– 하지만 특정 좌표에 접근하는데 필요한 반복이 최대 M번
– 시간 복잡도 : O(KHW + QH + NM^2 + NM)
20.
I. 고급작품
• 도화지의세로좌표마다 가로 좌표들을 이진탐색트리로 저장한다면?
1,2
1,4
1,6
1,71,51,1 1,3
21.
I. 고급작품
• 도화지의세로좌표마다 가로 좌표들을 이진탐색트리로 저장한다면?
– C++의 경우 set
– 특정 좌표에 접근하는데 필요한 반복이 최대 lgM번
– 시간 복잡도 : O(KHW + QH + NMlgM + NM)
• 아쉽게도 이진탐색트리에 저장하는 데이터 수가 많아 시간초과
• 최적화 할 수 있을까?