본문 바로가기
프로그래머스 코딩 테스트

프로그래머스 : JavaScript 알고리즘 100일 챌린지 22일차

by dongjin6539 2023. 6. 6.
728x90
반응형

프로그래머스 : JavaScript 알고리즘 100일 챌린지 22일차

 

코딩테스트 입문 Day22

 

 

1. 저주의 숫자3 : 3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.

10진 3x 마을에서 쓰는 숫자 10진법 3x 마을에서 쓰는 숫자
1 1 6 8
2 2 7 10
3 4 8 11
4 5 9 14
5 7 10 16

정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.

function solution(n) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
n result
15 25
40 76

 

답 확인하기
function solution(n) {
    let cnt = 0
    // n까지 반복
    for(let i = 1 ; i <= n ; i ++) {
        // i에 증가에 따른 cnt의 증가
        cnt++
        // 3이 들어가지 않으며, 3의 배수 또한 아닌 경우까지 반복
        while(cnt.toString().includes('3') || cnt%3 === 0) {
            cnt++
        }
    }
    return cnt;
}

 

2. 평행 : 점 네 개의 좌표를 담은 이차원 배열  dots가 다음과 같이 매개변수로 주어집니다.

  • [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]

주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.

function solution(dots) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
dots result
[[1, 4], [9, 2], [3, 8], [11, 6]] 1
[[3, 5], [4, 1], [2, 4], [5, 10]] 0

 

답 확인하기
function solution(dots) {
    // 직선의 기울기 (y1 - y2) / (x1 - x2)
    // 점을 잇는 경우의 수는 3개
    // 세 개면 다 하는게 빠를 것 같음
    let answer = 0;
    
    let a = Math.abs(dots[0][1] - dots[1][1]) / Math.abs(dots[0][0] - dots[1][0]);
    let b = Math.abs(dots[2][1] - dots[3][1]) / Math.abs(dots[2][0] - dots[3][0]);
    
    if (a - b === 0) {
        answer = 1;
    }
    
    let c = Math.abs(dots[0][1] - dots[2][1]) / Math.abs(dots[0][0] - dots[2][0]);
    let d = Math.abs(dots[1][1] - dots[3][1]) / Math.abs(dots[1][0] - dots[3][0]);
    
    if (c - d === 0) {
        answer = 1;
    }
    
    let e = Math.abs(dots[0][1] - dots[3][1]) / Math.abs(dots[0][0] - dots[3][0]);
    let f = Math.abs(dots[1][1] - dots[2][1]) / Math.abs(dots[1][0] - dots[2][0]);
    
    if (e - f === 0) {
        answer = 1;
    }
    
    return answer;
}

 

3. 겹치는 선분의 길이 : 선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.

lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.

function solution(lines) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
lines result
[[0, 1], [2, 5], [3, 9]] 2
[[-1, 1], [1, 3], [3, 9]] 0
[[0, 5], [3, 9], [1, 10]] 8

 

답 확인하기
function solution(lines) {
  var answer = 0;
  let lineMap = new Array(200);  // 선분들이 놓일 공간
  lineMap.fill(0);

  for (let i = 0; i < 3; i++) {
    let left = lines[i][0];
    let right = lines[i][1];

    for (let j = left; j < right; j++) {
      lineMap[j + 100] += 1;
    }
  }
    
  for (let i in lineMap) {
    if (lineMap[i] > 1) {
      answer += 1;
    }
  }

  return answer;
    
}

// fill : 배열의 시작 인덱스부터 끝 인덱스의 이전까지 정적인 값 하나로 채웁니다

 

4. 유한소수 판별하기 : 소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.

  • 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.

두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.

function solution(a, b) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
a b result
7 20 1
11 22 1
12
21 2

 

답 확인하기
function solution(a, b) {
    // 1. 최대공약수 g를 구한다.
    let g = 1;
    for (let i = 1; i<= b; i++){
        if(a%i ===0 && b%i ===0) g = i;
    }
    
    // 2. 분모 b를 최대공약수 g로 나눈다.
    b = b/g    

    // 3. b를 2와 5로 나눈 나머지 값이 0이 될 때까지 반복문을 실행한다.
    // (= 2와 5를 제외한 소수가 있는지 확인)
    while (b%2 === 0) b = b/2
    while (b%5 === 0) b = b/5

    // 4. b가 1이라면 유한소수이므로(분모의 소인수가 2와 5만 존재) 1을 리턴,
    // b가 그 외의 값이라면 무한소수이므로(분모에 2와 5를 제외한 소수가 포함) 2를 리턴한다.
    return b === 1? 1 : 2;
}

 

728x90
반응형