BackJoon Algorithm - Java
문제
풀이
- 비트 연산자를 이용한 비트마스크를 써야한다.
- 안쓰고 그냥 풀면 시간초과가 나온다..
1) 맞은 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Back_11723 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int M = Integer.parseInt(br.readLine());
int S = 0;
while (M-- > 0) {
st = new StringTokenizer(br.readLine());
String oper = st.nextToken();
if (oper.equals("all")) S = (1 << 21) - 1;
else if (oper.equals("empty")) S = 0;
else {
int num = Integer.parseInt(st.nextToken());
if (oper.equals("add")) {
S |= (1 << num);
} else if (oper.equals("remove")) {
S &= ~(1 << num);
} else if (oper.equals("check")) {
sb.append((S & (1 << num)) != 0 ? 1 : 0).append("\n");
} else if (oper.equals("toggle")) {
S ^= (1 << num);
}
}
}
System.out.println(sb);
br.close();
}
}
2) 틀린 풀이 (시간 초과)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int M = Integer.parseInt(br.readLine());
boolean[] checkValue = new boolean[M + 1];
int reNum[] = new int[M + 1];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
String oper = st.nextToken();
oper = oper + " ";
if (!oper.equals("all ") && !oper.equals("empty ")) {
int num = Integer.parseInt(st.nextToken());
switch (oper) {
case "add ":
if(checkValue[num] == false){
checkValue[num] = true;
reNum[i] = num;
}
break;
case "check ":
if (checkValue[num] == true) {
sb.append(1).append("\n");
} else {
sb.append(0).append("\n");
}
break;
case "remove ":
if (checkValue[num] == true) {
checkValue[num] = false;
}
break;
case "toggle ":
if (checkValue[num] == true) {
checkValue[num] = false;
} else {
checkValue[num] = true;
}
break;
}
} else if (oper.equals("all ")) {
for (int j = 0; j < M; j++) {
checkValue[j] = true;
}
} else {
for (int j = 0; j < reNum.length; j++) {
checkValue[reNum[j]] = false;
}
}
}
System.out.println(sb);
br.close();
}
}
댓글남기기