220913 TIL 레벨1이지만 레벨1같지 않은 문제

프로그래머스 레벨 1 문제 중 가장 낮은 정답률을 가진 신고 결과받기 문제를 이틀 연속 풀고 있다.

밀리면 안 된다는 걸 알지만 나에게 이 문제를 풀기가 쉽지 않았다.

분명 한번 풀었던 문제인데 어떻게 풀었는지 전혀 생각이 나지 않았고, 마치 처음 본 문제 같았다.

월요일에 처음 풀기를 시도했을 때 30분간 삽질하다 HashMap을 써야 한다는 것을 뒤늦게 깨닫고 시도를 했지만 레벨 1의 최고 보스답게 좀처럼 풀리지 않았다.

결국에는 시간 내에 풀지 못해서 저녁에 다시 재도전했지만 풀지 못했다.

 

오늘은 신고 결과받기 문제를 자바스크립트로 풀어야 했다. 자바로도 못 풀었는데 자바스크립트로 풀었을 리가..

 

더 이상 코딩 도장 문제가 밀리면 안 돼서 오늘은 어떻게든 풀어야 했다.

 

우선 요구사항부터 다시 천천히 읽고 먼저 처리해야 할 것을 나열했다.

동일한 유저에 대한 신고 횟수는 1회로 처리하기 때문에 신고받은 사람이 중복되어서는 안 되기 때문에 신고받은 사람을 처리할 때 HashSet을 써야겠구나 생각을 먼저 했고,

누가 누구를 신고했는지 알아야 했기 때문에 신고한 사람과 신고받은 사람이 매칭이 될 수 있는 HashMap을 써야겠다고 생각했다.

 

HashMap에서 key로 신고한 사람을 넣고 value로 신고받은 사람을 넣는데, 신고받은 사람은 중복이 되면 안 되기 때문에 value는 HashSet형태로 들어가야 한다고 생각을 했다.

HashMap<String, HashSet<String>> reportMap = new HashMap<>();

이런 식으로 key는 String(신고한 사람), value는 HashSet(신고당한 사람) 형태이다.

 

그리고 최종적으로 누가 정지되었는지 확인하기 위해서 resultMap을 또 만들었다.

HashMap<String, HashSet<String>> resultMap = new HashMap<>();

이것도 똑같은 형태지만 여기서 key는 신고당한 사람이 들어가고 value는 신고한 사람이 들어간다.

그 이유는 신고당한 사람의 value의 크기가 정지 기준이 되는 신고 횟수 k 보다 크거나 같으면 정지가 돼야 하기 때문이다.

 

마지막으로 정지가 되었다는 사실을 신고한 사람에게 전달하기 위해서 진행한 순서는 아래와 같다.

1. 매개변수로 주어진 id_list의 배열의 크기만큼 메일을 받는 배열(answer) 크기를 만들어준다

int[] answer = new int[id_List.length];

2. 매개변수로 주어진 id_list 배열의 값을 user라는 변수에 저장한다.

3. user가 reportMap의 key와 일치하는 key의 value를 하나씩 꺼내온다.

4. 그 value 값이 resultMap에서는 key가 되니 key를 이용해 value를 얻어와 그 value의 size가 k보다 크면 정지가 되었으니 정지되었다는 메일을 받는 배열(answer)의 횟수를 1 늘리는 식으로 했다.

for(int i = 0; i < answer.length; i += 1) {
      String user = id_List[i];

      if(!reportMap.containsKey(user)) {
        continue;
      }

      for (String banUser : reportMap.get(user)) {
        if (resultMap.get(banUser).size() >= k) {
          answer[i] += 1;
        }
      }
    }

뭔가 내가 생각했던 풀이 방법을 글로 쓰려고 하니까 정리가 하나도 안 된 느낌이다.

HashMap과 HashSet을 사용하는 과정에 있어서 미숙한 부분이 많아 여러 가지 시도해보느라 풀이가 많이 늦어졌다.

 

자바스크립트로도 이 문제를 풀어야 하는데 다른 방법으로 풀어보고 싶지만 다른 풀이 방법이 생각이 날까..?

이미 머릿속에 지금 풀었던 방법이 박혀서 벗어나기가 쉽지 않을 것 같지만 최대한 다른 방법으로 풀어보고, 자기 전까지 자바스크립트로 문제 해결하고 하루를 마무리하자.

오늘 코딩도장 문제는 내일로 미루지 않기!

 

 

그리고 테스트 코드부터 작성을.....