-
[인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션2Algorithm 2022. 2. 3. 13:45
*7개 문제 중 2개 못 풀었음 (22.02.02)
1) 큰 수 출력하기
function solution(arr) { let answer = []; answer.push(arr[0]); // arr의 0번째 인덱스는 무조건 들어가서 먼저 넣어줌 for(let i=0; i < arr.length; i++) { if(arr[i] < arr[i+1]) { answer.push(arr[i+1]); } } return answer; } let arr = [7, 3, 9, 5, 6, 12]; console.log(solution(arr));
2) 보이는 학생
function solution(arr) { let answer = 1; // 제일 처음에 있는 1명은 보임 let max = arr[0]; // 제일 처음에 있는 사람의 키 for(let i=0; i<arr.length; i++){ if(arr[i] > max) { max = arr[i]; answer++; } } return answer; } let arr = [130, 135, 148, 140, 145, 150, 150, 153]; console.log(solution(arr));
=> answer 는 5를 반환
*여기서 진짜 기본적인 실수를... if문을 두 줄로 써두고 코드를 줄여보겠다고 중괄호를 안했다. 당연히 조건이 두 줄이니까 코드가 정상적으로 돌아가지 않았다. 창피하지만, 다시는 반복하면 안되니까 기록.
function solution(arr) { let answer = 1; // 제일 처음에 있는 1명은 보임 let max = arr[0]; // 제일 처음에 있는 사람의 키 for(let i=0; i<arr.length; i++){ if(arr[i] > max) max = arr[i]; answer++; } return answer; } let arr = [130, 135, 148, 140, 145, 150, 150, 153]; console.log(solution(arr));
=> answer 는 9를 반환
3) 가위 바위 보
function solution(a, b) { let answer = ""; for(let i=0; i < a.length; i++) { if(a[i] === 3 && b[i] === 1 || a[i] === 1 && b[i] === 3) { if (a[i] > b[i]) answer += "B"; if (a[i] < b[i]) answer += "A"; } else { if (a[i] > b[i]) answer += "A"; if (a[i] < b[i]) answer += "B"; if (a[i] === b[i]) answer += "D"; } } return answer; } let a = [2, 3, 3, 1, 3]; let b = [1, 1, 2, 2, 3]; console.log(solution(a, b));
4) 점수 계산
function solution(arr) { let answer = 0 let cnt = 0; for(let i=0; i < arr.length; i++) { if(arr[i] === 0) cnt = 0; // 점수가 0일 경우 cnt를 0으로 초기화 else if(arr[i] === 1) { cnt++; answer += cnt; } } return answer; } let arr = [1, 0, 1, 1, 1, 0, 0, 1, 1, 0]; console.log(solution(arr));
5) 등수 구하기
동점 있을 경우에는 같은 등수로 출력
ex) const arr = [92, 92, 92, 100, 76] 일 경우 2 2 2 1 5 로 출력
function solution(arr) { let answer = ""; for(let i = 0; i < arr.length; i++) { // i를 고정시켜두고 let cnt = 1; for(let j = 0; j < arr.length; j++) { // j를 돌며 비교 if(arr[j] > arr[i]) cnt++; } answer += cnt + " "; } return answer; } const arr = [87, 89, 92, 100, 76]; console.log(solution(arr)); // 4 3 2 1 5
*강사님 코드
- 나는 출력 결과에 배열 표시가 없길래 문자열로 표시했는데, 그 부분 빼고는 비슷한 로직이다.
Array.from()으로 arr의 길이인 n 만큼 배열 생성 후 1로 초기화 했던 부분이 인상적이다.
function solution(arr) { let n = arr.length; let answer = Array.from({length: n}, () => 1); for(let i=0; i<n; i++) { for(let j=0; j<n; j++) { if(arr[j] > arr[i]) answer[i]++; } } return answer; } const arr = [87, 89, 92, 100, 76]; console.log(solution(arr));
6) 격자판 최대합
- 행과 열의 합계 구하기까지 하고, 그 다음은 어떻게 구현해야하나 고민하다가 강의를 보고 이해했다.
비슷한 문제를 만났을 때 기억할 수 있도록 그림을 그려왔다.. ㅎㅎ
*강사님 코드
- 나는 sum을 첫번째 for문 안에 뒀었는데, 강사님은 전역으로 빼고 필요할 때 초기화해서 쓰는 방식으로 구현하셨다.
Math.max를 이용해서 가장 큰 값을 answer에 담는 것도 생각하지 못했던 방법인데 좋은 것 같다.
function solution(arr) { let answer = Number.MIN_SAFE_INTEGER; let n = arr.length; let sum1 = sum2 = 0; // 행과 열의 합 for(let i=0; i<n; i++) { sum1 = sum2 = 0; // 행과 열이 바뀌기 전 초기화 for(let j=0; j<n; j++) { sum1 += arr[i][j]; sum2 += arr[j][i]; } answer = Math.max(answer, sum1, sum2); } sum1 = sum2 = 0; // 대각선의 합 구하기 전 초기화 // 대각선의 합 for(let i=0; i<n; i++) { sum1 += arr[i][i]; sum2 += arr[i][n-i-1]; } answer = Math.max(answer, sum1, sum2); return answer; } let arr = [[10, 13, 10, 12, 15], [12, 39, 30, 23, 11], [11, 25, 50, 53, 15], [19, 27, 29, 37, 27], [19, 13, 30, 13, 19]]; console.log(solution(arr));
7) 봉우리
👉한 바퀴 돌고 와서 다시 풀기
*강사님 코드
function solution(arr) { let answer = 0; // 카운팅 let n = arr.length; let dx = [-1, 0, 1, 0]; // 행 증감 let dy = [0, 1, 0, -1]; // 열 증감 for(let i=0; i<n; i++) { for(let j=0; j<n; j++) { let flag=1; // 봉우리 여부 판단 for(let k=0; k<4; k++) {// 상하좌우 비교 let nx=i+dx[k]; // 행 좌표 let ny=j+dy[k]; // 열 좌표 if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny]>=arr[i][j]) { // 봉우리 판단, 인덱스 범위(- 불가): nx>=0 && nx<n && ny>=0 && ny<n flag = 0; // 봉우리가 아닐 경우 break; // 크거나 같은 수 발견 시 반복할 필요 없으니까 } } if (flag) answer++; } } return answer; } let arr = [[5, 3, 7, 2, 3], [3, 7, 1, 6, 1], [7, 2, 5, 3, 4], [4, 3, 6, 4, 1], [8, 7, 3, 5, 2]]; console.log(solution(arr));
'Algorithm' 카테고리의 다른 글
[백준 알고리즘] 10773번: 제로 (JavaScript) (0) 2022.02.09 [인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션3 (0) 2022.02.06 [이론] 삼각형의 결정 조건 (0) 2022.01.30 [인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션1 (0) 2022.01.30 [백준 알고리즘] 1316번: 그룹 단어 체커 (JavaScript - 실패코드) (0) 2022.01.16