[프로그래머스] lv.1 로또의 최고 순위와 최저 순위 (59%)

ayboori·2024년 7월 31일
0

Java Study

목록 보기
29/34

문제 설명

풀이 로직

  1. lottos의 값이 win_nums에 몇 개 있는지, 0의 값이 몇 개 있는지 확인
  2. 0이 모두 당첨일 때 / 모두 낙첨일 때 케이스 연산
  3. 2개 이하 당첨 시 6등
  4. 정답 배열에 담아 리턴

나의 풀이

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int max, min;
        int zeroCount = 0;
        int winningCount = 0;
            
        // lottos의 값이 win_nums에 몇 개 있는지, 0의 값이 몇 개 있는지 확인
        for(int num : lottos){
            if(num == 0){
                zeroCount++;
                continue;
            }
            
            for(int num2 : win_nums){
                if(num == num2){
                    winningCount++;
                    continue;
                }
            }
        }
        
        
        // 0이 모두 당첨일 때 / 모두 낙첨일 때 케이스 연산
        min = 7- winningCount; // 최소 당첨 시 등수
        max = 7- (winningCount + zeroCount); // 최대 당첨 시 등수
        
        // 2개 이하 당첨 시 6등
        if(max == 7)
            max = 6;
        if(min == 7)
            min = 6;
        
        // 정답 배열에 담고, 리턴
        
        int[] answer = {max, min};
        return answer;
    }
}

실행 시간

테스트 2 〉	통과 (0.02ms, 79.3MB)
테스트 3 〉	통과 (0.02ms, 79.4MB)
테스트 4 〉	통과 (0.02ms, 79.2MB)
테스트 5 〉	통과 (0.02ms, 74.2MB)
테스트 6 〉	통과 (0.03ms, 76.1MB)
테스트 7 〉	통과 (0.02ms, 67.6MB)
테스트 8 〉	통과 (0.01ms, 77.9MB)
테스트 9 〉	통과 (0.02ms, 72.3MB)
테스트 10 〉	통과 (0.01ms, 74.8MB)
테스트 11 〉	통과 (0.02ms, 74MB)
테스트 12 〉	통과 (0.01ms, 77.7MB)
테스트 13 〉	통과 (0.02ms, 76MB)
테스트 14 〉	통과 (0.01ms, 75.1MB)
테스트 15 〉	통과 (0.02ms, 66.6MB)

다른 사람의 풀이

Map / List 사용

Map을 사용하여 0이 아닌 로또의 값을 넣은 map을 생성
map.containsKey(winNum) 을 사용하여 값을 포함하는지 체크

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
        int zeroCount = 0;

        for(int lotto : lottos) {
            if(lotto == 0) {
                zeroCount++;
                continue;
            }
            map.put(lotto, true);
        }


        int sameCount = 0;
        for(int winNum : win_nums) {
            if(map.containsKey(winNum)) sameCount++;
        }

        int maxRank = 7 - (sameCount + zeroCount);
        int minRank = 7 - sameCount;
        if(maxRank > 6) maxRank = 6;
        if(minRank > 6) minRank = 6;

        return new int[] {maxRank, minRank};
    }
}

로또 검색 차별화

1) case 사용
2) rank를 배열에 미리 담아두기
3) Math.min 사용

int[] answer = {Math.min(7 - max, 6), Math.min(7 - min, 6)};

람다 사용

속도는 확실히 떨어진다...

class Solution {
    public int[] solution(int[] lottos, int[] winNums) {
        return LongStream.of(
                (lottos.length + 1) - Arrays.stream(lottos).filter(l -> Arrays.stream(winNums).anyMatch(w -> w == l) || l == 0).count(),
                (lottos.length + 1) - Arrays.stream(lottos).filter(l -> Arrays.stream(winNums).anyMatch(w -> w == l)).count()
        )
                .mapToInt(op -> (int) (op > 6 ? op - 1 : op))
                .toArray();
    }
}
profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

1개의 댓글

comment-user-thumbnail
2024년 8월 1일

TIL 너무 잘 작성해주셨군요! 앞으로도 꾸준히 작성해보아요~!

답글 달기