-
[코딩 테스트] 프로그래머스 JS 연습 - 연속된 수의 합, 평행, 최빈값 구하기,겹치는 선분의 길이,옹알이알고리즘/코딩 테스트 2023. 1. 24. 16:39
1. 연속된 수의 합
문제 설명연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
function solution(num, total) { const min = (total / num) - (num-1)/2 return new Array(num).fill(min).map((v,i)=> v+i) }
처음 이 문제를 풀었을 때, 가운데 숫자를 Math.floor(total/num)으로 구한 뒤 arr에 push하는 방식으로 풀었다.
하지만 , 이 문제는 min부터 하나씩 더하는 것이 좋다.
참고로! new Array가 아닌 Array만 써도 가능하다.
2. 최빈값 구하기
문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
function solution(array) { let m = new Map(); for (let n of array) m.set(n, (m.get(n) || 0)+1); console.log(m) // Map(4) { 1 => 1, 2 => 1, 3 => 3, 4 => 1 } m = [...m].sort((a,b)=>b[1]-a[1]); console.log(m) //[ [ 3, 3 ], [ 1, 1 ], [ 2, 1 ], [ 4, 1 ] ] return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1; }
이 문제는 차마 풀지 못해서 해답을 보았다.
map에서 저런 기능이 있다는 것을 처음 알았다...!!
- map.set(key, value) – key를 이용해 value를 저장합니다.
- map.get(key) – key에 해당하는 값을 반환합니다. key가 존재하지 않으면 undefined를 반환합니다.
array를 하나씩 돌면서 기존 키값에서 +1을 하는 코드를 map에 넣는다.
m.set으로 앞에 두었기 때문에 이전에 {key:value}는 없어진다.
3. 겹치는 선분의 길이
문제 설명
선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
function solution(lines) { let line = new Array(200).fill(0); // 라인 범위의 line 배열을 0으로 채움 // lines의 원소가 -100~100까지 이므로 200으로 채움 lines.forEach(([a, b]) => { for(; a < b; a++) { // lines 배열에 line이 있는 원소에 1씩 추가 line[a+100]++; } }); // 배열을 돌며 1보다 큰(겹쳐진) 라인이 몇개인지 a에 누적 시킴 return line.reduce((a, c) => c > 1 ? a + 1 : a, 0) }
line[a+100]인 이유는 -100의 위치는 arr[0]이기 때문이다.
4. 옹알이
문제 설명
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
function solution(babbling) { var answer = 0; while (babbling.length) { let b = babbling.pop(); // 연속되는 발음은 패스 b = b.replaceAll("aya",1).replaceAll("ye",1) .replaceAll("woo",1).replaceAll("ma",1); b = b.replaceAll(/[\d]/g,''); if (b.length ===0) answer+=1; } return answer; }
처음에 for(let s of babbling) 으로 돌리려고 했지만, s가 변하지 않아서 pop() 메소드를 이용했다.
5. 평행
문제 설명
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
- [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
function solution(dots) { let arr = []; for (let i = 0 ; i < dots.length;i++) { for (let j = i+1; j < dots.length ;j++) { var 기울기 = (dots[i][1]-dots[j][1]) / (dots[i][0]-dots[j][0]); if (arr.includes(기울기)) return 1; else arr.push(기울기) } } return 0; }
처음에 let arr 대신 const set = new Set()으로 했다가 문제를 어렵게 풀게 되었다.
arr.includes를 이용해서 return 하면 쉽게 풀 수 있다.
'알고리즘 > 코딩 테스트' 카테고리의 다른 글