알고리즘/코딩 테스트

[코딩 테스트] 프로그래머스 JS 연습 - 연속된 수의 합, 평행, 최빈값 구하기,겹치는 선분의 길이,옹알이

Judith Hopps 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 하면 쉽게 풀 수 있다.

반응형