링크

https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

풀이

1. 아이디 리스트 정렬
2. 신고 내역 중복 제거
3. 신고 내역 취합
4. 받은 메일 결과 반환

총 4단계로 분류해서 풀었습니다.

String[] id_list: 유저 ID
String[] report: {유저 ID  / 유저가 신고한 ID}
int k: 정지 기준 신고 횟수


1. 아이디 리스트 정렬
id_list 순서대로 메일 받은 수를 반환하기 때문에 해당 순서를 저장합니다.
setId 함수를 만들어서 따로 정렬했습니다.

public int[] solution(String[] id_list, String[] report, int k) {

    // 1. 아이디 리스트 정렬
    HashMap<String, String> map = setId(id_list);
}
public HashMap<String, String> setId(String[] id_list) {
    HashMap<String, String> map = new HashMap<>();
    for (int i = 0; i < id_list.length; i++) {
        map.put(i+"", id_list[i]);
        map.put(id_list[i], i+"");
    }
    return map;
}

 

2. 신고 내역 중복 제거
중복된 신고는 제거해줍니다. (동일한 아이디가 동일한 신고를 했을 시)
스트림을 사용하여 제거 했습니다.

public int[] solution(String[] id_list, String[] report, int k) {

    // 1. 아이디 리스트 정렬
    HashMap<String, String> map = setId(id_list);

    // 2. 신고 내역 중복 제거
    String[] list = Arrays.stream(report).distinct().toArray(String[]::new);
}

 

3. 신고 내역 취합
중복된 신고가 제거되었으니 신고 목록에 있는 내용을 취합합니다.
getReportCounts 함수로 기능을 구현했습니다.

public int[] solution(String[] id_list, String[] report, int k) {

    // 1. 아이디 리스트 정렬
    HashMap<String, String> map = setId(id_list);

    // 2. 신고 내역 중복 제거
    String[] list = Arrays.stream(report).distinct().toArray(String[]::new);

    // 3. 신고 내역 취합
    int[] reportCounts = getReportCounts(map, list, id_list.length);
}
public int[] getReportCounts(HashMap<String, String> map, String[] list, int cnt) {
    int[] result = new int[cnt];
    for (String reporter : list) {
        int index = Integer.parseInt(map.get((reporter).split(" ")[1]));
        result[index] += 1;
    }
    return result;
}

 

4. 받은 메일 결과 반환
신고 내역을 취합한 기준으로 정지 기준 횟수가 해당되는 경우 메일 발송 대상자로 체크합니다.
그리고 각 유저가 몇 번의 메일을 받았는지 최종 결과로 반환해줍니다.
getMailCounts 함수로 기능을 구현했습니다.

public int[] solution(String[] id_list, String[] report, int k) {

    // 1. 아이디 리스트 정렬
    HashMap<String, String> map = setId(id_list);

    // 2. 신고 내역 중복 제거
    String[] list = Arrays.stream(report).distinct().toArray(String[]::new);

    // 3. 신고 내역 취합
    int[] reportCounts = getReportCounts(map, list, id_list.length);

    // 4. 받은 메일 결과 반환
    return getMailCounts(map, list, reportCounts, k);
}
public int[] getMailCounts(HashMap<String, String> map, String[] list, int[] reportCounts, int k) {
    int[] result = new int[reportCounts.length];
    for (String reporter : list) {
        int index = Integer.parseInt(map.get((reporter).split(" ")[1]));
        if (reportCounts[index] < k) continue;
        int answerIndex = Integer.parseInt(map.get((reporter).split(" ")[0]));
        result[answerIndex] += 1;
    }
    return result;
}

 

전체코드

public HashMap<String, String> setId(String[] id_list) {
    HashMap<String, String> map = new HashMap<>();
    for (int i = 0; i < id_list.length; i++) {
        map.put(i+"", id_list[i]);
        map.put(id_list[i], i+"");
    }
    return map;
}

public int[] getReportCounts(HashMap<String, String> map, String[] list, int cnt) {
    int[] result = new int[cnt];
    for (String reporter : list) {
        int index = Integer.parseInt(map.get((reporter).split(" ")[1]));
        result[index] += 1;
    }
    return result;
}

public int[] getMailCounts(HashMap<String, String> map, String[] list, int[] reportCounts, int k) {
    int[] result = new int[reportCounts.length];
    for (String reporter : list) {
        int index = Integer.parseInt(map.get((reporter).split(" ")[1]));
        if (reportCounts[index] < k) continue;
        int answerIndex = Integer.parseInt(map.get((reporter).split(" ")[0]));
        result[answerIndex] += 1;
    }
    return result;
}

public int[] solution(String[] id_list, String[] report, int k) {

    // 1. 아이디 리스트 정렬
    HashMap<String, String> map = setId(id_list);

    // 2. 신고 내역 중복 제거
    String[] list = Arrays.stream(report).distinct().toArray(String[]::new);

    // 3. 신고 내역 취합
    int[] reportCounts = getReportCounts(map, list, id_list.length);

    // 4. 받은 메일 결과 반환
    return getMailCounts(map, list, reportCounts, k);
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

[카카오 코딩 테스트 2022 신입 공채] 신고 결과 받기는 평균적인 기업 코딩테스트 문제로 보입니다.
난이도나 문제 유형이 코딩테스트를 볼 때 출제되는 문제와 흡사했습니다.
한 번 씩 풀어보시길 바랍니다.

+ Recent posts