본문 바로가기

알고리즘/Programmers

[Programmers / Java] 로또의 최고 순위와 최저 순위

문제접근

배열을 모두 돌아서 0의 개수일치하는 개수를 모두 더하면 최고 순위가 되고

일치하는 개수만 본다면 최저 개수가 됩니다.

 

 

 

for(int i = 0; i < 6; i ++){
  //0의 갯수 알아내기
  if(lottos[i] ==0){
    high_num++;
  }

  for(int j =0; j < 6; j++){
    //같은 수가 있다면
    if(win_nums[i] == lottos[j]){
      high_num++;
      low_num++;
    }
  }
}

high_num에는 (0의 개수) + (일치하는 개수) 가 들어가고

low_num 에는 (일치하는 개수)만 들어갑니다.

 

여기서 주의해야할 것이

  • 배열의 모든 수가 다른 수 일 때
    ex)1,2,3,4,5,6 != 7,8,9,10,11,12
  • 모든 수가 0일 때
    ex)0,0,0,0,0,0

를 조심해야 합니다.

 

//맞는 것이 없다면 예외처리
if(low_num < 2){
	low_num = 1;	
}
if(high_num < 2){
	high_num =1;
}
안 맞은 수 맞은 수  등수
0 6 1
1 5 2
2 4 3
3 3 4
4 2 5
5 1 6

맞은 수가 2개 이하라면 등수는 무조건 6등이 되어야 합니다. 

int[] answer = {(6-high_num) + 1, (6-low_num) + 1};

이러한 식으로 answer를 반환해줍니다. 

 

다른 사람의 풀이를 보니 놀라웠습니다. 

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};
    }
}

map을 이용해서 containsKey()로 맵에서 인자로 보낸 키가 있으면 true 없으면 false를 반환합니다.

여기에서는 0의 개수와 맞은 개수를 더하고 7로 빼면 등수가 나온다는 것을 이용했습니다.

그리고 1개 이하로 0이 있거나, 정답과 맞으면 6등으로 반환하는 것을 볼 수 있습니다.

 

728x90