잡다한 배똥월드

728x90
코딩 테스트 풀이 체크리스트

 

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

 

 

 

 

import java.util.*;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        int result = 0;
        int zero = 0;
        for (int i = 0; i < lottos.length; i++) {
            if (lottos[i] != 0) {
                for (int j = 0; j < win_nums.length; j++) {
                    if (lottos[i] == win_nums[j]) {
                        result++;
                        break;
                    }
                }
            } else {
                zero++;
            }
        }        
        
        answer[0] = (result + zero == 0) ? 6 : 6 - (result + zero) + 1;
        answer[1] = (result == 0) ? 6 : 6 - result + 1;

        return answer;
    }
}

 

테스트 1 통과 (0.02ms, 73.4MB)
테스트 2 통과 (0.02ms, 80.8MB)
테스트 3 통과 (0.02ms, 71.9MB)
테스트 4 통과 (0.02ms, 76.2MB)
테스트 5 통과 (0.02ms, 80.9MB)
테스트 6 통과 (0.01ms, 73MB)
테스트 7 통과 (0.02ms, 74.3MB)
테스트 8 통과 (0.01ms, 73.4MB)
테스트 9 통과 (0.02ms, 73.6MB)
테스트 10 통과 (0.02ms, 75.2MB)
테스트 11 통과 (0.01ms, 73.6MB)
테스트 12 통과 (0.02ms, 77.3MB)
테스트 13 통과 (0.01ms, 77.1MB)
테스트 14 통과 (0.01ms, 80.2MB)
테스트 15 통과 (0.03ms, 71.3MB)

 

 

 

 

 

두번째 푸는 문제인데, 처음 풀었을 때의 코드가 더 깔끔한 것 같다..

 

 

 

 

일단 lottos에 0이 몇 개인지, win_nums와 같은 숫자가 몇 개인지 파악했고,

그걸 기준으로 순위를 계산했습니다.

 

 

 

 

이 문제를 풀면서 알게 된 점은 

int[] 즉, int 배열은 indexOf나 contains를 지원하지 않는다는 점이었다..!!!

그래서 for문으로 숫자가 있는지 없는지를 파악했는데, 그냥 ArrayList로 변환 후에 풀껄 그랬나.. 생각도 했다..

 

 

 

 

더보기
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {

        int bingo = 0;
        int lose = 0;

        for (int i = 0; i < lottos.length; i++) {
            if (lottos[i] != 0) {
                for (int j = 0; j < win_nums.length; j++) {
                    if (lottos[i] == win_nums[j]) {
                        bingo++;
                        break;
                    }
                }
            } else {
                lose++;
            }
        }

        int[] data = new int[]{6, 6, 5, 4, 3, 2, 1};

        return new int[]{data[bingo + lose], data[bingo]};
    }
}

 

 

어떻게 배열을 이용할 생각을 했지..?

저 때의 나 아주 잘했눼...

 

 

 

 

 

 

728x90
728x90
 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

코딩 테스트 풀이 체크리스트

 

 

 

.

.

.

 

 

 

import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        
        //유저 - 유저가 신고한 사람
        HashMap<String, ArrayList<String>> arr1 = new HashMap<>();

        //유저 - 유저를 신고한 사람
        HashMap<String, ArrayList<String>> arr2 = new HashMap<>();
        HashMap<String, Integer> arr3 = new HashMap<>();
        
        for (int i = 0; i < report.length; i++) {
            String[] temp = report[i].split(" ");
            
            ArrayList<String> list1 = arr1.getOrDefault(temp[0], new ArrayList<>());
            ArrayList<String> list2 = arr2.getOrDefault(temp[1], new ArrayList<>());
            
            if (list1.indexOf(temp[1]) == -1) {
                list1.add(temp[1]);
            }
            
            if (list2.indexOf(temp[0]) == -1) {
                list2.add(temp[0]);
            }
            
            arr1.put(temp[0], list1);
            arr2.put(temp[1], list2);
        }
        
        for (int i = 0; i < id_list.length; i++) {
            ArrayList<String> temp = arr2.getOrDefault(id_list[i], new ArrayList<>());
            arr3.put(id_list[i], temp.size());
        }
        
        for (int i = 0; i < id_list.length; i++) {
            ArrayList<String> temp = arr1.getOrDefault(id_list[i], new ArrayList<>());
            
            for (int j = 0; j < temp.size(); j++) {
                if (arr3.getOrDefault(temp.get(j), 0) >= k) {
                    answer[i]++;
                }
            }
        }
        
        return answer;
    }
}
테스트 1 통과 (0.21ms, 72.8MB)
테스트 2 통과 (0.17ms, 76.5MB)
테스트 3 통과 (460.21ms, 174MB)
테스트 4 통과 (0.28ms, 73.5MB)
테스트 5 통과 (0.44ms, 77.7MB)
테스트 6 통과 (4.40ms, 96.7MB)
테스트 7 통과 (8.58ms, 85.4MB)
테스트 8 통과 (14.57ms, 95.6MB)
테스트 9 통과 (182.74ms, 136MB)
테스트 10 통과 (219.88ms, 137MB)
테스트 11 통과 (475.40ms, 173MB)
테스트 12 통과 (1.24ms, 79.8MB)
테스트 13 통과 (1.23ms, 78.6MB)
테스트 14 통과 (127.59ms, 128MB)
테스트 15 통과 (240.11ms, 162MB)
테스트 16 통과 (1.07ms, 74.1MB)
테스트 17 통과 (1.42ms, 78.6MB)
테스트 18 통과 (2.79ms, 85.5MB)
테스트 19 통과 (3.14ms, 84MB)
테스트 20 통과 (130.37ms, 139MB)
테스트 21 통과 (357.16ms, 175MB)
테스트 22 통과 (0.09ms, 70.5MB)
테스트 23 통과 (0.26ms, 79.2MB)
테스트 24 통과 (0.10ms, 75.9MB)

 

 

 

 

 

해시맵 arr1은 유저가 신고한 유저 리스트

해시맵 arr2는 해당 유저를 신고한 유저 리스트

해시맵 arr3은 해당 유저가 신고당한 수 (배열로 대체 가능할 것 같음)

 

 

 

 

그래서 report 대로 for문을 돌려서 arr1과 arr2를 채워나갑니다.

만약에 중복이라면 추가하지 않고, 중복이 아니라면 추가하는 식으로...

 

 

 

 

그리고 나서 arr3을 채우는데 이건 id_list로 for문을 돌린다.

 

 

 

 

id_list에서 하나씩 꺼내서 arr1의 해당 유저가 신고한 리스트를 가져오고

리스트의 유저들이 몇 번 신고를 당했는지 파악하기 위해 arr3에서 값 가져와서

만약에 k값보다 크거나 같으면 answer++, 아니면 그냥 넘어가는 식으로 작성 후 answer 리턴

 

 

 

 

728x90

+ Recent posts