Skip to content

Commit 7b72553

Browse files
committed
feat: add solutions for 2025 R1
1 parent 9a546da commit 7b72553

File tree

10 files changed

+125
-10
lines changed

10 files changed

+125
-10
lines changed

pages/2025/round1_1.mdx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,13 @@ $N$개 중 서로 다른 $K$개의 버튼을 순서대로 누르면 자물쇠가
8080
## 해설
8181

8282
<Solution>
83-
준비 중입니다.
83+
$i$번째로 눌러야 하는 버튼 후보의 개수는 $N-i+1$개입니다.
84+
85+
처음으로 시도하는 후보의 경우, 이미 $i-1$개의 버튼이 눌러져 있으므로, $1$번만 추가로 누르면 됩니다.
86+
87+
나머지 $N-i$개의 후보들은 처음부터 $i$개의 버튼을 눌러야 하므로,
88+
$i$번째 버튼을 찾기 위해 눌러야 하는 총 횟수는 $i(N-i) + 1$입니다.
89+
90+
각 $1 \le i \le K$에 대해, $i(N-i)+1$의 합을 계산하면 정답을 구할 수 있습니다.
91+
시간 복잡도는 $\mathcal{O}(K)$가 됩니다.
8492
</Solution>

pages/2025/round1_10.mdx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,5 +137,12 @@ $2$번의 작살질로 총 $3$마리의 물고기를 잡을 수 있다.
137137
## 해설
138138

139139
<Solution>
140-
준비 중입니다.
140+
어떤 격자칸에서 작살을 사용할 때 물고기를 잡는 칸들을 모두 하나의 그룹으로 묶습니다.
141+
이제, 각 그룹에 대해 독립적으로 문제를 해결할 수 있습니다.
142+
143+
각 그룹은 $45$도 기울어진 격자판의 형태를 갖습니다.
144+
격자판의 높이가 $N / (K+1)$으로 매우 작음에 유의해야 합니다.
145+
146+
각 그룹에서 물고기가 있는 칸들을 $2 \times 2$ 크기의 정사각형으로 커버하는 문제를 해결해야 합니다.
147+
이는 각 열에 대해 어떤 칸들이 이미 커버되었는지를 bitmask로 관리하는 DP로 해결할 수 있습니다.
141148
</Solution>

pages/2025/round1_2.mdx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,15 @@ $A_1, A_2, \cdots, A_{2N}$이 공백으로 구분되어 주어진다.
169169
## 해설
170170

171171
<Solution>
172-
준비 중입니다.
172+
두 사람으로 구성된 팀의 점수가
173+
$$
174+
(A_i + A_j - \vert A_i - A_j \vert) \times \left\lfloor \frac{\min(A_i,A_j)}{M} \right\rfloor
175+
$$
176+
로 계산될 때, 점수의 합이 최대가 되도록 $N$개의 팀을 구성하는 문제입니다.
177+
178+
$A_i + A_j - \vert A_i - A_j \vert$는 $2\times \min(A_i,A_j)$와 같으므로,
179+
팀의 점수는 두 사람의 플레이 가능 시간 중 더 작은 값으로만 결정된다는 것을 알 수 있습니다.
180+
181+
이 경우, $2N$명의 사람을 플레이 가능 시간에 대한 오름차순으로 정렬한 뒤,
182+
인접한 두 명씩 묶는 것으로 팀 점수의 합을 최대화할 수 있습니다.
173183
</Solution>

pages/2025/round1_3.mdx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,17 @@ $A_{i+1} - A_i = 1$임을 뜻한다.
8787
## 해설
8888

8989
<Solution>
90-
준비 중입니다.
90+
주어진 문제는 공차가 $1$인 등차수열을 만들기 위해 각 항을 그대로 두거나, $\pm 1$을 더하는 연산을 수행하여,
91+
연산 횟수를 최소화하는 것을 목표로 합니다.
92+
93+
이를 해결하기 위해 먼저 주어진 수열의 각 항에서 해당 인덱스를 빼서 새로운 수열로 변환합니다.
94+
이 변환된 수열의 각 항은 초기값에서 인덱스를 뺀 값으로 정의되며,
95+
이를 통해 문제를 "모든 항을 같은 값으로 만드는 문제"로 변형할 수 있습니다.
96+
97+
수열의 모든 수를 어떤 수 $x$로 만든다고 하면, 수열의 모든 수는 $x-1$ 이상 $x+1$ 이하여야 합니다.
98+
그리고 수열의 모든 수를 $x$로 만들기 위한 연산 횟수는 수열에서 $x$가 아닌 수의 개수가 됩니다.
99+
100+
가능한 $x$의 종류 수가 최대 $3$개이므로,
101+
가능한 모든 $x$ 후보에 대해 연산 횟수를 구하고 그중 가장 작은 값이 답이 됩니다.
102+
이 문제를 해결하기 위한 시간 복잡도는 $\mathcal{O}(N)$ 입니다.
91103
</Solution>

pages/2025/round1_4.mdx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,5 +143,8 @@ small
143143
## 해설
144144

145145
<Solution>
146-
준비 중입니다.
146+
먼저 어떤 문자열이 이모티콘으로 대체되는지 판별해야 합니다.
147+
이는 콜론 문자가 등장할 때마다 현재까지의 문자열이 `:이모티콘-이름:` 형식으로 끝나는지 검사하면 됩니다.
148+
149+
이후에는 $L$글자마다 줄바꿈을 해야 한다는 사실에 유의하면서 각 문자를 출력합니다.
147150
</Solution>

pages/2025/round1_5.mdx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,5 +128,17 @@ export default ({ children }) => (
128128
## 해설
129129

130130
<Solution>
131-
준비 중입니다.
131+
이 문제는 두 가지 방호복 패턴($0 \rightarrow 1 \rightarrow 0 \rightarrow 1 \cdots$ 또는
132+
$1 \rightarrow 0 \rightarrow 1 \rightarrow 0 \cdots$) 중 하나를 선택해 가능한 섬들을
133+
차례로 방문하며 최소 갈아입기 횟수를 찾는 방식으로 풀 수 있습니다.
134+
135+
주어진 선후 관계로 각 섬의 진입 차수를 계산한 뒤, 위상 정렬과 비슷하게 동작하는 큐 두 개를 준비합니다.
136+
하나는 자외선 위험이 $0$인 섬, 다른 하나는 $1$인 섬을 저장하며, 시작할 때 진입 차수가 $0$인 섬들을 각각 해당 큐에 넣습니다.
137+
138+
이후 현재 방호복 색($0$ 또는 $1$)에 맞는 큐에서 가능한 모든 섬을 꺼내 방문하고,
139+
섬을 방문할 때마다 연결된 다음 섬들의 진입 차수를 줄이며, $0$이 되면 해당 섬의 자외선 종류에 맞는 큐에 넣습니다.
140+
현재 색 큐가 비었을 때만 색을 바꾸고, 다른 큐에서 이어서 진행합니다.
141+
142+
이 과정을 $0$으로 시작하는 경우와 $1$로 시작하는 경우 각각 실행해 나온 비용을 비교해 더 작은 값이 답이 되며,
143+
시간 복잡도는 위상 정렬과 동일한 $\mathcal{O}(N+M)$입니다.
132144
</Solution>

pages/2025/round1_6.mdx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,22 @@ $B$에서 뽑은 부분 수열은 $[2, 4, 4, 1]$이다.
9494
## 해설
9595

9696
<Solution>
97-
준비 중입니다.
97+
길이가 각각 $N$과 $M$인 두 수열 $A, B$에서 같은 값이 최대 3번씩 등장할 때,
98+
같은 위치에 있는 값이 일치하는 횟수가 최대가 되도록 각 수열에서 길이가 같은 연속 부분 수열을 선택하는 문제입니다.
99+
100+
두 부분 수열의 시작 위치 $i, j$와 길이 $k$가 있을 때, 어떤 위치에서 값이 일치하기 위해서는 원본 수열에서
101+
$A_{i+t} = B_{j+t}$ ($1 \le t \le k$)가 성립해야 합니다.
102+
103+
따라서 원본 수열에서 인덱스의 차이 $d = (i+t) - (j+t) = i-j$가 일정한 쌍의 개수를 구해 놓으면,
104+
시작 위치가 $d$만큼 차이나는 부분 수열을 선택할 때의 횟수, 즉
105+
$$
106+
D(d+1, 1, \ast), D(d+2, 2, \ast), D(d+3, 3, \ast) \cdots
107+
$$
108+
들의 최댓값을 한 번에 알아낼 수 있습니다.
109+
110+
결국 값이 같으면서 인덱스 차이가 $d$인 쌍의 수를 모든 $-M < d < N$에 대해 구하면 문제를 해결할 수 있습니다.
111+
두 수열 $A, B$를 통틀어서 같은 값이 최대 3번 등장하므로 $\mathcal{O}(N+M)$ 시간에 모든 쌍을 찾을 수 있습니다.
112+
113+
**Challenge:** 같은 값이 최대 $3$번만 등장한다는 조건이 없을 때 $\mathcal{O}\left( (N+M)^2 \right)$보다
114+
빠르게 해결할 수 있을까요?
98115
</Solution>

pages/2025/round1_7.mdx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,5 +199,16 @@ $K = 0$이다.
199199
## 해설
200200

201201
<Solution>
202-
준비 중입니다.
202+
$i$번째 아이템의 기여도를
203+
$$
204+
V_i := s_i\cdot w_S + d_i\cdot w_D + h_i\cdot w_H
205+
$$
206+
로 정의하면, 같은 부위에 속하고 같은 세트인 두 아이템에 대해서는 항상 $V$가 더 큰 쪽을 택하는 것이 유리합니다.
207+
208+
따라서 각 세트별로 “그 세트의 아이템을 해당 부위에 장착할 때” 최적 아이템(즉 그 부위에서 $V$가 최대인 아이템)을
209+
미리 고정할 수 있고, 이후에는 각 세트마다 어떤 부위들을 그 세트로 채울지(즉 해당 세트의 아이템을 장착할 부위들의 부분집합)를
210+
결정하는 문제로 환원됩니다.
211+
212+
세트별로 부위를 선택하는 모든 경우를 부분집합(bitmask)으로 순회하는 비트마스크 DP를 적용하면 전체 문제를 해결할 수 있으며,
213+
이를 정리하면 총 시간 복잡도 $\mathcal{O}\left( N + M \times 3^{k} \right)$에 문제를 해결할 수 있습니다.
203214
</Solution>

pages/2025/round1_8.mdx

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,5 +157,30 @@ $P = 0$이다.
157157
## 해설
158158

159159
<Solution>
160-
준비 중입니다.
160+
아이템을 획득할 때마다 이동할 수 있는 최대 거리가 증가할 때, 시작점에서 도착점으로 가는 최단 거리를 찾는 문제입니다.
161+
162+
아이템이 없는 경우($K = 0;$ 미션 3, 4)에는 그래프에서 최단 경로를 찾는 것과 똑같이 생각할 수 있고,
163+
너비 우선 탐색(BFS)을 이용해 문제를 해결할 수 있습니다.
164+
165+
아이템이 존재하는 상황에서는 각 아이템을 최대 한 번만 획득할 수 있기 때문에, 아이템을 획득할 때마다
166+
맵이 변하는 것을 반영해야 합니다. 예를 들어 아이템이 하나만 있는 경우($K = 1;$ 미션 5, 6)에는 다음과 같이
167+
거리 배열을 정의하여 너비 우선 탐색을 이용해 문제를 해결할 수 있습니다.
168+
* $D(i, j, 0)$: 아이템을 획득하지 않고 $(i, j)$로 이동하기 위한 최단 거리
169+
* $D(i, j, 1)$: 아이템을 획득하고 $(i, j)$로 이동하기 위한 최단 거리
170+
171+
아이템이 더 많이 존재할 때는 "지금까지 획득한 아이템의 집합"을 함께 관리해야 합니다.
172+
즉, 아이템이 없을 때는 거리 배열에서 $NM$개, 아이템이 하나일 때는 $2 \times NM$개의 상태를 관리했다면,
173+
아이템이 $K$개일 때는 $2^K \times NM$개의 상태를 관리해야 합니다.
174+
$K \le 15$ 정도로 아이템이 많지 않은 경우(미션 1, 2, 7)에는 $2^K \times NM$개의 상태를 모두 보는 것으로
175+
$1$초 안에 답을 구할 수 있습니다.
176+
177+
$K > 15$로 아이템이 많은 경우(미션 8, 9, 10)에는 크기가 $2^K \times NM$인 배열을 선언하기 힘들기 때문에
178+
다른 방법을 생각해야 합니다.
179+
다양한 방법이 있지만, $10$초 안에 만점을 받을 수 있는 쉬운 방법 $2$개를 소개합니다.
180+
두 방법 모두 일직선으로 연속한 길의 길이가 별로 길지 않음을 이용합니다.
181+
182+
* 무작위로 아이템 $10$개를 선택한 뒤 $K = 10$인 문제를 해결하는 것을 여러 번 반복
183+
* 시작점과 멀리 있으면서 도착점과 가까운 아이템을 일부 삭제한 뒤 외판원 순회 문제(traveling salesman problem)처럼
184+
$\mathcal{O}\left( 2^K \times K^2 \right)$ 시간에 해결
185+
161186
</Solution>

pages/2025/round1_9.mdx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,5 +143,15 @@ $1000$은 `천`, $1\,0000$은 `일만`으로 읽음에 유의하라.
143143
## 해설
144144

145145
<Solution>
146-
준비 중입니다.
146+
어떤 한글 문자열이 어떤 자연수를 문제에 주어진 방식대로 읽었을 때의 문자열이라면,
147+
그 문자열을 “좋은 문자열”이라고 합시다.
148+
149+
“좋은 문자열”의 접두사들 역시 “좋은 문자열”이 된다는 것을 관찰할 수 있습니다.
150+
어떤 문자열 $X$에 대해, 한글로 읽었을 때 $X$를 접두사로 가지는 $1$ 이상 $N$ 이하의 자연수의 개수를
151+
계산할 수 있는 함수를 $\mathcal{O}(\log N)$에 구현할 수 있습니다.
152+
153+
해당 함수를 사용하여 사전 순으로 정확히 $K$번째가 되는 문자열의 각 자리를 순서대로 확정할 수 있습니다.
154+
이때, 끝에 붙는 “주년”의 처리에 주의합니다.
155+
156+
총 시간 복잡도 $\mathcal{O}\left( \log ^2 N \right)$에 문제를 해결할 수 있습니다.
147157
</Solution>

0 commit comments

Comments
 (0)