문제
처음코드 :
Hash의 contains 함수가 가장 효율이 좋기에 HashMap의 contains 함수를 이용했고,
all 에 대한 HashMap 을 따로 만들어
all 연산 시마다 now에 all 의 값을 할당해 주었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
HashMap<Integer, Integer> now = new HashMap<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while (n-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String s = st.nextToken();
if (s.equals("add")) {
int tmp = Integer.parseInt(st.nextToken());
if (!now.containsKey(tmp))
now.put(tmp, 1);
}
else if (s.equals("check")) {
int tmp = Integer.parseInt(st.nextToken());
if (!now.containsKey(tmp))
sb.append("0").append("\n");
else
sb.append("1").append("\n");
}
else if (s.equals("remove")) {
int tmp = Integer.parseInt(st.nextToken());
now.remove(tmp);
}
else if (s.equals("toggle")) {
int tmp = Integer.parseInt(st.nextToken());
if (now.containsKey(tmp))
now.remove(tmp);
else
now.put(tmp, 1);
}
else if (s.equals("all")) {
now = new HashMap<>();
for (int i = 1; i < 21; i++) {
now.put(i, 1);
}
}
else if (s.equals("empty")) {
now.clear();
}
}
System.out.println(sb);
}
}
문제점 :
all 명령어를 처리하면서 문제가 발생할 수 있다.
이는 참조변수기 때문에 "all" 명령어가 호출되었을 때 now 변수가 all 변수로 대체된다.
이렇게 되면 now 변수와 all 변수가 같은 객체를 가리키게 된다. 따라서 "all" 명령어 이후 발생하는 변경 사항이 all 변수에도 영항을 미치기 때 문에 all 명령어가 두번 이상 호출되는 경우 문제가 생길 수 있다.
따라서 이를 방지하기 위해서는 now 변수에 all 변수의 복사본을 할당하거나, all 명령어 시 now 변수를 직접 초기화해서 값을 세팅하는 방식으로 해야 한다.
참조변수와 할당에 대해서 생각하지 못하고 풀었다 담에는 이를 주의해서 풀자!
바꾼 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
HashMap<Integer, Integer> now = new HashMap<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while (n-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String s = st.nextToken();
if (s.equals("add")) {
int tmp = Integer.parseInt(st.nextToken());
if (!now.containsKey(tmp))
now.put(tmp, 1);
}
else if (s.equals("check")) {
int tmp = Integer.parseInt(st.nextToken());
if (!now.containsKey(tmp))
sb.append("0").append("\n");
else
sb.append("1").append("\n");
}
else if (s.equals("remove")) {
int tmp = Integer.parseInt(st.nextToken());
now.remove(tmp);
}
else if (s.equals("toggle")) {
int tmp = Integer.parseInt(st.nextToken());
if (now.containsKey(tmp))
now.remove(tmp);
else
now.put(tmp, 1);
}
else if (s.equals("all")) {
now = new HashMap<>();
for (int i = 1; i < 21; i++) {
now.put(i, 1);
}
}
else if (s.equals("empty")) {
now.clear();
}
}
System.out.println(sb);
}
}
'Algorithm' 카테고리의 다른 글
[백준 1654] 이진탐색 (1) | 2024.03.05 |
---|---|
[백준1764]HashSet과 ArrayList의 contains() 시간복잡도 (0) | 2023.07.01 |
백준7576 토마토 (0) | 2023.06.11 |
백준 1041 주사위 (2) | 2023.05.04 |
백준 1663 -XYZ 문자열 (0) | 2023.05.03 |