article thumbnail image
Published 2024. 3. 20. 13:06

 

 

문제

 

 

 

 

처음코드 :

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
복사했습니다!