본문 바로가기
IT/Algorithm

프로그래머스(Programmers) 모의고사(java)

by flatsun 2019. 8. 20.
반응형

프로그래머스(Programmers)

문제명 : 모의고사

언어 : 자바(java)

 

1,2,3번 수포자가 찍는 방식에 대한 배열이 있고

답 배열을 받으면 1,2,3번 수포자 배열에 맞춰서

몇개 맞았는지를 비교한 후 오름차순 정렬해서 반환하는 문제인데

 

문제 자체는 그렇게 어렵지 않지만

문제는 코드를 짧게 만들 수 있을 것 같은데

 

난 그걸 못 찾겠더라

코드 짧게 어떻게 못할까 하다가 그냥 길게 해버렸는데 내 풀이내용은 다음과 같다

 

    public int[] solution(int[] answers) {
	    int[] supo1 = new int[] {1,2,3,4,5};
	    int[] supo2 = new int[] {2,1,2,3,2,4,2,5};
	    int[] supo3 = new int[] {3,3,1,1,2,2,4,4,5,5};
	    int supo1Index = 0;
	    int supo2Index = 0;
	    int supo3Index = 0;
	    int supo1answer = 0;
	    int supo2answer = 0;
	    int supo3answer = 0;
	    int maxVal = 0;
	    int maxCounter = 0;
	    
	    for(int i = 0; i<answers.length; i++) {
	    	// 값이 맞을 시 answer를 더해준다
	    	if(answers[i] == supo1[supo1Index]) {
	    		supo1answer++;
	    	}
	    	if(answers[i] == supo2[supo2Index]) {
	    		supo2answer++;
	    	}
	    	if(answers[i] == supo3[supo3Index]) {
	    		supo3answer++;
	    	}
	    	
	    	// 배열 다음 값으로 변환
	    	supo1Index = supo1Index+1;
	    	supo2Index = supo2Index+1;
	    	supo3Index = supo3Index+1;
	    	
	    	// 배열 처음으로
	    	if(supo1Index == 5) {
	    		supo1Index = 0;
	    	}
	    	if(supo2Index == 8) {
	    		supo2Index = 0;
	    	}
	    	if(supo3Index == 10) {
	    		supo3Index = 0;
	    	}
	    }
	    
	    // MAX VALUE 찾기
	    // 1. MAX VALUE를 찾는다
	    // 2. MAX VALUE가 몇갠지 확인한다
	    // 3. 차례대로 배열에 담는다
	    
	    // maxVal은 0에서 시작
	    if(maxVal <= supo1answer) { // 수포자1이 모두 틀릴수도 있음..
	    	maxVal = supo1answer;
	    	if(maxVal < supo2answer) {
	    		maxVal = supo2answer;
	    	}
	    	if(maxVal < supo3answer) {
	    		maxVal = supo3answer;
	    	}
	    }
	    
	    // MAX VALUE 갯수 확인
	    if(maxVal == supo1answer) {
	    	maxCounter = maxCounter + 1;
	    }
	    if(maxVal == supo2answer) {
	    	maxCounter = maxCounter + 1;
	    }
	    if(maxVal == supo3answer) {
	    	maxCounter = maxCounter + 1;
	    }
	    
	    if(maxVal == 0) {
	    	int[] answer = new int[] {1,2,3};
	    	return answer;
	    } else {
	    	// 오름차순 정렬할 필요 없이 차례대로 담아준다
	    	// MAX VALUE와 동일한 갯수로 배열 생성
	    	int[] answer = new int[maxCounter];
	    	// 배열에 담기
	    	int arrCounter = 0;
	    	if(maxVal == supo1answer) {
	    		answer[arrCounter] = 1;
	    		arrCounter++;
	    	}
	    	if(maxVal == supo2answer) {
	    		answer[arrCounter] = 2;
	    		arrCounter++;
	    	}
	    	if(maxVal == supo3answer) {
	    		answer[arrCounter] = 3;
	    		arrCounter++;
	    	}	 
	    	return answer;
	    }
    }	

무자비하게 긴데

 

먼저 for문을 돌려서 각 수포자별 맞은 갯수를 확인하는데

수포자별 패턴 배열이 다르므로 배열에 끝에 도달하면 0으로 바꿔서 계속 돌려준다

 

다음으로는 가장 많이 맞춘 사람을 찾아야 하는데

1과 2비교 2과 3비교 이런 식으로 최대값을 찾는다

 

그 이후로는 MaxValue와 수포자별 답 갯수를 비교해서

최고점자가 여러명인지 확인한다

 

마지막으로 모두 문제를 다 틀렸을 경우에는

모두가 최고점자인 것이 되므로 max 값이 0이면 1,2,3을 배열에 넣어 반환하고

 

그렇지 않을 경우에는 수포자 1,2,3 별로 확인해서 넣어준다

이렇게 하면 Arrays.sort로 오름차순 정렬을 해줄 필요가 없다

 

프로그래머스에서 바로 사용 가능한 코드는

아래 내용을 복사 붙여넣기로 가져가면 된다

class Solution {
    public int[] solution(int[] answers) {
	    int[] supo1 = new int[] {1,2,3,4,5};
	    int[] supo2 = new int[] {2,1,2,3,2,4,2,5};
	    int[] supo3 = new int[] {3,3,1,1,2,2,4,4,5,5};
	    int supo1Index = 0;
	    int supo2Index = 0;
	    int supo3Index = 0;
	    int supo1answer = 0;
	    int supo2answer = 0;
	    int supo3answer = 0;
	    int maxVal = 0;
	    int maxCounter = 0;
	    
	    for(int i = 0; i<answers.length; i++) {
	    	// 값이 맞을 시 answer를 더해준다
	    	if(answers[i] == supo1[supo1Index]) {
	    		supo1answer++;
	    	}
	    	if(answers[i] == supo2[supo2Index]) {
	    		supo2answer++;
	    	}
	    	if(answers[i] == supo3[supo3Index]) {
	    		supo3answer++;
	    	}
	    	
	    	// 배열 다음 값으로 변환
	    	supo1Index = supo1Index+1;
	    	supo2Index = supo2Index+1;
	    	supo3Index = supo3Index+1;
	    	
	    	// 배열 처음으로
	    	if(supo1Index == 5) {
	    		supo1Index = 0;
	    	}
	    	if(supo2Index == 8) {
	    		supo2Index = 0;
	    	}
	    	if(supo3Index == 10) {
	    		supo3Index = 0;
	    	}
	    }
	    
	    // MAX VALUE 찾기
	    // 1. MAX VALUE를 찾는다
	    // 2. MAX VALUE가 몇갠지 확인한다
	    // 3. 차례대로 배열에 담는다
	    
	    // maxVal은 0에서 시작
	    if(maxVal <= supo1answer) { // 수포자1이 모두 틀릴수도 있음..
	    	maxVal = supo1answer;
	    	if(maxVal < supo2answer) {
	    		maxVal = supo2answer;
	    	}
	    	if(maxVal < supo3answer) {
	    		maxVal = supo3answer;
	    	}
	    }
	    
	    // MAX VALUE 갯수 확인
	    if(maxVal == supo1answer) {
	    	maxCounter = maxCounter + 1;
	    }
	    if(maxVal == supo2answer) {
	    	maxCounter = maxCounter + 1;
	    }
	    if(maxVal == supo3answer) {
	    	maxCounter = maxCounter + 1;
	    }
	    
	    if(maxVal == 0) {
	    	int[] answer = new int[] {1,2,3};
	    	return answer;
	    } else {
	    	// MAX VALUE와 동일한 갯수로 배열 생성
	    	int[] answer = new int[maxCounter];
	    	// 배열에 담기
	    	int arrCounter = 0;
	    	if(maxVal == supo1answer) {
	    		answer[arrCounter] = 1;
	    		arrCounter++;
	    	}
	    	if(maxVal == supo2answer) {
	    		answer[arrCounter] = 2;
	    		arrCounter++;
	    	}
	    	if(maxVal == supo3answer) {
	    		answer[arrCounter] = 3;
	    		arrCounter++;
	    	}	 
	    	return answer;
	    }
    }
}
반응형

댓글