일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- case method
- 개발자
- 채권기초
- 주식기초
- 비전공자 개발
- 파생경제학
- 비전공자개발자
- 개발자되기
- 금융기초
- 코딩
- 경제학적설명
- 주식과채권
- 국내수출
- 바닐라자바스크립트
- 9급경제학
- 비전공자 코딩
- 콜드콜
- 경제학
- 경제학적개념
- 하버드MBA
- 파생상품
- 경제학기초
- 자바스크립트
- 케이스메소드
- 문과 개발
- 경제학적기초지식
- 배열메소드
- 파생금융
- 7급경제학
- devlift
- Today
- Total
deVSner
프로그래머스 완전탐색 모의고사 본문
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를 대신 할 수 있다.