티스토리 뷰

728x90

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

 

프로그래머스

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

programmers.co.kr

 

2022 KAKAO BLIND RECRUITMENT의 Level 1 문제다.

 

 

 

 

사용자별 신고 여부를 저장할 boolean 2차원 배열 report_yn을 생성했다.

만약 report_yn[i][j]가 true라면 i번째의 사용자가 j번째의 사용자를 신고한 것이다.

 

        HashMap<String, Integer> map = new HashMap<>();
        
        for(int i=0;i<n;i++)
            map.put(id_list[i], i); // 각 사용자 별로 인덱스 부여

이 때 String으로 된 사용자가 몇번째의 사용자인지 바로 알 수 있도록

HashMap에 String을 key로, Integer를 value로 저장했다.

 

 

        for(int i=0;i<report.length;i++) {
            st = new StringTokenizer(report[i]);
            // 사용자의 인덱스 찾기
            int userIdx = map.get(st.nextToken()); 
            int reportIdx = map.get(st.nextToken());
            
            if(!report_yn[userIdx][reportIdx]) { // 이미 같은 신고를 한 경우 무시
                report_yn[userIdx][reportIdx] = true;
                report_cnt[reportIdx]++;
            }
        }

중복된 신고를 처리할 때도 report_yn이 true인지 false인지만 검사하면 된다.

report_yn가 true라면 이미 같은 신고를 했다는 뜻이므로 무시한다.

또한 false라면 아직 신고를 한적이 없다는 뜻이므로 true로 바꾸고, 사용자의 신고 횟수를 증가시킨다.

 

 

        for(int i=0;i<n;i++) {
            if(report_cnt[i] >= k) {
                for(int j=0;j<n;j++) 
                    if(report_yn[j][i]) // j가 i를 신고했다면
                        mail[j]++;
            }
        }

또한 메일이 몇번 발송되는지 카운트할 때도 report_yn을 탐색해 true라면

메일 횟수를 저장할 mail[]의 값을 증가시키면 된다.  

이용 정지된 사용자를 누가 신고했는지 알기 위해서는

report_yn을 가로가 아닌 세로로 탐색해야한다.

 

String 사용자의 인덱스를 찾기 위해 사용한 HashMap을 제외하고는

모두 인접배열 형태를 사용하므로 속도가 빠르다.

 

 

전체 코드

import java.util.StringTokenizer;
import java.util.HashMap;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        StringTokenizer st;
        int n = id_list.length;
        boolean[][] report_yn = new boolean[n][n]; // 사용자별 신고 여부
        int[] report_cnt = new int[n]; // 신고 횟수
        int[] mail = new int[n]; // 메일 수
        
        HashMap<String, Integer> map = new HashMap<>();
        
        for(int i=0;i<n;i++)
            map.put(id_list[i], i); // 각 사용자 별로 인덱스 부여
        
        for(int i=0;i<report.length;i++) {
            st = new StringTokenizer(report[i]);
            // 사용자의 인덱스 찾기
            int userIdx = map.get(st.nextToken()); 
            int reportIdx = map.get(st.nextToken());
            
            if(!report_yn[userIdx][reportIdx]) { // 이미 같은 신고를 한 경우 무시
                report_yn[userIdx][reportIdx] = true;
                report_cnt[reportIdx]++;
            }
        }
        
        for(int i=0;i<n;i++) {
            if(report_cnt[i] >= k) {
                for(int j=0;j<n;j++) 
                    if(report_yn[j][i]) // j가 i를 신고했다면
                        mail[j]++;
            }
        }
        
        return mail;
    }
}
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함