๋ฌธ์
ํ์ด
1๏ธโฃ treeSet์ ์ด์ฉํ ํ์ด
๐ก ๋ ์ค๋ฅธ Idea
๊ตฌ์ญ์ ๊ฐ์๊ฐ 500000 ์ด๊ณ ์ฟผ๋ฆฌ์ ๊ฐ์๊ฐ 100000 ์ด๋ฏ๋ก
์ ํํ์์ ํ๊ฒ๋๋ฉด ์๊ฐ๋ณต์ก๋๊ฐ ์ต๋ 500000*100000 ์ผ๋ก ์ ๋ ํต๊ณผ ๋ชปํ๋ ์์น๊ฐ ๋์จ๋ค.
๋ฐ๋ผ์,treeSet
์ ์ด์ฉํ ํ์ด๊ฐ ํ์ํ๋ค.treeSet
์ ๋๋ถ๋ถ์ ๋ฉ์๋๋ log(N) ์ ์ฑ๋ฅ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.treeSet
์ ๋ช ์ ๋ฒํธ๋ฅผ ๊ฐฑ์ ํ๊ณ , ์ฟผ๋ฆฌ๋ฌธ์ ์ํํ๋ฉด์ ๋ํ์ด์ ์์น๋ ๊ฐฑ์ ํ๋ค.
๋ง์ฝ ๋ํ์ด์ ๊ฐ์ฅ ๊ฐ๊น์ด ์์น์ ๋ช ์ ๋ฒํธ๋ฅผ ์ฐพ๋ ๊ณผ์ ์,
์๊ณ ๋ฐฉํฅ ๊ธฐ์ค ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก,treeSet
์์ ๋ํ์ด์ ์์น๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๋ช ์๋ฅผ ๋จผ์ ํ์ํด๋ณธ๋ค. (ceiling
๋ฉ์๋ ์ฌ์ฉ)
๋ง์ฝ ๋ํ์ด๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๋ช ์๊ฐ ์๋ค๋ฉดtreeSet
์ ์ ์ผ ์ ์์๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ช ์๊ฐ ๋ ๊ฒ์ด๋ค.
๋ํ์ด๋ณด๋ค ๋ฒํธ ์ ์์ ์๋ ๋ช ์์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋์๋ (N - dohyun + ๋ช ์
) ๋ก ๊ตฌํด์ค๋ค.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int N = Integer.parseInt(input[0]), Q = Integer.parseInt(input[1]);
input = br.readLine().split(" ");
// ๋ช
์ ๋ฑ๋ก
TreeSet<Integer> places = new TreeSet<>();
for (int i = 0; i < N; i++) {
if (input[i].equals("1")) {
places.add(i + 1);
}
}
int doHyun = 1;
StringBuilder ans = new StringBuilder();
// ์ฟผ๋ฆฌ ์ํ
while (Q-- > 0) {
input = br.readLine().split(" ");
if (input[0].equals("3")) {
Integer ceiling = places.ceiling(doHyun);
int distance = 0;
// ๋ํ์ด ์์น ๋ค์ ๋ช
์๊ฐ ์๋ ๊ฒฝ์ฐ (rotate ํ์)
if (ceiling == null) {
// ๋ช
์๊ฐ ์๋ ๊ฒฝ์ฐ
if (!places.isEmpty()) {
ceiling = places.first();
distance = N - doHyun + ceiling;
// ๋ช
์๊ฐ ์์ ์๋ ๊ฒฝ์ฐ
} else {
distance = -1;
}
} else {
// ๋ํ์ด ๋ค์ ๋ช
์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ
distance = ceiling - doHyun;
}
ans.append(distance + "\n");
} else {
int num = Integer.parseInt(input[1]);
// ๋ช
์ ์ถ๊ฐ ํน์ ๋ณ๊ฒฝ
if (input[0].equals("1")) {
if (places.contains(num)) {
places.remove(num);
} else {
places.add(num);
}
// ๋ํ์ด ์ด๋
} else {
doHyun = (doHyun + num) % N;
if (doHyun == 0) {
doHyun = N;
}
}
}
}
System.out.println(ans);
}
}
๐ ํ๊ณ
์ด๋ฒ ๋ฌธ์ ๋ฅผ ํ๋ฉด์, treeSet
์ ๋์ ์๋ฆฌ๋ฅผ ์ ํ์
ํ ์ ์์๋ค.
ํนํ, ํน์ ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ์ฐพ๋ ceiling
๋ฉ์๋์
ํน์ ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ์ฐพ๋ floor
๋ฉ์๋๋ฅผ ์๊ฒ ๋์๋ค.