코테/코드트리

[코드트리/INTERMEDIATE HIGH] bit 계산 (JAVA)

imname1am 2023. 12. 18. 13:36
반응형

📖 문제

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

 

 

💡  풀이 방식

• 비트마스크

- 시간 복잡도 : O(Q)

 

1) add 연산 , delete 연산 : 숫자  x가 집합 A에 들어가 있는지 확인

if(((S >> x) & 1) == 0)		// add 연산 : 집합에 없는 경우, 새로 추가
	S ^= (1 << x);
    
else if(((S >> x) & 1) == 1)	// delete 연산 : 이미 집합에 들어있는 수인 경우, 제거
	S ^= (1 << x);

 

 

2) print 연산 : 집합에 들어가 있는 수인 경우 1 출력/ 집합에 없는 수인 경우 0 출력

System.out.prinltn((S >> x) & 1);

 

3) toggle 연산 : 집합 S에 수가 있다면 제거, 없다면 추가

S ^= (1 << x);

 

4) clear 연산 : 공집합으로 만들기

S = 0;

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
 
        int q = Integer.parseInt(br.readLine());
        int S = 0;  // 비트마스크로 표현되는 집합
 
        while(q --> 0) {
            String[] str = br.readLine().split(" ");
            
            if(str[0].equals("add")) {
                int x = Integer.parseInt(str[1]);
 
                // x 번째 비트가 0인지 확인하고, 0이면 해당 비트를 1로 변경
                if(((S >> x) & 1== 0)
                    S ^= (1 << x);
            }
            else if(str[0].equals("delete")) {
                int x = Integer.parseInt(str[1]);
 
                // x 번째 비트가 1인지 확인하고, 1이면 해당 비트를 0으로 변경
                if(((S >> x) & 1== 1) {
                    S ^= (1 << x);
                }
            }
            else if(str[0].equals("print")) {
                int x = Integer.parseInt(str[1]);
 
                // x 번째 비트가 1인지 확인하여 결과를 StringBuilder에 추가
                sb.append((S >> x) & 1).append("\n");
            }
            else if(str[0].equals("toggle")) {
                int x = Integer.parseInt(str[1]);
                
                // x번째 비트 토글 (1이면 0으로, 0이면 1로)
                S ^= (1 << x);
            }
            else if(str[0].equals("clear")) {
                // 집합 비움 = 공집합 (모든 비트를 0으로 변경)
                S = 0;
            }
        }
 
        System.out.println(sb);
    }
}
cs

 

 

 

➕ 다른 풀이 방식

- 492ms, 26MB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
 
        int q = Integer.parseInt(br.readLine());
        int S = 0;  // 비트마스크로 표현되는 집합
 
        while(q --> 0) {
            String[] str = br.readLine().split(" ");
            
            if(str[0].equals("add")) {
                int x = Integer.parseInt(str[1]);
 
                // x번째 비트가 0인지 확인하고, 0이면 해당 비트를 1로 변경
                if((S & (1 << x)) != (1 << x))
                   S ^= (1 << x);
            }
            else if(str[0].equals("delete")) {
                int x = Integer.parseInt(str[1]);
 
                // x번째 비트가 1인지 확인하고, 1이면 해당 비트를 0으로 변경
                if((S & (1 << x)) == (1 << x)) {
                   S ^= (1 << x);
                }
            }
            else if(str[0].equals("print")) {
                int x = Integer.parseInt(str[1]);
 
                // x번째 비트가 1인지 확인하여 결과를 StringBuilder에 추가
               sb.append((S & (1 << x)) == (1 << x) ? 1 : 0).append("\n");
            }
            else if(str[0].equals("toggle")) {
                int x = Integer.parseInt(str[1]);
                
                // x번째 비트 토글 (1이면 0으로, 0이면 1로)
               S ^= (1 << x);
            }
            else if(str[0].equals("clear")) {
                // 집합 비움 = 공집합 (모든 비트를 0으로 변경)
               S = 0;
            }
        }
 
        System.out.println(sb);
    }
}
cs

 

 


💦 어려웠던 점

- 괄호를 잘 쳐주어야 한다.. 안 그러면 에러가 난다.

 

 

🧐 새로 알게 된 내용

- 비트마스크를 이용한 집합 구현과 숫자 추가,제거,토글 연산!

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 코드트리

 

[알고리즘] 비트(Bit)와 비트마스크(BitMask) 정리 (Java)

비트(bit) 비트(binary digit)는 데이터를 나타내는 최소 단위로 이진수의 한자라인 0 또는 1의 값을 가진다. 부호 없는 N비트 정수형 변수는 N자리의 이진수로 나타낼 수 있다. 이때 비트가 표현하는

loosie.tistory.com

 

반응형