[Boj_15787] ๊ธฐ์ฐจ๊ฐ€ ์–ด๋‘ ์„ ํ—ค์น˜๊ณ  ์€ํ•˜์ˆ˜๋ฅผ

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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;
        }
    }
}

 

์š”์ฆ˜ ๋ฌธ์ œ๋ฅผ ์„ ํƒํ•  ๋•Œ ๋น„ํŠธ ๋งˆ์Šคํ‚น ๋ฌธ์ œ ์œ„์ฃผ๋กœ ์„ ํƒํ•ด ํ’€๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋น„ํŠธ ๋งˆ์Šคํ‚น ์—ฐ์‚ฐ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ํ™•์‹คํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„ ํฌ์ŠคํŒ…์„ ํ•ด์•ผ์ง€ ์ƒ๊ฐํ–ˆ๋‹ค. ์•„์ง๊นŒ์ง„ ๋ฌธ์ œ๋งŒ ๋ณด๊ณ  ๋น„ํŠธ ๋งˆ์Šคํ‚น์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋ฉด ์ข‹์„์ง€ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒŒ ์‰ฝ์ง€ ์•Š์ง€๋งŒ.. ๋” ์—ด์‹ฌํžˆ ํ’€๋‹ค ๋ณด๋ฉด ๊ฐ์ด ์˜ค๊ฒ ์ง€.. โญ