** 옛날에 풀었던 코드
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
|
import java.io.*;
import java.util.*;
class Solution{
static StringTokenizer st;
static int n,m,k;
static char[][] arr;
static int[] dx= {1,-1,0,0};
static int[] dy = {0,0,1,-1};
static boolean[][] visited;
static int max;
static StringBuilder sb;
public static void main(String args[])throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int tc = Integer.parseInt(br.readLine());
for(int q=0; q<tc; q++) {
st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
String word = Integer.toBinaryString(m);
boolean check = false;
int cnt=0;
int index = word.length()-1;
for(int i=index; i>=Math.max(0, (word.length()-n)); i--) {
if(word.charAt(i)=='1') {
cnt++;
}
else {
check = true;
break;
}
}
if(check || cnt!=n) {
System.out.println("#"+(q+1)+" "+"OFF");
}else {
System.out.println("#"+(q+1)+" "+"ON");
}
}
}
}
|
cs |
비트마스크를 사용할 줄 몰랐던 옛날에 풀었을 때의 코드다.
Integer.toBinaryString이라는 함수를 사용해 입력받은 값을 2진수 String으로 만들고, n의 값만큼 "1"이 있다면 ON,
아니라면 OFF를 했던 코드다.
** 비트마스크를 사용한 코드
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
|
package day1;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Set;
import java.util.StringTokenizer;
public class No1 {
static int n,m,k;
static int[][] arr;
static int total;
static StringTokenizer st;
static StringBuilder sb;
static Set<Integer> set;
static boolean[] visited;
static long max;
public static void main(String[] args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int tc = Integer.parseInt(br.readLine());
for(int q=0; q<tc; q++) {
st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
int test = (1<<n)-1;
System.out.println("#"+(q+1)+" "+((m&test)==test?"ON":"OFF"));
}
br.close();
bw.close();
}
}
|
cs |
코드가 훨씬 간결해졌다.
입력받은 n만큼 (1<<n)-1 이라는 쉬프트연산자를 사용하면 딱 그에 걸맞은 2진수 숫자가 나온다.
예를들어 입력값 n이 4라면 (1<<4)는 1 0 0 0 0이다. 여기에서 1을 뺀다면 1 1 1 1 이라는 2진수가 나오게된다.
이 상태에서 입력값 m과의 &연산을 사용하여 위의 쉬프트연산자와 값이 같다면 ON, 아니라면 OFF다.
자세히 보자면 다음과 같다.
입력값 30의 2진수 표현값은 다음과 같다.
1 1 1 1 0
따라서 뒤에서부터 입력값 n개만큼의 bit가 켜져있는지를 확인하려면 (1<<4)-1을 진행하여 값 1 1 1 1을 만든다.
이를 통해 &연산을 진행하면
1 1 1 1 0
1 1 1 1
-------------
0 1 1 1 0이 나오기 때문에 뒤의 4개의 비트가 전부 켜진것이 아니기 떄문에 값은 "OFF"다.
'알고리즘 > SWEA' 카테고리의 다른 글
[D2] 새로운 불면증 치료법(비트마스크, BitMask) (0) | 2024.01.28 |
---|