๋ฌธ์
https://www.acmicpc.net/problem/2164
ํ์ด ๊ณผ์
์ด ๋ฌธ์ ์์ ๋งํ๋ ์นด๋๋ฅผ ์๊ณ ๋ฒ๋ฆฌ๋ ์์ ์ ์ํํ๊ธฐ ์ํด์๋ ํ(Queue) ํํ์ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
์ด๋ฏธ ํ์ ๋ํด์๋ ์์ ๋ฌธ์ ์์ ์ค๋ช ํ์์ผ๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ .
<BOJ - [Array - 10845 ํ] - Silver IV๐ฅ>
https://hoshi2710.github.io/๋ฐฑ์ค/10845.html
์ด๋ฌธ์ ์์ ๋ฐ๋ณต๋๋ ์์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ ์ผ ์ ์นด๋๋ฅผ ๋ฒ๋ฆฐ๋ค.
- ๊ทธ๋ค์์นด๋๋ฅผ ์ ์ผ ๋ค๋ก ๋ณด๋ธ๋ค.
์ด ์์ ์ ๊ทธ๋๋ก ํ๋ก ๊ตฌํํ๋ฉด ์ฝ๊ฒ ํ ์์๋ ๋ฌธ์ ๋ค.
๊ทธ๋ฌ๋ ๋๋ ์ด ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ ์ ์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ๋ฅผ ํ์ธํ์ง ์๊ณ ์ ๊ทผ ํ๊ธฐ์ ์กฐ๊ธ ๋ค๋ฅธ ํ๋จ์ ํ๋ค.
์ด ๋ฌธ์ ์์ ์ฃผ์ด์ง ์๋ฃ๋ฅผ ์ผ์ผํ ์ฎ๊ธฐ๊ณ ์ง์ฐ๊ณ ํ๋ ์์ ์ ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ฉด ์๊ฐ์ด ํจ์ฌ ์ค๋ ๊ฑธ๋ฆฌ์ง ์์๊น?
์ง๊ธ์์ ๋ณด๋ฉด ๋ง์ด ๋ถ์กฑํ ์๊ฐ์ด์๋ค๋ ํ๋จ์ด ๋ ๋ค. ์๊ฐ์ ํ์ด 2์ด์ ๋๋ฉด ๊ฝค๋ ๋๋ํ๊ฒ ์ฃผ์ด์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ฌ์ฉํ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์
์ผ๋จ ๋ด๊ฐ ๊ตฌํํ ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ๊ฐ๋ค. (์นด๋ ๊ฐฏ์ = n)
- n์ 2๋ก ๋๋๋ค. (์ ์์ ์ค ์นด๋๋ฅผ ๋ฒ๋ฆฌ๊ณ ๋ค๋ก ๋ณด๋ด๋ ์์ ๋์ฒด) ๊ทธ๋ค์ \(2^0\)์ ๊ฐ์ ๋ณ๋์ ๋ณ์(์ดํ A๋ผ ์ง์นญ) ์ ๋ํ๊ธฐ (\(2^0\)์์ 0์ ๋ฐ๋ณต์์ ์ด ์ด๋ฃจ์ด์ง ํ์๋ฅผ ์๋ฏธ, 0๋ถํฐ ์์)
- ๋๋๊ธฐ ์ ๊ฐ์ด ํ์๋ผ๋ฉด ์ฒซ๋ฒ์งธ ์์ ์์ ์นด๋๋ฅผ ๋ฒ๋ฆฌ๊ธฐ๊น์ง๋ง ํ๊ณ ๋ค๋ก ๋ณด๋ด๋ ์์ ์ ์ํ ์ํ๊ฒ ์ด๋ฏ๋ก ๋ค์ ์์ ์์๋ ์์ ์ ๊ฑฐ๊พธ๋ก(์ญ๋ฐฉํฅ) ํ๋ ๊ฒ์ผ๋ก ๊ธฐ์ต. ( ์ง์๋ฉด ๊ทธ๋๋ก ์์ )
- ์ด๋ฒ์๋ n์ ๋๋๋๋ฐ ๋ง์ฝ ์์์ ์์ ์ ๊ฑฐ๊พธ๋ก ํ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ก ๋์๋ค๋ฉด 1๋ฒ์์ ๋๋ ๊ฐ์ 1์ ๋ํ๊ณ ๋ค์ 2๋ก ๋๋๋ค. (์ ๋ฐฉํฅ์ด๋ฉด 1๋ฒ๊ณผ ๋์ผํ ์์ ์งํ)
- 2๋ฒ๊ณผ ๋์ผํ ์กฐ๊ฑด๊ธฐ์ค์ผ๋ก ์ญ๋ฐฉํฅ, ์ ๋ฐฉํฅ์ ํ๋จํ๊ณ , ์ฌ๊ธฐ์ ์ถ๊ฐ์กฐ๊ฑด์ผ๋ก 3๋ฒ ์์ ์ด ์ญ๋ฐฉํฅ์ธ์ง ์ ๋ฐฉํฅ์ธ์ง ํ์ธํ ์๋ ์ฒ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๋์ถ(XOR ์ฐ์ฐ)
2๋ฒ ๊ธฐ์ค | 3๋ฒ ์์ ๋ฐฉํฅ | ๋ค์ ์์ ๋ฐฉํฅ |
---|---|---|
์ ๋ฐฉํฅ | ์ ๋ฐฉํฅ | ์ ๋ฐฉํฅ |
์ ๋ฐฉํฅ | ์ญ๋ฐฉํฅ | ์ญ๋ฐฉํฅ |
์ญ๋ฐฉํฅ | ์ ๋ฐฉํฅ | ์ญ๋ฐฉํฅ |
์ญ๋ฐฉํฅ | ์ญ๋ฐฉํฅ | ์ ๋ฐฉํฅ |
- 3๋ฒ๊ณผ 4๋ฒ์์ ์ ๋๋๋ ๊ฐ์ด 1๋ณด๋ค ๊ฐ์ด ํฐ ๋์ ๊ณ์ ๋ฐ๋ณตํ๋ค.
- 1๋ฒ์์ ์ธ๊ธํ ๋ณ๋์ ๋ณ์ A๋ฅผ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์ถ๋ ฅํ๋ค.
๋จ์๊ธ ๋ก๋ง ํํํ์๋ ๋ด๊ฐ ์ ์์ง๋ง ์ดํดํ๊ธฐ ์ด๋ ค์ด๊ฒ ๊ฐ๋ค. ๊ทธ๋๋ง ์ฝ๊ฒ ์์ฝํ๋ฉด
์ด ์๊ณ ๋ฆฌ์ฆ์์๋ ์ ๋ฌธ์ ๋ฅผ ์นด๋๋ฅผ ๋ฒ๋ฆฌ๊ณ ์๋ ์์ ์ผ๋ก ์นด๋๊ฐ ํ๋ฐํด ์ํํ์๋๋ฅผ ํ ๋จ์๋ก ์ก์ ์ฐ์ฐ์ ์งํํ๋๋ก ํ์๋ค.
๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์ด๋ ๊ฒ ๋๊ณ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main
{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()),gap = 1,result = 1;
boolean reverse = false;
for(int count=n; count > 1; gap*=2) {
int beforeCount = count;
if(!reverse) {
count /= 2;
result += gap;
}
else {
count = (count+1)/2;
}
reverse ^= (beforeCount%2 == 1);
}
bw.write(Integer.toString(result)+"\n");
bw.flush();
bw.close();
}
}
ํ(Queue)๋ฅผ ์ด์ฉํ ํ์ด๋ฐฉ๋ฒ ๊ณผ์ ๋น๊ต
ํ์ ํ์ฉํด์ ํ์์๋ ๋จผ์ N๊ฐ์ ์นด๋๋ฅผ ๋ชจ๋ ๋ฒ๋ฆฌ๊ณ ๋ค๋ก๋๊ธฐ๋ ์์ ์ ์งํํ๊ณ ๋๋ต N/2๊ฐ์ ์นด๋๋ฅผ ๋์ผํ ์์ ์ ๋ฐ๋ณตํ๋ค.
๋ฐ๋ฉด ๋ด๊ฐ ์งํํ ์ผ์ข ์ ๋ถํ ์ ๋ณต๋ฒ์ผ๋ก ํ์๋ ์นด๋์ ํด๋นํ๋ ์๋ฃ๋ฅผ ์ง์ ์ ๊ทผํ์ง ์๊ณ ํ ์ ๊ทผ๋ฒ์์ N,N/2,N/4 โฆ ์ฉ์ผ๋ก ์นด๋์ ๊ฐฏ์๋ง ๊ณ์ฐํด์ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ค.
๋ฐ๋ผ์ ๋ ๋ฐฉ๋ฒ์ ๊ฐ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํํ์๋ ๋๋ต์ ์ธ ์๊ฐ ๋ณต์ก๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ ํ์ฉ : \(O(n \times log(n))\)
- ๋ถํ ๋ฒ ํ์ฉ : \(O(log(n))\)
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๊ฐ ์๋ํ ๋ฐฉ๋ฒ์ผ๋ก ํผ๊ฒ์ ์๋๊ธด ํ๋, ํจ์จ ์ธก๋ฉด์์๋ง ๋ดค์๋๋ ์์์ ์ค๋ช ํ ์๊ณ ๋ฆฌ์ฆ์ด ์๋์ ์ผ๋ก ๋ ํจ์จ์ ์ด์์์ ํ์ธํ ์ ์์๋ค.