본문 바로가기

코딩테스트/프로그래머스

[Java][프로그래머스-코딩테스트 level1] 로또의 최고 순위와 최저 순위

o 요구사항

두 int형 배열 lottos, win_nums 을 매개값으로 받아 가능한 순위 --> b

일치하는 개수 만큼 순위가 올라간다

단 알아볼 수 없는 번호인 0의 개수 만큼 올라갈 수 있는 순위 --> a

정수형 배열 [a, b] 반환하기

 

 

o 코드진행

다른 방법들도 많지만 해당 문제는 import 없이 배열만 사용하였다.

필요한 메소드를 생성하여 인자값과 반환값 단계별로 넣는 방식으로 풀이하였다.

 

 

 

o 코드설계

1. 배열의 요소를 크기별로 정렬하여 배열을 리턴하는 메소드

2. 두 배열 값 비교하여 일치하는 값 반환하는 메소드

3. 배열의 요소 중 0이 포함된 개수를 반환하는 메소드

4. 로또 맞은 개수를 인자값으로 순위를 반환하는 메소드

5. 현재 순위와 0개수를 인자값으로 받아 가능한 순위를 반환하는 메소드

 

 

o 완성코드

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
    	int zeroCount = arrayZeroCount(arraySort(lottos));
    	int same = arrayCompare(arraySort(lottos), arraySort(win_nums));    	
    	int[] answer = new int[] {rankChance(lottoRank(same), zeroCount), lottoRank(same)};
    	        
        return answer;
    }    

    //배열 정렬하기
	int[] arraySort(int[] arrayA){
    	for(int i=0; i<arrayA.length-1; i++) {
        	for(int j=i+1; j<arrayA.length; j++) {
        		if(arrayA[i] >= arrayA[j] ) {
					int temp = arrayA[i];
					arrayA[i] = arrayA[j];
					arrayA[j] = temp;					 
        		}
        	}
        }
    	return arrayA;
    }
	
	//두 배열을 받아 일치하는 개수 세기
	int arrayCompare(int[] arrayA, int[] arrayB) {
		int count = 0;
		int start = 0;
		for(int i=0; i<arrayA.length; i++) {
			for(int j=start; j<arrayB.length; j++) {
				if(arrayA[i] == arrayB[j]) {
					start = j+1;
					count++;
					break;
				}				
			}
		}
		return count;
	}
		
	//배열 element 중 0개수 반환
	int arrayZeroCount(int[] arrayA) {
		int count = 0;
		
		for(int i=0; i<arrayA.length; i++) {
			if(arrayA[i] == 0) {
				count++;
			}
			if(arrayA[i] > 0) {
				return count;
			}
		}		
		return count;
	}
	
	//로또 맞은 개수에서 순위계산하기
	int lottoRank(int count){
		int rank = 0;
		if(count < 2) {
			return 6;
		}
		rank = 7 - count;
		return rank;
	}
	
	//현재 순위와 0개수 인자값. 순위 가능성 반환
	int rankChance(int rank, int zeroCount) {
		int chance = 1;
		chance = rank - zeroCount;
		if(chance < 1){
			return 1;
		};	
		return chance;
	}	
}