알고리즘/프로그래머스 문제풀이

[프로그래머스] 모의고사 java / 완전 탐색 / 완전 탐색 패턴은 나머지 연산자로

자바칩 프라푸치노 2021. 5. 27. 18:46

 

 

1. 문제 길이가 예시보다 더어어어길게 주어지면 정답은 패턴을 가지고 반복한다.

2. 몇 개 맞았는지를 카운트 한다.

3. 개수가 가장 많은 인덱스를 출력하도록 하겠다.

 

import java.util.*;

public class solution {

	
	public int[] solution(int[] answers) {
      int[][] patterns = {
    		  {1,2,3,4,5},
    		  {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]) {
				hit[i]++;
			}
		}
	}
      
      int max = Math.max(hit[0], Math.max(hit[1], hit[2]));
     
      List<Integer> list = new ArrayList<Integer>();
      for (int i = 0; i < hit.length; i++) {
		if (max == hit[i]) {
			list.add(i+1);
		}
	}
      int[] answer = new int[list.size()];
      for (int i = 0; i < answer.length; i++) {
		answer[i] = list.get(i);
	}
      return answer;
    }
    }

 


●풀이

먼저 정답 패턴을 이차원 배열로 나타냈다.

그리고 몇 개를 맞추었는지 정답 맞은 개수를 일차원 배열로 나타냈다.

 

파라미터로 주어진 answers의 인덱스가 수포자의 정답 패턴의 인덱스보다 높아지면 null point exception이 생길 것이다.

그러므로 패턴을 되돌아가도록 코드를 짜야하는데 그럴려면 나머지 연산자를 쓴다.

패턴의 길이만큼 나눠줘서 나머지의 index를 가리키면 된다.

예를들어서 1번 수포자의 패턴은 patterns[0][0]~ patterns[0][4] 까지인데

6번째 정답은 patterns[0][5]가 아니고 patterns[0][0]으로 돌아간다. 그러니까 나머지를 사용하는 것이다.

그래서 answers와 같으면 hit배열에 추가해준다.

 

 

셋중에 가장 큰 숫자를 찾는다

Math.max를 하면 둘 중에 더 큰 숫자를 리턴한다.

 

바로 answer배열에 넣지 않는 것은 answer배열의 크기가 어찌 될지 모르기 때문이다.

일단 list에 넣는다.

max ( 제일 많이 맞힌 개수) 를 가진 hit의 인덱스를 list에 넣는다

하지만 index는 0 부터 시작이므로 수포자 1 2 3 을 넣으려면 +1 을 한다

 

answer배열을 list의 사이즈만큼 정의해주고

answer에 아까 list에 넣었던 것을 차례대로 넣어준다.

728x90