3차는 2차와 다르게 브론즈 문제 1개, 실버 문제 2개, 골드 문제 2개로 구성됩니다.
3차까지의 스코어보드를 확인하고, 문제 풀이를 적어보겠습니다.
3차 스코어보드
랭킹 | 아이디 | A | B | C | D | E | |
---|---|---|---|---|---|---|---|
1 | skuru | 1 / 1 | 1 / 4 | 7 / 176 | 1 / 37 | 1 / 80 | 5 / 298 |
2 | skysky_noob | 1 / 2 | 1 / 15 | 1 / 57 | 1 / 35 | 1 / -- | 4 / 109 |
3 | calmtot | 1 / 9 | 1 / 43 | 0 / -- | 0 / -- | 0 / -- | 2 / 52 |
4 | cws111204 | 3 / 46 | 1 / 50 | 1 / -- | 0 / -- | 0 / -- | 2 / 96 |
5 | skipperkim307 | 1 / 32 | 0 / -- | 0 / -- | 0 / -- | 0 / -- | 1 / 32 |
calmtot님은 이번에 깜짝 참가하셨습니다.
전체 순위
순위 | 아이디 | 맞힌 문제 / 페널티 |
---|---|---|
1 | skuru | 15 / 670 |
2 | skysky_noob | 12 / 339 |
3 | cws111204 | 6 / 406 |
4 | skipperkim307 | 5 / 420 |
문제 풀이
A. 단원평가
단순한 구현 문제입니다.
Python 코드
1 |
|
B. 그림 비교
두 그림을 뽑는 모든 경우에 대해 두 그림의 다른 칸 수를 세주면 됩니다.
Python 코드
1 |
|
C. 문장
1부터 999까지 모두 구해보면서 문장에 들어갈 수 있는 수를 찾으면 됩니다.
1부터 9까지, 11부터 19까지, 10부터 90까지 미리 구해 놓은 다음
백의 자리를 먼저 처리합니다.
십의 자리 + 일의 자리가 [11, 19]에 속한다면 예외처리 해 줍니다.
그리고 나머지를 처리하면 됩니다.
Python 코드
1 |
|
D. 이진수 변환
자연수 $x_0$의 비트 중 1의 개수가 $N$미만이면 수열 $X$는 존재하지 않습니다.
수열 $X$가 존재하는 경우에 대해 생각해 봅시다.
$x_n$에서 여러개의 비트를 껐고, 이게 차의 최댓값이라고 칩시다.
이때 $x_n$의 최상위 비트를 무조건 꺼야 합니다. $x_n$의 최상위 비트가 나머지 비트를 모두 합한 것보다 크기 때문입니다.
따라서 $x_n$의 최상위 비트를 단독으로 끄는 것이 $D(X)$의 최댓값을 최소화 하는 방법입니다.
$x_n$에서 여러개의 비트를 껐고, 이게 차의 최솟값이라고 칩시다.
이때 끈 비트들의 최댓값보다 작은 비트는 남지 않아야 합니다. 위와 비슷하게 작은 비트를 끄는 것이 더 작기 때문입니다.
따라서 가능한 최하위 비트들을 연속으로 많이 끄는 것이 $D(X)$의 최솟값을 최대화 하는 방법입니다.
최댓값을 최소화 하는 방법과 최솟값을 최대화 하는 방법이 서로 충돌하지 않으므로 최적해를 보장합니다.
Python 코드
1 |
|
E. 말이 되고픈 원숭이
조금 복잡한 bfs문제입니다. 나이트의 움직임이 꽤나 복잡하나, dx배열과 dy배열 테크닉을 이용하면
가독성을 살리면서 구현할 수 있습니다.
어떤 칸을 방문 했을 때 남은 나이트 이동 횟수가 많은 것이 유리하므로 남은 나이트 이동 횟수까지 모두 고려해 방문처리를 해주어야 합니다.
구현하기 귀찮아서 모든 나이트 이동 횟수를 따로 방문처리 해 주었습니다.
Python 코드
1 |
|