🌠 문제

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

기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • a, b는 정수
  • 0< a ≤ 1,000
  • 0 < b ≤ 1,000

🌠 입출력 예

a b result
7 20 1
11 22 1
12 21 2

🌠 입출력 예 설명

입출력 예 #1

  • 분수 7/20은 기약분수 입니다. 분모 20의 소인수가 2, 5 이기 때문에 유한소수입니다. 따라서 1을 return합니다.

입출력 예 #2

  • 분수 11/22는 기약분수로 나타내면 1/2 입니다. 분모 2는 소인수가 2 뿐이기 때문에 유한소수 입니다. 따라서 1을 return합니다.

입출력 예 #3

  • 분수 12/21는 기약분수로 나타내면 4/7 입니다. 분모 7은 소인수가 7 이므로 무한소수입니다. 따라서 2를 return합니다.

Hint

  • 분자와 분모의 최대공약수로 약분하면 기약분수를 만들 수 있습니다.
  • 정수도 유한소수로 분류합니다.

🧞 풀이

function solution(a, b) {
    // 최대 공약수 구하기
    let gcd = 1;
    for ( let i = 2; i <= Math.min(a, b); i ++ ){
        if (a % i === 0 && b % i === 0) {
            gcd = i;
        }
    }
    let new_a = a / gcd;
    let new_b = b / gcd;
    
    while (new_b % 2 == 0 && new_b != 1) {
        new_b = new_b / 2;
    }
    
    while (new_b % 5 == 0 && new_b != 1) {
        new_b = new_b / 5;
    }
    
    if (new_b === 1) {
        return 1;
    } else {
        return 2;
    }
}

🌠 문제

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

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

🌠 제한사항

  • dots의 길이 = 4
  • dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
  • 0 ≤ x, y ≤ 100
  • 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
  • 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
  • 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.

🌠 입출력 예

dots result
[[1, 4], [9, 2], [3, 8], [11, 6]] 1
[[3, 5], [4, 1], [2, 4], [5, 10]] 0

🌠 입출력 예 설명

입출력 예 #1

  • 점 [1, 4], [3, 8]을 잇고 [9, 2], [11, 6]를 이으면 두 선분은 평행합니다.

입출력 예 #2

  • 점을 어떻게 연결해도 평행하지 않습니다.

🧞 풀이

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;
}

🌠 문제

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 함수를 완성해주세요.

🌠 제한사항

  • 1 ≤ n ≤ 100

🌠 입출력 예

n result
15 25
40 76

🌠 입출력 예 설명

입출력 예 #1

  • 15를 3x 마을의 숫자로 변환하면 25입니다.

입출력 예 #2

  • 40을 3x 마을의 숫자로 변환하면 76입니다.

🧞 풀이

function solution(n) {
    let answer = 0;
    for (let i = 1; i <= n; i ++) {
        answer += 1;
        while (answer % 3 === 0 || answer.toString().split("").map(Number).includes(3)) {
            answer += 1;
        }
        console.log(i, "번째", answer)
    }
    return answer;
}

🌠 문제

PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • spell과 dic의 원소는 알파벳 소문자로만 이루어져있습니다.
  • 2 ≤ spell의 크기 ≤ 10
  • spell의 원소의 길이는 1입니다.
  • 1 ≤ dic의 크기 ≤ 10
  • 1 ≤ dic의 원소의 길이 ≤ 10
  • spell의 원소를 모두 사용해 단어를 만들어야 합니다.
  • spell의 원소를 모두 사용해 만들 수 있는 단어는 dic에 두 개 이상 존재하지 않습니다.
  • dic과 spell 모두 중복된 원소를 갖지 않습니다.

🌠 입출력 예

spell dic result
["p", "o", "s"] ["sod", "eocd", "qixm", "adio", "soo"] 2
["z", "d", "x"] ["def", "dww", "dzx", "loveaw"] 1
["s", "o", "m", "d"] ["moos", "dzx", "smm", "sunmmo", "som"] 2

🌠 입출력 예 설명

입출력 예 #1

  • "p", "o", "s" 를 조합해 만들 수 있는 단어가 dic에 존재하지 않습니다. 따라서 2를 return합니다.

입출력 예 #2

  • "z", "d", "x" 를 조합해 만들 수 있는 단어 "dzx"가 dic에 존재합니다. 따라서 1을 return합니다.

입출력 예 #3

  • "s", "o", "m", "d" 를 조합해 만들 수 있는 단어가 dic에 존재하지 않습니다. 따라서 2을 return합니다.

유의사항

  • 입출력 예 #3 에서 "moos", "smm", "som"도 "s", "o", "m", "d" 를 조합해 만들 수 있지만 spell의 원소를 모두 사용해야 하기 때문에 정답이 아닙니다.

🧞 풀이

function solution(spell, dic) {
    while (dic.length != 0) {
        let tmp = dic.shift();
        let cnt = 0;
        for (e in spell) {
            if (tmp.includes(spell[e])) {
                cnt += 1;
            }
        }
        if (cnt === spell.length) {
            return 1;
        }
    }
    return 2;
}

🌠 문제

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • sides의 원소는 자연수입니다.
  • sides의 길이는 2입니다.
  • 1 ≤ sides의 원소 ≤ 1,000

🌠 입출력 예

sides result
[1, 2] 1
[3, 6] 5
[11, 7] 13

🌠 입출력 예 설명

입출력 예 #1

  • 두 변이 1, 2 인 경우 삼각형을 완성시키려면 나머지 한 변이 2여야 합니다. 따라서 1을 return합니다.

입출력 예 #2

  • 가장 긴 변이 6인 경우
    될 수 있는 나머지 한 변은 4, 5, 6 로 3개입니다.
    나머지 한 변이 가장 긴 변인 경우
    될 수 있는 한 변은 7, 8 로 2개입니다.
    따라서 3 + 2 = 5를 return합니다.

입출력 예 #3

  • 가장 긴 변이 11인 경우
    될 수 있는 나머지 한 변은 5, 6, 7, 8, 9, 10, 11 로 7개입니다.
    나머지 한 변이 가장 긴 변인 경우
    될 수 있는 한 변은 12, 13, 14, 15, 16, 17 로 6개입니다.
    따라서 7 + 6 = 13을 return합니다.

🧞 풀이

function solution(sides) {
    // 오름차순 정렬
    sides.sort((a, b) => a - b);
    // 가장 긴 변의 길이가 sides[0] + sides[1]보다 작아야 할 때의 최소 정수
    let h = sides[0] + sides[1] - 1;
    // 가장 긴 변의 길이가 sides[1]일 때의 최소 정수,
    let l = sides[1] - sides[0] + 1;
    // l <= x <= h기 때문에, h - l + 1
    return h - l + 1;
}

🌠 문제

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.


지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • 제한사항
  • board는 n * n 배열입니다.
  • 1 ≤ n ≤ 100
  • 지뢰는 1로 표시되어 있습니다.
  • board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

🌠 입출력 예

board result
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] 16
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] 13
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] 0

🌠 입출력 예 설명

입출력 예 #1

  • (3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return합니다.

입출력 예 #2

  • (3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return합니다.

입출력 예 #3

  • 모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return합니다.

🧞 풀이

function solution(board) {
    // 정답을 담을 변수 선언
    let answer = 0;
    // 1이 있는 좌표 기준으로 위험지역을 -1로 변환함
    for (let i = 0; i < board.length; i++) {
        for (let j = 0; j < board.length; j++) {
            if (board[i][j] === 1) {
                for (let k = -1; k <= 1; k++) {
                    for (let l = -1; l<= 1; l++) {
                        if (board[i+k] && board[j+l] && board[i+k][j+l] === 0) {
                            board[i+k][j+l] = -1;
                        }
                    }
                }
            }
        }
    }
    // 다시 2차원 배열을 탐색하면서 0의 갯수를 찾음
    for (let i = 0; i < board.length; i++) {
        for (let j = 0; j < board.length; j++) {
            if (board[i][j] === 0) {
                answer += 1;
            }
        }
    }
    
    return answer;
}

🌠 문제

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • 1 ≤ my_string 안의 자연수 ≤ 1000
  • 연속된 수는 하나의 숫자로 간주합니다.
  • 000123과 같이 0이 선행하는 경우는 없습니다.
  • 문자열에 자연수가 없는 경우 0을 return 해주세요.

🌠 입출력 예

my_string result
"aAb1B2cC34oOp" 37
"1a2b3c4d123Z" 133

🌠 입출력 예 설명

입출력 예 #1

  • "aAb1B2cC34oOp"안의 자연수는 1, 2, 34 입니다. 따라서 1 + 2 + 34 = 37 을 return합니다.

입출력 예 #2

  • "1a2b3c4d123Z"안의 자연수는 1, 2, 3, 4, 123 입니다. 따라서 1 + 2 + 3 + 4 + 123 = 133 을 return합니다.

🧞 풀이

function solution(my_string) {
    let answer = 0;
    let regex = /[^0-9]/g;
    let array = my_string.replace(regex, " ").split(" ").filter(e => e != "");
    while (array.length != 0) {
        let tmp = array.shift();
        answer += Number(tmp);
    }
    return answer;
}

🌠 문제

한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.

🌠 제한사항

  • 0 < polynomial에 있는 수 < 100
  • polynomial에 변수는 'x'만 존재합니다.
  • polynomial은 0부터 9까지의 정수, 공백, ‘x’, ‘+'로 이루어져 있습니다.
  • 항과 연산기호 사이에는 항상 공백이 존재합니다.
  • 공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
  • 하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
  • " + 3xx + + x7 + "와 같은 잘못된 입력은 주어지지 않습니다.
  • "012x + 001"처럼 0을 제외하고는 0으로 시작하는 수는 없습니다.
  • 문자와 숫자 사이의 곱하기는 생략합니다.
  • polynomial에는 일차 항과 상수항만 존재합니다.
  • 계수 1은 생략합니다.
  • 결괏값에 상수항은 마지막에 둡니다.
  • 0 < polynomial의 길이 < 50

🌠 입출력 예

polynomial result
"3x + 7 + x" "4x + 7"
"x + x + x" "3x"

🌠 입출력 예 설명

입출력 예 #1

  • "3x + 7 + x"에서 동류항끼리 더하면 "4x + 7"입니다.

입출력 예 #2

  • "x + x + x"에서 동류항끼리 더하면 "3x"입니다.

🧞 풀이

function solution(polynomial) {
    // 숫자형이 아닌 경우 전체 탐색
    let regex = /[^0-9]/g;
    // x, y, 상수 계수
    let x = 0;
    let y = 0;
    let r = 0;
    // " + " 기준으로 배열으로 변환
    let array = polynomial.split(" + ");
    // 하나씩 shift() 하여, 조건에 따른 계수 할당
    while (array.length != 0) {
        let tmp = array.shift();
        if (tmp.includes("x")) {
            if (tmp === "x") {
                x += 1;
            } else {
                let add_tmp = tmp.replace(regex, "");
                x += Number(add_tmp);
            }
        } else if (tmp.includes("y")) {
            if (tmp === "y") {
                y += 1;
            } else {          
                let add_tmp = tmp.replace(regex, "");
                y += Number(add_tmp);
            }
        } else {
            r += Number(tmp);
        }
    }
    // 계수와 변수 합치기 과정
    let x_array = [];
    let y_array = [];
    if (x === 0) {
        
    } else if (x === 1) {
        x_array.push("x");
    } else {
        x_array.push(x);
        x_array.push("x");
    }
    if (y === 0) {
        
    } else if (y === 1) {
        y_array.push("y");
    } else {
        y_array.push(y);
        y_array.push("y");
    }
    
    // 각 계수 + 변수 배열 합치기
    let x_join = x_array.join("");
    let y_join = y_array.join("");
    
    let answer = []
    
    if (x_join) {
        answer.push(x_join);
    }
    if (y_join) {
        answer.push(y_join);
    }
    if (r != 0) {
        answer.push(r);
    }
    return answer.join(" + ");
}

ㅋㅋㅋㅋㅋㅋ 아니, 문제를 잘 읽자...

문제에 있지도 않은 y 계수는 왜 넣었지.

쉐도우 복싱 미쳤네..

🌠 문제

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • -10,000 ≤ numbers의 원소 ≤ 10,000
    2 ≤ numbers 의 길이 ≤ 100

🌠 입출력 예

numbers result
[1, 2, -3, 4, -5] 15
[0, -31, 24, 10, 1, 9] 240
[10, 20, 30, 5, 5, 20, 5] 600

🌠 입출력 예 설명

입출력 예 #1

  • 두 수의 곱중 최댓값은 -3 * -5 = 15 입니다.

입출력 예 #2

  • 두 수의 곱중 최댓값은 10 * 24 = 240 입니다.

입출력 예 #3

  • 두 수의 곱중 최댓값은 20 * 30 = 600 입니다.

🧞 풀이

function solution(numbers) {
    // 양수는 양수끼리, 음수는 음수끼리 곱해야 최댓값이 됨
    // 고로 다른 배열에 따로 나눠서 곱셈을 할 것
    let plus = [];
    let minus = [];
    while (numbers.length != 0 ){
        let tmp = numbers.shift();
        if (tmp === Math.abs(tmp)) {
            plus.push(tmp);
        } else {
            minus.push(tmp);
        }
    }
    if (plus.length === 0) {
        minus.sort((a, b) => a - b);
        return minus[0] * minus[1];
    } else if (minus.length === 0) {
        plus.sort((a, b) => b - a);
        return plus[0] * plus[1];
    } else if (minus.length === 1 && plus.length === 1) {
        plus.sort((a, b) => a - b);
        return plus[0] * minus[0];
    } else if (minus.length === 1) {
        plus.sort((a, b) => b - a);
        return plus[0] * plus[1];
    } else if (plus.length === 1) {
        minus.sort((a, b) => a - b);
        return minus[0] * minus[1];
    } else {
        plus.sort((a, b) => b - a);
        minus.sort((a, b) => a - b);
        return plus[0] * plus[1] > minus[0] * minus[1] ? plus[0] * plus[1] : minus[0] * minus[1]
    } 
}

// 아 배열이 null이 될 때, 조금 더 세련되게 처리할 수 있었을텐데,
// 화장실이 너무 급해서 머릿속이 복잡해져 비효율적으로 케이스 나눠서 처리한 것 같다.

+ Recent posts