deVSner

프로그래머스 완전탐색 모의고사 본문

자료구조 및 알고리즘/완전탐색

프로그래머스 완전탐색 모의고사

RudeofSun 2020. 6. 21. 08:43

1. 문제

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.   

(하략) 

 

 

2. 문제 이해

처음에, 입출력 예가 이해가 가질 않았었다. 너무 새벽에 문제를 봐서 그런가...ㅋㅋㅋ

첫 번째 포인트로는, 수포자들의 찍는 패턴을 파악하는 거였다.

수포자1의 패턴은 1 2 3 4 5 ... 였고, 수포자2의 패턴은 2 1 2 3 2 4 2 5 ... 순이었다. (수포자3 생략)

문제에서 주어진 조건으로는, 시험 문제는 10,000까지 구성될 수 있다고 나왔었다. 그러면, 수포자의 찍는 패턴을 10,000개까지 비교할 수 있게 조작하는 것이 필요해 보였다 - 나머지 정리

 

두 번째 포인트로는, 가장 높은 점수를 받는 사람이 한 명이 아닐 경우였다.

이를 위해, 처음에 든 생각은 새로운 변수를 하나 선언하여서, 거기에 0을 할당하고, 이 변수를 통해 각 수포자들의 점수를 비교하여서 높은 순대로 다시 재할당하려고 했었다.

하지만, 첫 번째 포인트를 고민하다가, 처음 고안한 아이디어가 별로라는 것을 꺠닫고.....ㅠㅠ

각 수포자들의 정답 갯수를 새로운 변수에 각각 담아서, 그것을 그대로 Math.max하면 비교 변수를 만들 수 있을 거 같았다. 

이 비교 변수를 통해서 각 수포자들의 정답과 일치하는지를 파악하여서, 일치한다면, answer에 넣어주면 될 터였다!!

 

 

3. 해결 과정

3 - 1. answers와 수포자들 간의 정답 갯수 도출하기

수포자들보다 긴 길이의 answers가 나온다면? - 수포자들의 답을 배열로 놓은 뒤, 나머지 정리를 통해서 무한순회를 한다. 

예를 들어, answers에서 filter를 걸었다면, 콜백함수의 2번째 매개변수로 index를 준다. 수포자들의 배열에서, anwers의 콜백함수 index에 따른 나머지가 같은 것끼리 비교를 할 수 있다. 

filter를 통해 나온 배열의 길이가 해당 수포자의 정답 갯수다.

 

3 - 2. 수포자들간의 정답 갯수 중 가장 많이 맞춘 수포자를 도출하기 (비교 변수 선언 및 할당)

1 - 1의 과정에서, 각 수포자들의 정답 갯수만을 새로운 배열에 담아도 되고, 새로운 변수에 담아도 된다.

새로운 변수에 담아서 Math.max하는 방식을 취했다. 이 때, 1 - 3을 위해서 Math.max의 값을 비교 변수에 담았다.

 

3 - 3. 정답 갯수가 동일할 시, 처리 과정

만약, 비교 변수(Math.max가 담긴)가 각 수포자들의 정답 갯수와 동일하다면, answer에 해당 인덱스를 + 1하여 넣어준다.

 

 

4. 다른 사람 풀이 분석

처음 시작할 때, let count = [ 0, 0, 0 ] , 이렇게 각 수포자의 순서대로 점수가 나오게 선언 및 할당을 했다.

answer의 인덱스 값과 각 수포자들 간의 값이 동일하다면, count변수에서 값이 ++ 되는 꼴이다.

어떻게 이런 생각을 했지?..ㅋㅋㅋ

 

5. 반성

length를 단순 '길이' 판단용으로만 생각하지 말자.

count를 대신 할 수 있다.