본문 바로가기
알고리즘/프로그래머스

[프로그래머스 / 모의고사 / JAVA / 완전탐색]

by KDW999 2023. 3. 10.

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 접근

각 수포자 친구들의 답을 찍는 패턴에 따라 점수를 매기는 개별 반복문을 만들어주었음

핵심은 정답 갯수의 크기만큼 돌아가는 반복문에서 각 친구들의 찍는 패턴의 반복 주기가 돌아올 때 마다 반복문의 크기를 0으로 초기화해주고 정답 비교 횟수가 정답 갯수와 같아지면 반복문을 탈출하는 것

 

세 친구들의 순위를 메기는 기능을 일일이 다 나열하는 식 보단 뭔가 간단하게 만들고 싶었는데 떠오르지 않아서 모든 경우의 수를 다 적고 메서드로 따로 빼줬다.

class Solution {
    public int[] solution(int[] answers) {
	        
	        int[] supo1 = {1, 2, 3, 4, 5};
	        int[] supo2 = {2, 1, 2, 3, 2, 4, 2, 5};
	        int[] supo3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
	        
	        int score1 = 0;
	        int score2 = 0;
	        int score3 = 0;
	     
	        int check1 = 0; // 정답 비교 횟수
	        int check2 = 0;
	        int check3 = 0;
 	        	
	        	// 1수자 정답 확인
	        	for(int j=0; j<answers.length; j++) {
	        		
	        		if(check1==answers.length) break;
	        		if(j>= supo1.length) j=0;
	        		
	        		if(answers[check1] == supo1[j]) score1++;
                    check1++;
	        	}
	        	
	        	// 2수자 정답 확인
	        	for(int j=0; j<answers.length; j++) {
	        		
	        		if(check2==answers.length) break;
	        		if(j>= supo2.length) j=0;
	        		
	        		if(answers[check2] == supo2[j]) score2++;
	        		check2++;
	        	}
	        	
	        	// 3수자 정답 확인
	            for(int j=0; j<answers.length; j++) {
	            	
	            	if(check3==answers.length) break;
	            	if(j>= supo3.length) j=0;
	            	
	            	if(answers[check3] == supo3[j]) score3++;
	            	check3++;
	            }
	            
	            return ranking(score1, score2, score3);
	    }
	 
	 public int[] ranking(int score1, int score2, int score3) {

         // 세 수가 같을 때
         if(score1 == score2 && score2 == score3 &&  score1 == score3) {
         	int[] answer = {1,2,3};
         	return answer;
         }
         // 두 수가 같을 때
         else if(score1 == score2 && score1 > score3) {
         	int[] answer = {1,2};
         	return answer;
         }
         else if(score1 == score3 && score1 > score2) {
         	int[] answer = {1,3};
         	return answer;
         }
         else if(score2 == score3 && score2 > score1) {
         	int[] answer = {2,3};
         	return answer;
         }
         // 세 수가 다 다를 때
         else if(score1 > score2 && score1 > score3) {
         	int[] answer = {1};
         	return answer;
         }
         else if(score2 > score1 && score2 > score3) {
         	int[] answer = {2};
         	return answer;
         }
         else if(score3 > score1 && score3 > score2) {
         	int[] answer = {3};
         	return answer;
         }
         return null;
	 }
}

 

다른 사람 풀이

코드 해석하면서 나도 이렇게 깔끔하게 풀고싶다라는 생각이 들더라

class Solution{
public static int[] solution(int[] answers) {
		int[][] patterns = { 
				{ 1, 2, 3, 4, 5 }, // 0 1 2 3 4 순서
				{ 2, 1, 2, 3, 2, 4, 2, 5 }, 
				{ 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 } 
				}; // 수포자 친구들 답 찍는 패턴

		int[] hit = new int[3]; // 수포자 친구들 답안지
		for (int i = 0; i < hit.length; i++) {
			for (int j = 0; j < answers.length; j++) { // 답 갯수
				if (patterns[i][j % patterns[i].length] == answers[j]) // 답 찾기

					    // 1번 수포자 예시 answers = {1, 3, 2, 4, 2, 4, 3}일 경우
                        
//					       (0 % 5) → 패턴의 0번 째 요소 == answers [0] → 1
//					       (1 % 5) → 패턴의 1번 째 요소 == answers [1] → 3
//					       (2 % 5) → 패턴의 2번 째 요소 == answers [2] → 2
//					       (3 % 5) → 패턴의 3번 째 요소 == answers [3] → 4
//					       (4 % 5) → 패턴의 4번 째 요소 == answers [4] → 2
//					       (5 % 5) → 패턴의 0번 째 요소 == answers [5] → 4
//					       (6 % 5) → 패턴의 1번 째 요소 == answers [6] → 3
					// 어떻게 이런 생각을?
					
					hit[i]++;  // 1번 친구부터 맞을 때 마다 점수 증가
			}
		}

		int max = Math.max(hit[0], Math.max(hit[1], hit[2])); // 3명 중 가장 큰 점수
		
		List<Integer> list = new ArrayList<>();
		for (int i = 0; i < hit.length; i++)
			if (max == hit[i]) // 최고점이랑 같은 친구가 있다면
				list.add(i + 1); // 리스트에 그 친구 저장

		int[] answer = new int[list.size()]; // 최고점인 사람 수 만큼 생성
		
		int cnt = 0;
		for (int num : list) answer[cnt++] = num; // list에 있는 사람 번호 가져와서 answer 인덱스에 그 사람 번호 넣기
		
		return answer;
	}
  }

댓글