본문 바로가기

Algorithm/Algorithm Test

[프로그래머스] 로또의 최고 순위와 최저 순위 (Java)

카테고리

기본 알고리즘

나만의 카테고리

아이디어 짜기

문제 링크

programmers.co.kr/learn/courses/30/lessons/77484

 

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

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

programmers.co.kr

요점

  • int 배열의 순회 방법 중 어느 방법이 좋은지 비교해보자

참고 지식

  • [Java] IntStream.of(int[])

풀이 (Java)

// 추천
import java.util.*;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        
        int zeroCount = 0;
        int correctNumCount = 0;
        for (int lotto : lottos) {
            if (lotto == 0) {
                zeroCount++;
            }
            
            // for문 사용
            for (int num : win_nums) {
                if (lotto == num) {
                    correctNumCount++;
                    break;
                }
            }
        }
        
        answer[0] = 7 - correctNumCount - zeroCount;
        answer[1] = 7 - correctNumCount;
        
        if (answer[0] == 7) answer[0]--;
        if (answer[1] == 7) answer[1]--;
        
        return answer;
    }
}

 

import java.util.*;
import java.util.stream.IntStream;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        
        int zeroCount = 0;
        int correctNumCount = 0;
        for (int lotto : lottos) {
            if (lotto == 0) {
                zeroCount++;
            }
            
            //IntStream으로 변환하는 방법 사용
            if (IntStream.of(win_nums).anyMatch(num -> (num == lotto))) {
                correctNumCount++;
            }
        }
        
        answer[0] = 7 - correctNumCount - zeroCount;
        answer[1] = 7 - correctNumCount;
        
        if (answer[0] == 7) answer[0]--;
        if (answer[1] == 7) answer[1]--;
        
        return answer;
    }
}

 

import java.util.*;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        
        int zeroCount = 0;
        int correctNumCount = 0;
        // Arrays.binarySearch 사용
        Arrays.sort(win_nums);
        for (int lotto : lottos) {
            if (lotto == 0) {
                zeroCount++;
                continue;
            }
            
            try {
                if (Arrays.binarySearch(win_nums, lotto) >= 0) {
                    correctNumCount++;
                }  
            } catch (ArrayIndexOutOfBoundsException e) {
                continue;
            }
        }
        
        answer[0] = 7 - correctNumCount - zeroCount;
        answer[1] = 7 - correctNumCount;
        
        if (answer[0] == 7) answer[0]--;
        if (answer[1] == 7) answer[1]--;
        
        return answer;
    }
}

문제는 간단해서 푸는데 어려움이 있으신 분들은 많이 없을 것으로 예상됩니다.

 


# Java로 풀었다면

근데 풀다 보니 for 문 중첩하는 코드가 보기 싫어서 IntStream을 사용하거나 배열 색인을 떠올리면 쉽게 생각나는 Arrays.binarySearch를 사용하게 됩니다.

근데 이것이 for문 중첩보다 절대 효율적이지 않습니다. 간단히 비교해 보겠습니다.

 

이 문제에서는 순회할 int 배열이 6개의 원소로 고정이 되어있어서 아주 작은 배열입니다.

 

1. IntStream VS for VS Arrays.binarySearch

IntStream 사용

 

for 사용
Arrays.binarySearch 사용

위의 시간을 비교 해보시면 작은 배열일 경우 for문을 사용한 것이 비교할 수 없을만큼 효율적인 것을 알 수 있습니다. 물론 순회해야할 배열의 수가 매우 크다면 다른 방법들이 더 좋을 것입니다.


알고리즘 초보가 정리한 글입니다

더 좋은 방법이나 코드에 대한 코멘트 언제나 환영합니다!

반응형