๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/15787
โธ ๋ฌธ์
N๊ฐ์ ๊ธฐ์ฐจ๊ฐ ์ด๋ ์ ํค์น๊ณ ์ํ์๋ฅผ ๊ฑด๋๋ ค๊ณ ํ๋ค.
๊ธฐ์ฐจ๋ 20๊ฐ์ ์ผ๋ ฌ๋ก ๋ ์ข์์ด ์๊ณ , ํ ๊ฐ์ ์ข์์๋ ํ ๋ช ์ ์ฌ๋์ด ํ ์ ์๋ค.
๊ธฐ์ฐจ์ ๋ฒํธ๋ฅผ 1๋ฒ๋ถํฐ N๋ฒ์ผ๋ก ๋งค๊ธธ ๋, ์ด๋ ํ ๊ธฐ์ฐจ์ ๋ํ์ฌ M๊ฐ์ ๋ช ๋ น์ด ์ฃผ์ด์ง๋ค.
๋ช ๋ น์ ์ข ๋ฅ๋ 4๊ฐ์ง๋ก ๋ค์๊ณผ ๊ฐ๋ค.
- 1 i x : i๋ฒ์งธ ๊ธฐ์ฐจ์(1 ≤ i ≤ N) x๋ฒ์งธ ์ข์์(1 ≤ x ≤ 20) ์ฌ๋์ ํ์๋ผ. ์ด๋ฏธ ์ฌ๋์ด ํ์๋ค๋ฉด , ์๋ฌด๋ฐ ํ๋์ ํ์ง ์๋๋ค.
- 2 i x : i๋ฒ์งธ ๊ธฐ์ฐจ์ x๋ฒ์งธ ์ข์์ ์์ ์ฌ๋์ ํ์ฐจํ๋ค. ๋ง์ฝ ์๋ฌด๋ ๊ทธ์๋ฆฌ์ ์์์์ง ์์๋ค๋ฉด, ์๋ฌด๋ฐ ํ๋์ ํ์ง ์๋๋ค.
- 3 i : i๋ฒ์งธ ๊ธฐ์ฐจ์ ์์์๋ ์น๊ฐ๋ค์ด ๋ชจ๋ ํ์นธ์ฉ ๋ค๋ก๊ฐ๋ค. k๋ฒ์งธ ์์ ์ฌ๋์ k+1๋ฒ์งธ๋ก ์ด๋ํ์ฌ ์๋๋ค. ๋ง์ฝ 20๋ฒ์งธ ์๋ฆฌ์ ์ฌ๋์ด ์์์์๋ค๋ฉด ๊ทธ ์ฌ๋์ ์ด ๋ช ๋ น ํ์ ํ์ฐจํ๋ค.
- 4 i : i๋ฒ์งธ ๊ธฐ์ฐจ์ ์์์๋ ์น๊ฐ๋ค์ด ๋ชจ๋ ํ์นธ์ฉ ์์ผ๋ก๊ฐ๋ค. k๋ฒ์งธ ์์ ์ฌ๋์ k-1 ๋ฒ์งธ ์๋ฆฌ๋ก ์ด๋ํ์ฌ ์๋๋ค. ๋ง์ฝ 1๋ฒ์งธ ์๋ฆฌ์ ์ฌ๋์ด ์์์์๋ค๋ฉด ๊ทธ ์ฌ๋์ ์ด ๋ช ๋ น ํ์ ํ์ฐจํ๋ค.
M๋ฒ์ ๋ช ๋ น ํ์ 1๋ฒ์งธ ๊ธฐ์ฐจ๋ถํฐ ์์๋๋ก ํ ๊ธฐ์ฐจ์ฉ ์ํ์๋ฅผ ๊ฑด๋๋๋ฐ ์กฐ๊ฑด์ด ์๋ค.
๊ธฐ์ฐจ๋ ์์๋๋ก ์ง๋๊ฐ๋ฉฐ ๊ธฐ์ฐจ๊ฐ ์ง๋๊ฐ ๋ ์น๊ฐ์ด ์์ ์ํ๋ฅผ ๋ชฉ๋ก์ ๊ธฐ๋กํ๋ฉฐ ์ด๋ฏธ ๋ชฉ๋ก์ ์กด์ฌํ๋ ๊ธฐ๋ก์ด๋ผ๋ฉด ํด๋น ๊ธฐ์ฐจ๋ ์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด, ๋ค์ ๊ทธ๋ฆผ์ ์๋ก ๋ค์์ ๋, 1๋ฒ์งธ ๊ธฐ์ฐจ์ ๊ฐ์ด ์น๊ฐ์ด ์์ ์ํ๋ ๊ธฐ๋ก๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ํ์๋ฅผ ๊ฑด๋ ์์๋ค. 2๋ฒ์งธ ๊ธฐ์ฐจ์ ๊ฐ์ ์ํ๋ ๊ธฐ๋ก๋์ง ์์๊ธฐ ๋๋ฌธ์ 2๋ฒ์งธ ๊ธฐ์ฐจ๋ ์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ค. 3๋ฒ์งธ ๊ธฐ์ฐจ๋ 1๋ฒ์งธ ๊ธฐ์ฐจ์ ์น๊ฐ์ด ์์ ์ํ๊ฐ ๊ฐ์ผ๋ฏ๋ก ์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ค.
์ฒ์์ ์ฃผ์ด์ง๋ ๊ธฐ์ฐจ์๋ ์๋ฌด๋ ์ฌ๋์ด ํ์ง ์๋๋ค.
์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ ๊ธฐ์ฐจ์ ์๋ฅผ ์ถ๋ ฅํ์์ค.
โธ ์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์ ๊ธฐ์ฐจ์ ์ N(1 ≤ N ≤ 100000)๊ณผ ๋ช ๋ น์ ์ M(1 ≤ M ≤ 100000)๊ฐ ์ฃผ์ด์ง๋ค. ์ดํ ๋ ๋ฒ์งธ ์ค๋ถํฐ M+1๋ฒ์งธ ์ค๊น์ง ๊ฐ ์ค์ ๋ช ๋ น์ด ์ฃผ์ด์ง๋ค.
โธ ์ถ๋ ฅ
์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ ๊ธฐ์ฐจ์ ์๋ฅผ ์ถ๋ ฅํ์์ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ์ค๋ฒ 2
- ๐ ๋ฌธ์ ์ ํ : ๊ตฌํ, ๋นํธ๋ง์คํน
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
๋นํธ ๋ง์คํน์ ํ์ฉํ๋ฉด ๊ฐ ๊ธฐ์ฐจ์ ์ข์ ์ํ๋ฅผ 20๋นํธ ์ ์๋ก ํจ์จ์ ์ผ๋ก ํํํ ์ ์๋ค.
๊ฐ ๋ช ๋ น์ ๋ฐ๋ฅธ ์ฐ์ฐ์ ๋นํธ ์ฐ์ฐ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
๐ฏ ๋ช ๋ น๋ณ ๋นํธ ๋ง์คํน ์ฐ์ฐ
๋ช ๋ น 1
- 1 i x : i๋ฒ์งธ ๊ธฐ์ฐจ์ x๋ฒ์งธ ์ข์์ ์ฌ๋์ ํ์ฐ๊ธฐ
- trains[i] |= (1 << x);
- ์ด๋, ์ข์์ ๋ฒํธ๋ 1๋ถํฐ ์์ํ์ง๋ง ๋นํธ ๋ง์คํน์ ์ธ๋ฑ์ค๋ 0๋ถํฐ ์์ํ๋ฏ๋ก x๋ฅผ ์ ๋ ฅ๋ฐ์ผ๋ฉด์ -1์ ํด์ค๋ค.
๋ช ๋ น 2
- 2 i x : i๋ฒ์งธ ๊ธฐ์ฐจ์ x๋ฒ์งธ ์ข์์ ์์ ์ฌ๋์ ํ์ฐจ์ํค๊ธฐ
- trains[i] &= ~(1 << x);
- ~ ์ฐ์ฐ์ผ๋ก ํด๋น ๋นํธ๋ฅผ 0์ผ๋ก ๋ง๋ ํ, AND ์ฐ์ฐ์ผ๋ก ์ ๊ฑฐํ๋ค.
๋ช ๋ น 3
- 3 i : i๋ฒ์งธ ๊ธฐ์ฐจ์ ์์์๋ ์น๊ฐ๋ค์ ๋ชจ๋ ํ ์นธ์ฉ ๋ค๋ก ์ด๋
- trains[i] = (trains[i] << 1) & ((1 << 20) - 1);
- << ์ฐ์ฐ์ ์ฌ์ฉํด ์ผ์ชฝ์ผ๋ก ๋ฐ๊ณ , 21๋ฒ์งธ ๋นํธ๋ & ์ฐ์ฐ์ผ๋ก ์ ๊ฑฐํ๋ค.
๋ช ๋ น 4
- 4 i : i๋ฒ์งธ ๊ธฐ์ฐจ์ ์์์๋ ์น๊ฐ๋ค์ ๋ชจ๋ ํ ์นธ์ฉ ์์ผ๋ก ์ด๋
- trains[i] = trains[i] >> 1;
- ์ค๋ฅธ์ชฝ ์ฌํํธ๋ ์๋์ผ๋ก ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ๋นํธ๊ฐ ๋ฒ๋ ค์ง๋ค.
๋ชจ๋ ๊ธฐ์ฐจ์ ์ํ๋ 20๋นํธ ์ ์๋ก ํํ๋๋ฏ๋ก, ์ต์ข ์ ์ผ๋ก Set<Integer>์ ์ฌ์ฉํด ์ค๋ณต๋์ง ์๋ ์ข์ ์ํ๋ง ์ ์ฅํ ์ ์๋ค.
๐ ์ฆ, ๊ฐ ๊ธฐ์ฐจ์ ์ต์ข ์ํ๋ฅผ set์ ๋ฃ๊ณ , set์ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํ๋ฉด ์ Integer ํ์๋ฅผ ๊ฑด๋ ์ ์๋ ๊ธฐ์ฐจ์ ์๊ฐ ๋๋ค.
์ ํ์ด์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
๐ฏ ๋นํธ ๋ง์คํน ์ฐ์ฐ
์ฐ์ฐ | ์ฌ์ฉ ์์ |
๊ณต์งํฉ | A = 0 |
๊ฝ ์ฐฌ ์งํฉ | A = (1 << 10) - 1 |
์์ ์ถ๊ฐ | A |= (1 << K) |
์์ ์ญ์ | A &= ~(1 << K) |
์์ ํฌํจ ์ฌ๋ถ ํ์ธ | if ((A & (1 << K)) != 0)) |
์์ ํ ๊ธ (๋นํธ ๋ฐ์ ) | A ^= (1 << K) |
ํฉ์งํฉ | A | B |
๊ต์งํฉ | A & B |
์ฐจ์งํฉ | A & (~B) |
๋์นญ ์ฐจ์งํฉ | A ^ B |
์งํฉ์ ํฌ๊ธฐ ๊ตฌํ๊ธฐ (์ฌ๊ท) | bitCount(A) |
์งํฉ์ ํฌ๊ธฐ ๊ตฌํ๊ธฐ (Java ๋ด์ฅ) | Integer.bitCount(A) |
์ต์ ์์ ์ฐพ๊ธฐ | A & (-A) |
์ต์ ์์ ์ง์ฐ๊ธฐ | A &= (A-1) |
๋ถ๋ถ ์งํฉ ์ํ | for (int subset = A; subset; subset = (subset - 1) & A) |
โ ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 42988KB
์๊ฐ : 308ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Set;
import java.util.HashSet;
public class Main {
static int[] trains;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // ๊ธฐ์ฐจ ๊ฐ์
int m = Integer.parseInt(st.nextToken()); // ๋ช
๋ น์ ๊ฐ์
// ๊ฐ ๊ธฐ์ฐจ์ ๋ด๋ถ ์ํ ์ ์ฅ
trains = new int[n+1];
for (int i = 0; i < m; i++) {
excute(br.readLine());
}
Set<Integer> set = new HashSet<>();
for (int i = 1; i <= n; i++) {
set.add(trains[i]);
}
System.out.println(set.size());
br.close();
}
private static void excute(String command) {
StringTokenizer st = new StringTokenizer(command);
int t = Integer.parseInt(st.nextToken()); // ๋ช
๋ น ๋ฒํธ
int i = Integer.parseInt(st.nextToken()); // ๊ธฐ์ฐจ ๋ฒํธ
int x; // ์ข์ ๋ฒํธ
switch (t) {
case 1 :
x = Integer.parseInt(st.nextToken())-1;
trains[i] |= (1 << x);
break;
case 2 :
x = Integer.parseInt(st.nextToken())-1;
trains[i] &= ~(1 << x);
break;
case 3 :
trains[i] = (trains[i] << 1) & ((1 << 20) - 1);
break;
case 4 :
trains[i] = trains[i] >> 1;
break;
}
}
}
์์ฆ ๋ฌธ์ ๋ฅผ ์ ํํ ๋ ๋นํธ ๋ง์คํน ๋ฌธ์ ์์ฃผ๋ก ์ ํํด ํ๋ ค๊ณ ํ๋๋ฐ, ์ด ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๋นํธ ๋ง์คํน ์ฐ์ฐ์ ๋ํด ์กฐ๊ธ ๋ ํ์คํ ์ดํดํ ์ ์์๋ ๊ฒ ๊ฐ์ ํฌ์คํ ์ ํด์ผ์ง ์๊ฐํ๋ค. ์์ง๊น์ง ๋ฌธ์ ๋ง ๋ณด๊ณ ๋นํธ ๋ง์คํน์ ์ด๋ป๊ฒ ํ์ฉํ๋ฉด ์ข์์ง ๋ ์ฌ๋ฆฌ๋ ๊ฒ ์ฝ์ง ์์ง๋ง.. ๋ ์ด์ฌํ ํ๋ค ๋ณด๋ฉด ๊ฐ์ด ์ค๊ฒ ์ง.. โญ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_1194] ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์. (0) | 2025.07.25 |
---|---|
[Boj_17244] ์๋ง๋ค์ฐ์ฐ (1) | 2025.07.16 |
[Boj_20058] ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด์คํฐ (0) | 2025.06.15 |
[Boj_1263] ์๊ฐ ๊ด๋ฆฌ (0) | 2025.05.11 |
[Boj_17485] ์ง์ฐ์ ๋ฌ ์ฌํ (Large) (0) | 2025.04.24 |