less than 1 minute read

문제 풀이 방식

  • 배열 등을 이용할 수도 있지만, 비트마스킹을 이용해 연산을 수행하면 연산이 간편해지는 문제이다.
  • 각 비트 연산에 대한 설명은 주석에 달아두었다.

문제 풀이 (Java)

import java.io.BufferedReader;  
import java.io.InputStreamReader;  
import java.util.StringTokenizer;  
  
public class boj11723 {  
  
    public static void main(String[] args) throws Exception {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        StringTokenizer st = new StringTokenizer(br.readLine());  
        StringBuilder sb = new StringBuilder();  
        int M = Integer.parseInt(st.nextToken());  
        int S = 0;  
  
        while (M-- > 0) {  
            st = new StringTokenizer(br.readLine());  
            String str = st.nextToken();  
            int num = -1; // 유효하지 않은 값으로 num 초기화  
            if (!str.equals("all") && !str.equals("empty")) {  
                num = Integer.parseInt(st.nextToken());  
            }  
  
            switch (str) {  
                case "all":  
                    S = (1 << 21) - 1; // 모든 비트 1로 변경  
                    break;  
                case "empty":  
                    S = 0; // 모든 비트 0으로 변경  
                    break;  
                case "add":  
                    S |= (1 << num); // num위치 비트를 추가 (or) 연산  
                    break;  
                case "remove":  
                    S &= ~(1 << num); // num위치 비트가 존재하지 않을 경우에만 제거 (nand)                    break;  
                case "check":  
                    sb.append((S & (1 << num)) != 0 ? "1\n" : "0\n");  
                    break; // num 위치 비트의 존재 여부 확인 (and)                case "toggle":  
                    S ^= (1 << num); // 비트를 toggle (xor)                    break;  
            }  
        }  
  
        System.out.println(sb);  
    }  
}

Leave a comment