(Java) 프로그래머스 신고 결과 받기

2022. 5. 6. 03:18·코딩 테스트

작년 카카오 공채 문제였다. 당시 처음으로 코딩 테스트를 경험해보고자

지원해서 풀어봤지만.. 1문제밖에 못풀었었다.

 

문제를 읽고 오랜만에 구현 방법이 제대로 떠오르지 않았다.

Map을 이용해야 한다는 건 알겠는데 Map을 어떻게 이용해야 할지 

명확하게 떠오르지가 않았다.

 

그래서 이중 for문을 마구 쓰며 풀었다.

구현하면서도 이건 아닌데 싶었는데 딱히 방법이 없어 끝까지 해봤다.

답은 구해지는데 테스트 케이스 7~8개에서 시간 초과가 났다.

 

처음 작성한 코드

public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        int[] cnt = new int[id_list.length];

        // 중복 제거
        String [] result = Arrays.stream(report).distinct().toArray(String[] :: new);
        System.out.println(Arrays.toString(result));
        for (int i = 0; i < id_list.length; i++) {
            for (int j = 0; j < result.length; j++) {
                String[] temp = result[j].split(" ");
                if(id_list[i].equals(temp[1])) {
                    cnt[i]++;
                }
            }
        }
        ArrayList<String> list = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        for (int i = 0; i < cnt.length; i++) {
            if(cnt[i] >= k) {
                list.add(id_list[i]);
            }
        }

        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < result.length; j++) {
                String[] temp = result[j].split(" ");
                if(list.get(i).equals(temp[1])) {
                    list2.add(temp[0]);
                }
            }
        }

        for (int i = 0; i < id_list.length; i++) {
            for (int j = 0; j < list2.size(); j++) {
                if(id_list[i].equals(list2.get(j))) {
                    answer[i]++;
                }
            }
        }

        return answer;
    }

 

다음날 다시 리펙토링을 하려고 했는데도

어떻게 Map을 사용할지 몰라서 검색해봤다.

답은 HashMap<String, ArrayList<String>>) 과 같이 Map value에 List를 넣을 수 있었다...

Map은 자주 사용하지 않아서 잘 몰랐는데 이번에 또 배우는 것 같다.

자바의 정석을 미루지 말고 다시 한번 읽어야겠다.

 

최종 코드

import java.util.*;
class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
                int[] answer = new int[id_list.length];

        // HashSet으로 중복제거
        HashSet<String> reportSet = new HashSet<>();
        for(String s : report) {
            reportSet.add(s);
        }

        // Key(신고당한사람) : Value(신고자) 로 HashMap 선언
        HashMap<String, ArrayList<String>> reportMap = new HashMap<>();
        for (String s : reportSet) {
            // split으로 문자열 나누기
            String[] temp = s.split(" ");
            String reporter = temp[0];
            String reportee = temp[1];
            ArrayList<String> list = reportMap.get(reportee);
            // value가 비어있다면
            if(reportMap.get(reportee) == null) {
                // 리스트 초기화
                list = new ArrayList<>();
            }
            list.add(reporter);
            reportMap.put(reportee, list);
        }

        // 신고자에게 정지 메일을 카운팅 하는 Hashmap 만들기
        HashMap<String, Integer> cntMap = new HashMap<String, Integer>();
        // reportMap에서 value list를 가져오기
        for(ArrayList<String> list : reportMap.values()) {
            // 그 값이 k보다 크다면
            if(list.size() >= k) {
                for(String s : list) {
                    // cntMap에 신고자를 key로 넣고 value에 메일 발송 카운트
                    cntMap.put(s, cntMap.getOrDefault(s, 0) + 1);
                }
            }
        }
        
        // 카운팅을 기반으로 answer 배열 채우기
        for (int i = 0; i < id_list.length; i++) {
            answer[i] = cntMap.getOrDefault(id_list[i], 0);
        }
        return answer;
    }
}

 

 

'코딩 테스트' 카테고리의 다른 글

(Java) 백준 11399 - ATM  (0) 2022.05.10
(Java) 백준 1463 - 1로 만들기  (0) 2022.05.07
(Java) 프로그래머스 피로도  (0) 2022.05.02
(Java) 프로그래머스 뉴스 클러스터링  (0) 2022.04.30
(Java) 프로그래머스 캐시  (0) 2022.04.28
'코딩 테스트' 카테고리의 다른 글
  • (Java) 백준 11399 - ATM
  • (Java) 백준 1463 - 1로 만들기
  • (Java) 프로그래머스 피로도
  • (Java) 프로그래머스 뉴스 클러스터링
로승리
로승리
  • 로승리
    Roy's Blog
    로승리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Issuefy
      • Language
      • Spring
      • Database
      • Network
      • Kubernetes
      • AWS
      • 코드스쿼드
      • 코딩 테스트
      • 생각정리
      • 국비지원
      • 회고
      • 컨퍼런스, 세미나
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
로승리
(Java) 프로그래머스 신고 결과 받기
상단으로

티스토리툴바