의욕이 넘치는 날!!🔥
메모리가 4mb다 ㅋㅋ... 모.. array나 linkedList로는 해결할 수 없는 문제인걸 알 수 있죠??
그래서 비트마스킹을 사용했습니다! 비트마스킹은 비트단위로 값을 보존하고, 그걸 이용하는 거죠~ 1 ~ 20 사이의 수만 사용하기 때문에 int 타입(최대 32비트)으로 충분히 비트 값을 보존할 수 있습니다. 각 연산을 비트로 계산하는건 다음과 같습니다.
+) 비트마스킹 관련 정리한 글
알고리즘 > 비트마스킹(Bit Masking)
import java.util.Scanner;
public class Set {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = Integer.parseInt(sc.nextLine());
String op;
String[] splitOp;
int bits = 0;
StringBuilder result = new StringBuilder();
while ((--m) >= 0) {
op = sc.nextLine();
splitOp = op.split(" ");
if (splitOp[0].equals("add")) {
bits |= (1 << Integer.parseInt(splitOp[1]));
} else if (splitOp[0].equals("remove")) {
bits &= ~(1 << Integer.parseInt(splitOp[1]));
} else if (splitOp[0].equals("check")) {
if ((bits & (1 << Integer.parseInt(splitOp[1]))) > 0) result.append("1\n");
else result.append("0\n");
} else if (splitOp[0].equals("toggle")) {
bits ^= (1 << Integer.parseInt(splitOp[1]));
} else if (splitOp[0].equals("all")) {
bits |= ~(0);
} else { // splitOp[0] == "empty"
bits &= 0;
}
}
System.out.print(result.toString());
}
}
입력된 연산자에 따라 다른 연산을 진행하기 위해 if-else 문을 사용했는데요, 팩토리 메서드 패턴과 다형성을 이용하면 좋은 연습이 될 수 있겠네요! 나중에 관련 글 진행하면서 해보도록하겠습니다 ~_~