https://programmers.co.kr/learn/courses/30/lessons/42840
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 수포자 세명이 문제를 찍어서 풀었는데 누가 제일 많이 맞췄을까? - 주어진 자료는 무엇인가?
- 정답이 들어있는 배열 answers
- 수포자가 찍는 방식
- 수포자1 : 12345 반복
- 수포자2 : 21232425 반복
- 수포자3 : 3311224455 반복 - 조건은 무엇인가?
- 수포자는 세명이다
- 수포자들은 특정 숫자들을 반복하면서 찍는다
2. 계획
- 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
- 재귀
- 반복문
첫번째 풀이
- 수포자 3인방의 정답 찍기 패턴을 담은 배열을 만든다
- 이 배열들과 answers 배열을 서로 돌면서(?) 각 인덱스가 동일한 요소끼리 비교한다.
- 근데 수포자 3인방의 찍기 배열과 answers의 길이가 다 다르니까
- 예를들어서 answers = [1,2,3,4,5,6,7] 일때 수포자1의정답 = [1,2,3,4,5] -> 이 배열의 길이는 5
answers[5] = 수포자1의정답[0] = 수포자1의정답[answers의 인덱스5 % 수포자1배열의 길이5]
answers[6] = 수포자1의정답[1] = 수포자1의정답[answers의 인덱스6 % 수포자1배열의 길이5] - answers의 인덱스와 수포자 3인방의 찍기 배열 인덱스로 서로 비교하려면 수포자3인방의 비교 인덱스는 answers의 인덱스를 수포자3인방의 찍기 배열의 길이를 나눴을때 몫이 되겠다
- 요소가 같다면 count + 1
- 이때 카운트 값을 저장할 배열을 만들어야되겠다.
- 그리고 이 카운트 값들을 비교할 수 있는 함수를 새로 만들자
- 빈 배열을 만들고 winner
- 수포자는 3명이니까 카운트값을 담은 배열의 길이는 3일것이다
- 그러니까 카운트값을 담은 배열의 0번째랑 1번째랑 비교해서
- 0번째가 더 크면 winner에 [1]을 넣고
- 크기가 같다면 [1,2]를 넣고
- 1번째가 더 크면 winner에 [2]를 넣는다.
- 그다음에 winner에 담아둔 [0]번째 인덱스와 카운트값을 담은 배열의 2번째랑 비교한다.
- 그런데 winner에 담아둔 [0]번째 인덱스는 카운트값을 담은 배열의 인덱스 -1 이니까 비교할때 주의해야할듯,,?
- 쩄던 똑같이 비교해서 winner의 0번쨰수를 인덱스로하는 카운트 배열의 수와 카운트 배열[3]을 비교해서
- winner의 0번쨰수를 인덱스로하는 카운트 배열의 수 > 카운트 배열[3] => 그대로 winner 리턴
- winner의 0번쨰수를 인덱스로하는 카운트 배열의 수 = 카운트 배열[3] => winner + 3
- winner의 0번쨰수를 인덱스로하는 카운트 배열의 수 = 카운트 배열[3] => [3] 리턴
두번째 풀이 (7번까지는 동일)
- 카운트 값이 가장 많은 사람이 정답을 많이 맞춘 사람
- 카운트 값을 저장한 배열에서 가장 큰 숫자를 찾고
- 가장 큰 숫자를 가진 사람이 누군지 반복문 돌면서 찾아야된다
- 근데 리턴할때 수포자3명을 1,2,3 이런식으로 표현해야하니까,,,
- 반복문 돌면서 가장 큰 숫자가 카운트값을 저장한 배열의 요소와 일치하면
- 빈배열에 인덱스+1을 해주고
- 이 배열을 리턴
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
첫번째 풀이
const PersonOne = [1, 2, 3, 4, 5];
const PersonTwo = [2, 1, 2, 3, 2, 4, 2, 5];
const PersonThree = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
const solution = (answers) => {
const score = [0, 0, 0];
answers.forEach((answer, index) => {
if (answer === PersonOne[index % PersonOne.length]) score[0] += 1;
if (answer === PersonTwo[index % PersonTwo.length]) score[1] += 1;
if (answer === PersonThree[index % PersonThree.length]) score[2] += 1;
});
return finalSolution(score);
};
const finalSolution = (score) => {
let winner = [];
if (score[0] > score[1]) {
winner = [1];
} else if (score[0] === score[1]) {
winner = [1, 2];
} else {
winner = [2];
};
if (score[winner[0]-1] > score[2]) {
return winner;
} else if (score[winner[0]-1] === score[2]) {
return[...winner, 3];
} else {
return [3];
};
}
test('1번이 일등일때', () => {
expect(solution([1,2,3,4,5])).toEqual([1]);
});
두번째 풀이 (7번까지는 동일)
const PersonOne = [1, 2, 3, 4, 5];
const PersonTwo = [2, 1, 2, 3, 2, 4, 2, 5];
const PersonThree = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
const solution = (answers) => {
const score = [0, 0, 0];
answers.forEach((answer, index) => {
if (answer === PersonOne[index % PersonOne.length]) score[0] += 1;
if (answer === PersonTwo[index % PersonTwo.length]) score[1] += 1;
if (answer === PersonThree[index % PersonThree.length]) score[2] += 1;
});
return finalSolution(score);
};
const finalSolution = (score) => {
const topScore = Math.max(...score);
let winner = [];
score.forEach((num, index) => {
if (num === topScore) winner.push(index + 1);
})
return winner;
};
4. 반성
- 문제를 다른 방식으로 해결할 수 있는가?
- 첫번째 풀이를 재귀로 풀어볼 수 있을것같다. - 어떻게 하면 더 효율적으로 문제를 해결할 수 있는가?
- 조건을 버리고 풀었으면 더 단계적으로 풀어낼 수 있었을 것 같다.
Facts & Findings
첫번째 풀이 계획을 작성하고 풀어보니 코드가 너무 복잡했다.
그런데 이 부분을 어떻게 바꿀 수 있을지 생각이 나지 않아서 다른분의 도움을 받았다.
그렇게 해서 두번째 풀이 방법을 배울 수 있었다.
forEach 사용하는 법을 잘몰랐었다,,
그래서 항상 for문을 사용했었는데
오늘 한번 문제에 적용해보니 이해가 되었고 앞으로 for 대신 종종 써봐야겠다.
'코테연습' 카테고리의 다른 글
56. 폰켓몬 Javascript (0) | 2022.05.31 |
---|---|
55. 체육복 Javascript (0) | 2022.05.31 |
53. 문자열압축 Javascript (0) | 2022.05.27 |
52. K번째수 Javascript (0) | 2022.05.25 |
51. 위장 Javascript (0) | 2022.05.25 |
댓글