728x90

이번에 소개할 문제는 로또의 최고 순위와  최저 순위를 찾는 문제이다.

 

해당 문제는 로또 6/45는 1부터 45까지의 숫자 중 6개를 찍어 맞히는 복권이고,

1등은 6개, 2등은 5개, 3등은 4개, 4등은 3개, 5등은 2개 그 외에는 전부 6등이라는 규칙과, 일부 번호가 지워져 지워진 번호는 0으로 표기하고 0으로 표기된 수와 매칭 되는 숫자를 가지고 최저 순위와 최고 순위를 알아내라는 것이 이번 문제다.

 

우선 기본으로 주어지는 paramiter들을 확인해보자.

class Solution {
	public int[] solution(int[] lottos, int[] win_nums) {
    	int[] answer = {};
    }
}

라는 코드가 주워지게 된다. 

 

이때 lottos는 본인이 작성한 로또 번호 + 지워진 숫자 포함 6자리가 들어오고, win_nums는 당첨번호 6자리가 서로 무작위로 들어오게된다.

 

문제를 보면 우선 몇 개가 당첨번호인지 찾아보도록 하는 것이 중요하다 생각해서 찾아본다.

for(int myNum: lottos) {
	// myNum : 본인이 작성한 번호
}

해당 코드를 보면 본인이 작성한 로또 번호가 어떤 번호인지 알기 위해 반복문을 사용해 값을 알아내도록 하였다.

 

이제 반복문이 돌면서 값이 나올 텐데 이때 등수를 알기 위해선 맞춘 숫자 + 지워진 숫자가 몇 개인지가 필요하다 생각하여 해당 갯수를 체크 할 수 있는 변수를 선언하였다.

int win = 0;
int zero = 0;

for(int a : lottos) {

}

 

또한 반복문을 돌면서 지워진 숫자를 굳이 당첨번호와 비교를 할 필요는 없다 생각하여 제어문을 사용하여 걸러줌과 동시에 count집계를 시작한다.

int win = 0;
int zero = 0;

for(int a : lottos) {

    if (a == 0) {
        zero++;
    }
    else {
        //로또 번호와 matching을 진행할 번호들
    }
    
}

 

이제 당첨번호가 몇개인지 알아보자.

int win = 0;
int zero = 0;

for(int a : lottos) {

    if (a == 0) {
        zero++;
    }
    else {
        for (int b : win_nums) {
            if (b == a) {
                win++;
            }
        }
    }

}

번호를 일일이 비교하면서 집계를 늘려주어 당첨된 번호가 몇 개인지 알 수 있게 하였다.

 

이제 최고 순위와 최저 순위를 구해야 하는데 

순위는 아까 말했듯 등수의 조건은 정해져 있으니 맞춘 번호와 지워진 번호로 구해야 한다.

 

최저 순위부터 구하자면 지워진 번호가 모두 틀렸을 경우를 가장해보자 그러면 맞춘 번호의 개수가 최대 갯수가 돼버리게 된다.

 

이때 다맞으면 count가 6일테니 -6을 해주면 index순번으로 따졌을 때 0,1,2,3,4,5의 순위가 나오게 되고 1을 더해 실제 순위로 만들어준다. 

int first = Math.abs(win + zero - 6);
int second = Math.abs(win - 6);

//최고 순위
answer[0] = first < 5 ? first + 1 : 6;

//최저 순위
answer[1] = second < 5 ? second + 1 : 6;

 

이때 0개일때와 1개일때는 자동으로 6등이 되니 삼항연산자를 사용하여 계산을 하였다.

 


해당 문제를 풀면서 직접적으로 코드를 풀어보고 싶어 최대한 풀어서 작성해 보았다.

 

무엇보다 순위 계산을 할때 min과 max를 사용하여 연산하는 방법도 있는것을 확인하고 더 가독성이 좋은 방법을 고민해보아야겠다는 반성을 하였다.

728x90

+ Recent posts