[ํ] 6. ๊ณต์ฃผ ๊ตฌํ๊ธฐ
์ค๋ช
์ ๋ณด ์๊ตญ์ ์ด์ ๋๋ผ ์ธ๋๋ธ ๊ณต์ฃผ๊ฐ ์ฒ์์ ๊ดด๋ฌผ์๊ฒ ์กํ๊ฐ์ต๋๋ค.
์ ๋ณด ์๊ตญ์๋ ์์๊ฐ N๋ช ์ด ์๋๋ฐ ์๋ก ๊ณต์ฃผ๋ฅผ ๊ตฌํ๋ฌ ๊ฐ๊ฒ ๋ค๊ณ ํฉ๋๋ค.
์ ๋ณด์๊ตญ์ ์์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ณต์ฃผ๋ฅผ ๊ตฌํ๋ฌ ๊ฐ ์์๋ฅผ ๊ฒฐ์ ํ๊ธฐ๋ก ํ์ต๋๋ค.
์์ ์์๋ค์ ๋์ด ์์ผ๋ก 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ์ฐจ๋ก๋ก ๋ฒํธ๋ฅผ ๋งค๊ธด๋ค.
๊ทธ๋ฆฌ๊ณ 1๋ฒ ์์๋ถํฐ N๋ฒ ์์๊น์ง ์์๋๋ก ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๋ฉฐ ๋๊ทธ๋๊ฒ ์๊ฒ ํ๋ค.
๊ทธ๋ฆฌ๊ณ 1๋ฒ ์์๋ถํฐ ์๊ณ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๋ฉฐ 1๋ถํฐ ์์ํ์ฌ ๋ฒํธ๋ฅผ ์ธ์น๊ฒ ํ๋ค.
ํ ์์๊ฐ K(ํน์ ์ซ์)๋ฅผ ์ธ์น๋ฉด ๊ทธ ์์๋ ๊ณต์ฃผ๋ฅผ ๊ตฌํ๋ฌ ๊ฐ๋๋ฐ์ ์ ์ธ๋๊ณ ์ ๋ฐ์ผ๋ก ๋์ค๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์์๋ถํฐ ๋ค์ 1๋ถํฐ ์์ํ์ฌ ๋ฒํธ๋ฅผ ์ธ์น๋ค.
์ด๋ ๊ฒ ํด์ ๋ง์ง๋ง๊น์ง ๋จ์ ์์๊ฐ ๊ณต์ฃผ๋ฅผ ๊ตฌํ๋ฌ ๊ฐ ์ ์๋ค.

์๋ฅผ ๋ค์ด ์ด 8๋ช ์ ์์๊ฐ ์๊ณ , 3์ ์ธ์น ์์๊ฐ ์ ์ธ๋๋ค๊ณ ํ์. ์ฒ์์๋ 3๋ฒ ์์๊ฐ 3์ ์ธ์ณ ์ ์ธ๋๋ค.
์ด์ด 6, 1, 5, 2, 8, 4๋ฒ ์์๊ฐ ์ฐจ๋ก๋๋ก ์ ์ธ๋๊ณ ๋ง์ง๋ง๊น์ง ๋จ๊ฒ ๋ 7๋ฒ ์์์๊ฒ ๊ณต์ฃผ๋ฅผ ๊ตฌํ๋ฌ๊ฐ๋๋ค.
N๊ณผ K๊ฐ ์ฃผ์ด์ง ๋ ๊ณต์ฃผ๋ฅผ ๊ตฌํ๋ฌ ๊ฐ ์์์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ์ค์ ์์ฐ์ N(5<=N<=1,000)๊ณผ K(2<=K<=9)๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ ์ค์ ๋ง์ง๋ง ๋จ์ ์์์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์์ ์ ๋ ฅ 1
8 3
์์ ์ถ๋ ฅ 1
7
<<ํ์ด>>
-๋์ ํ์ด-
๋๋ ์ผ๋จ Stack ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ๋ฌธ์ ๋ฅผ ์ ๊ทผํ์ง๋ง !! ๊ฒฐ๊ตญ ํ๋ ธ๋ค. while ๋ฃจํ์์ ๋น ์ ธ๋์ค์ง ๋ชปํ๋๋ฐ ๊ทธ ์ด์ ๋ count ๊ฐ 3์ด ๋์ด์ผ ๋ค์ ์งํ์ด ๋๋๋ฐ ๊ฐฏ์๊ฐ ๋ฐ์ดํฐ๊ฐ ๋๊ฐ ๋จ์์ ๋๋ count๊ฐ 3๊น์ง ๊ฐ์ง ๋ชปํด์ ๊ณ์ ๋น๋น ๋๋ ๊ฒ์ด๋ค.
์๊ณ ๋ณด๋ ํ๋ก ํ๋ฉด ํจ์ฌ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์์ ์ ์ ์์๋ค.
import java.util.*;
class Main{
private int solution(int n, int k) {
Stack<Integer> stack = new Stack<>();
ArrayList<Integer> list = new ArrayList<>();
int count = 0;
for(int i = 1; i <= n; i++) {
stack.push(i);
count++;
if(count == k) {
stack.pop();
count = 0;
}
}
while(stack.size() > 1) {
count = 0;
for(int x : stack) {
list.add(x);
}
stack.clear();
for(int m : list) {
stack.push(m);
count++;
if(count == k) {
stack.pop();
count = 0;
}
}
list.clear();
}
return stack.pop();
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
System.out.println(T.solution(n, k));
}
}
-๊ฐ์ฌ๋ ํ์ด-
Queue๋ก ํธ์ จ๋ค.
import java.util.*;
class Main{
private int solution(int n, int k) {
int answer = 0;
Queue<Integer> Q = new LinkedList<>();
for(int i = 1; i <= n; i++) Q.offer(i);
while(!Q.isEmpty()) {
for(int i = 1; i < k; i++) Q.offer(Q.poll());
Q.poll();
if(Q.size() == 1) answer = Q.poll();
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
System.out.println(T.solution(n, k));
}
}
Q์ ํน์ง์ธ ๋จผ์ ๋ค์ด ์จ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ ์ ์๊ณ ๊ทธ๋ ๊ธฐ์ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ฏ ์ํ์ ํ ์ ์๋ ๊ฒ์ด๋ค.
Q.offer(Q.poll());
๋ฐ๋ก ์ด๋ฐ์์ผ๋ก ๋ง์ด๋ค. ๊ทธ๋ ๊ฒ ์ธ์น๋ฉด ์์๋๋ ์ซ์ ์ ๊น์ง ์ํํ๊ณ ๊ทธ๋ค์ ๊ฐ์ poll() ์์ผ์ ์์์ํจ๋ค. ๊ทธ๋ฆฌ๊ณ Q์ ์ฌ์ด์ฆ๊ฐ 1์ผ ๋ answer ๋ณ์์ ๋ง์ง๋ง poll()์ ํด์ฃผ๋ฉด while๋ฌธ์ false๊ฐ ๋์ด ๋ฃจํ์์ ๋น ์ ธ๋์ค๊ฒ ๋๊ณ ๊ฐ์ return ํด์ค๋ค.
<<์ถ๊ฐ ๊ณต๋ถ>>
Queue
์ฐ์ , ํ๋ ์ธํฐํ์ด์ค ์ด๋ค. Stack๊ณผ ๋ฌ๋ฆฌ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ํ์ฅํ๊ธฐ ์ํด์ ์ธํฐํ์ด์ค๋ก ๋ง๋ค์๋ค๊ณ ํ๋ค!
๋ํ์ ์ธ ๊ตฌํ ์๋ฃ๊ตฌ์กฐ๋ LinkedList ์ด๋ค !
ํน์ง
- ๋จผ์ ๋ค์ด๊ฐ ์๋ฃ๊ฐ ๋จผ์ ๋์ค๋ FIFO(first in first out) ๊ตฌ์กฐ์ด๋ค.
- ํ๋ ํ ์ชฝ ๋์ front๋ก ์ ํ์ฌ ์ญ์ ์ฐ์ฐ๋ง ์ํํ๋ค.
- ๋ค๋ฅธ ํ ์ชฝ ๋์ rear๋ก ์ ํ์ฌ ์ฝ์ ์ฐ์ฐ๋ง ์ํํ๋ค.
- ๊ทธ๋ํ์ ๋์ด ์ฐ์ ํ์(BFS)์์ ์ฌ์ฉ๋๋ค.
- ์ปดํจํฐ ๋ฒํผ์์ ์ฃผ๋ก ์ฌ์ฉํ๊ณ ๋ง๊ตฌ ์ ๋ ฅ์ด ๋์์ผ๋ ์ฒ๋ฆฌ๋ฅผ ํ์ง ๋ชปํ ๋, ๋ฒํผ(ํ)๋ฅผ ๋ง๋ค์ด ๋๊ธฐ์ํจ๋ค.
๋ํ์ ์ธ ๋ฉ์๋
offer(x) -> ํ์ x๊ฐ์ ์ถ๊ฐํ๋ค.
poll() -> ๋จผ์ ๋ค์ด์จ ์์๋๋ก ๋๊ฐ๊ณ ์ฌ๋ผ์ง๋ค.
remove() -> ํ์ ์ฒซ๋ฒ์งธ ๊ฐ์ ์ ๊ฑฐํ๋ค.
clear() -> ํ์ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํ ์ํจ๋ค.
peek() -> ํ์ ์ฒซ๋ฒ์งธ๊ฐ ์ฐธ์กฐํ๋ค. (๋ฐ์ดํฐ๋ ์ฌ๋ผ์ง์ง ์๋๋ค)
isEmpty() -> ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด true๋ก ๋ฐํํ๋ค.
size() -> ๋ฐ์ดํฐ ๊ฐฏ์๋ฅผ ๋ฐํํ๋ค.