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

2017 cupc solution

  • 1.
  • 2.
    A. 전북대학교 * ** * * _ _ * _ * _ * * _ _ _ * * * * * * * * _ _ _ * _ _ *_ * _ *_ _ _ * *_ _ _ _ _ * 2 1 1 3 3 2 1 1 3 5 <CASE 5> <CASE 7> N/2 2*i-1 N i 0 1 2 3 i>0
  • 3.
    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) • 아쉽게도 이진탐색트리에 저장하는 데이터 수가 많아 시간초과 • 최적화 할 수 있을까?
  • 22.
    I. 고급작품 • 도화지의세로좌표마다 가로 좌표들을 범위로 저장한다면? 1,1~10
  • 23.
    I. 고급작품 • 도화지의세로좌표마다 가로 좌표들을 범위로 저장한다면? – (1,3) ~ (1,8)에 도장 찍음 1,1~2 1,9~10
  • 24.
    I. 고급작품 • 도화지의세로좌표마다 가로 좌표들을 범위로 저장한다면? – 여전히 이진탐색트리를 이용할 수 있음 – 이진탐색트리에 들어가는 데이터의 최대 수는 M / 2개 • 시간 복잡도 : O(KHW + QH + NMlgM + NM)