4차에서는 skysky_noob이 날뛰는 바람에 골드 문제가 3개나 출제되었습니다.
절대로 제 잘못이 아닙니다. 아무튼 그렇습니다.
4차 스코어보드
랭킹 | 아이디 | A | B | C | D | E | |
---|---|---|---|---|---|---|---|
1 | skysky_noob | 2 / 24 | 1 / 21 | 1 / 77 | 0 / -- | 0 / -- | 3 / 122 |
2 | skuru | 2 / 25 | 1 / 8 | 0 / -- | 5 / -- | 0 / -- | 2 / 33 |
3 | calmtot | 1 / 94 | 4 / 145 | 0 / -- | 0 / -- | 0 / -- | 2 / 239 |
4 | cws111204 | 3 / 45 | 0 / -- | 0 / -- | 0 / -- | 0 / \ – | 1 / 45 |
전체 순위
순위 | 아이디 | 맞힌 문제 / 페널티 |
---|---|---|
1 | skuru | 17 / 703 |
2 | skysky_noob | 15 / 461 |
3 | cws111204 | 7 / 451 |
4 | skipperkim307 | 5 / 420 |
문제 풀이
A. 컵라면 측정하기
피타고라스의 정리를 이용하면 높이를 구할 수 있습니다.
Python 코드
1 |
|
B. Three Dots
문제에서 점들이 모두 서로 다르다고 했으므로 집합을 이용해 $O(N^2)$에 해결할 수 있습니다.
두 점을 잡고, 차를 구해 나머지 한 점이 존재하는지 구하면 됩니다.
Python 코드
1 |
|
C. 전화번호 만들기
그룹을 지을 때, 각각의 그룹에는 반드시 2개나 3개의 숫자가 들어갑니다.
따라서 왼쪽부터 $i$번째 숫자까지 품질의 최대를 $dp[i]$라 하면
$dp[i]$는 $dp[i-2]$와 $dp[i-3]$을 이용해 구할 수 있습니다.
만약 최적의 답이 여러가지라면 사전순으로 가장 앞서는 것을 출력해야하는데,
하이픈이 가장 우선이므로 앞에서부터 최대한 하이픈을 일찍 넣으면 됩니다.
처음 주어진 번호를 뒤집고 나서 끝에서부터 역추적하면 정방향으로 답을 찾는 것과 같습니다.
따라서 번호를 뒤집고 나서, $dp$배열을 채웁니다. 이때 가능하면 그룹의 크기를 2로 하도록 하고 역추적 하면 됩니다.
아래 코드에서 $prev$배열은 $i$번째 숫자를 포함하는 그룹 이전의 그룹 끝 위치입니다.
예를 들어 그룹이 “50-88-638”으로 나눠진다면 $prev[3] = 1$이고, $prev[6] = 3$입니다.
따라서 $i = prev[i]$를 통해 이전 그룹으로 이동할 수 있습니다.
Python 코드
1 |
|
D. 만화에서 나오는 거 따라하고 그러면 안 된다
모든 정점에 대해 토카의 집에서부터 최단거리는 데이크스트라 알고리즘을 이용하면 $O(ElogE)$에 구할 수 있습니다. ($E$는 간선의 개수)
한별 선배의 경로를 찾기 위해서, 먼저 간선들을 간선 개수와 나무 번호로 내림차순 정렬합니다.
그리고 bfs를 통해 한별 선배의 집에서 학교까지 최단거리를 찾고, $prev$배열을 통해 그 경로를 역추적합니다.
한별 선배의 경로 중 토카가 가장 빨리 도착할 수 있는 나무가 답이 됩니다.
Python 코드
1 |
|
처음에 간선을 정렬하지 않고, 학교에서 한별 선배의 집으로 bfs를 통해 각 정점에서 학교까지의 은행나무 개수를 구하고 나서
한별 선배가 등교하는 규칙대로 역추적하는 방법도 있습니다.
걸리는 시간은 비슷한 것 같네요.
E. Overdose Runner
그냥 구현량이 많을 뿐인 시뮬레이션 문제입니다.
Monster 클래스와 Player 클래스를 만들고 플레이어의 행동을 전부 메소드로 처리했습니다.
Python 코드
1 |
|