코딩 공부/코딩테스트

자바스크립트 코딩테스트 입문 (20)

천서리 2023. 6. 4. 01:00
QUOTE THE DAY

“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 20 수학, 시뮬레이션, 문자열, 사칙연산

출처 : https://programmers.co.kr/

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


직사각형 넓이 구하기

문제

2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • dots의 길이 = 4
  • dots의 원소의 길이 = 2
  • -256 < dots[i]의 원소 < 256
  • 잘못된 입력은 주어지지 않습니다.

 

입출력 예

dots result
[[1, 1], [2, 1], [2, 2], [1, 2]] 1
[[-1, -1], [1, 1], [1, -1], [-1, 1]] 4

 

입출력 예 설명

 

입출력 예 #1

  • 좌표 [[1, 1], [2, 1], [2, 2], [1, 2]] 를 꼭짓점으로 갖는 직사각형의 가로, 세로 길이는 각각 1, 1이므로 직사각형의 넓이는 1 x 1 = 1입니다.

입출력 예 #2

  • 좌표 [[-1, -1], [1, 1], [1, -1], [-1, 1]]를 꼭짓점으로 갖는 직사각형의 가로, 세로 길이는 각각 2, 2이므로 직사각형의 넓이는 2 x 2 = 4입니다.

 

solution.js

function solution(dots) {
    var xCoords = [];
    var yCoords = [];

    for (var i = 0; i < 4; i++) {
        xCoords.push(dots[i][0]);
        yCoords.push(dots[i][1]);
    }

    var xMin = Math.min.apply(null, xCoords);
    var xMax = Math.max.apply(null, xCoords);

    var yMin = Math.min.apply(null, yCoords);
    var yMax = Math.max.apply(null, yCoords);

    var width = xMax - xMin;
    var height = yMax - yMin;
    var area = width * height;

    return area;
}
  1. 빈 배열인 xCoords와 yCoords를 선언합니다. 이 배열들은 주어진 점들의 x 좌표와 y 좌표를 각각 저장할 배열입니다.
  2. 반복문을 사용하여 dots 배열에서 점의 좌표를 추출하여 xCoords와 yCoords에 각각 추가합니다. 이 때, dots[i][0]는 i번째 점의 x 좌표를, dots[i][1]은 i번째 점의 y 좌표를 의미합니다. 반복문은 0부터 3까지 실행됩니다.
  3. Math.min.apply(null, xCoords)와 Math.max.apply(null, xCoords)를 사용하여 xCoords 배열의 최소값과 최대값을 구합니다. 마찬가지로, yCoords 배열의 최소값과 최대값도 구합니다. 이를 통해 사각형의 x 좌표 범위와 y 좌표 범위를 얻을 수 있습니다.
  4. xMax - xMin을 통해 가로 길이를 계산하고, yMax - yMin을 통해 세로 길이를 계산합니다.
  5. width * height를 통해 사각형의 넓이를 계산하고, 이 값을 area 변수에 할당합니다.
  6. 최종적으로 계산된 넓이인 area를 반환합니다.

위의 함수는 주어진 네 개의 점을 이용하여 만들어진 사각형의 넓이를 계산합니다. 네 개의 점은 dots 배열로 전달되며, 각 점은 [x, y] 형식의 좌표로 표현됩니다. 함수를 호출하면 사각형의 넓이가 반환됩니다.


캐릭터의 좌표

문제

머쓱이는 RPG게임을 하고 있습니다. 게임에는 updownleftright 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.

  • [0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.

 

 

제한사항

  • board은 [가로 크기, 세로 크기] 형태로 주어집니다.
  • board의 가로 크기와 세로 크기는 홀수입니다.
  • board의 크기를 벗어난 방향키 입력은 무시합니다.
  • 0 ≤ keyinput의 길이 ≤ 50
  • 1 ≤ board[0] ≤ 99
  • 1 ≤ board[1] ≤ 99
  • keyinput은 항상 up, down, left, right만 주어집니다.

 

입출력 예

keyinput dots result
["left", "right", "up", "right", "right"] [11, 11] [2, 1]
["down", "down", "down", "down", "down"] [7, 9] [0, -4]

 

입출력 예 설명

 

입출력 예 #1

  • [0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.

입출력 예 #2

  • [0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.

 

solution.js

function solution(keyinput, board) {
    var x = 0;
    var y = 0;

    for (var i = 0; i < keyinput.length; i++) {
        var direction = keyinput[i];

        if (direction === "up") {
            y += 1;
        } else if (direction === "down") {
            y -= 1;
        } else if (direction === "left") {
            x -= 1;
        } else if (direction === "right") {
            x += 1;
        }

        var maxX = Math.floor(board[0] / 2);
        var maxY = Math.floor(board[1] / 2);
        x = Math.max(-maxX, Math.min(x, maxX));
        y = Math.max(-maxY, Math.min(y, maxY));
    }

    return [x, y];
}
  1. x와 y 변수를 0으로 초기화합니다. 이 변수들은 캐릭터의 현재 좌표를 나타냅니다.
  2. 반복문을 사용하여 keyinput 배열의 각 요소에 접근합니다. keyinput은 키 입력을 저장한 배열입니다.
  3. 현재 반복 회차에서의 키 입력을 direction 변수에 저장합니다.
  4. direction의 값에 따라 캐릭터의 x, y 좌표를 이동시킵니다. "up"이면 y 좌표를 1 증가시키고, "down"이면 y 좌표를 1 감소시키고, "left"이면 x 좌표를 1 감소시키고, "right"이면 x 좌표를 1 증가시킵니다.
  5. 게임 맵의 크기를 벗어난 경우 좌표를 보정합니다. board 배열은 게임 맵의 크기를 나타내며, 첫 번째 요소는 x 좌표의 최대값, 두 번째 요소는 y 좌표의 최대값을 나타냅니다.
  6. x 좌표를 -maxX와 maxX 사이의 값으로 제한합니다. 즉, x 좌표가 maxX보다 크면 maxX로, -maxX보다 작으면 -maxX로 설정합니다. 이를 위해 Math.max와 Math.min 함수를 사용합니다. 같은 방식으로 y 좌표도 제한합니다.
  7. 반복문이 끝나면 최종적으로 캐릭터의 현재 좌표인 [x, y]를 반환합니다.

위의 함수는 keyinput 배열에 따라 캐릭터의 좌표를 이동시키는 기능을 수행합니다. keyinput 배열은 "up", "down", "left", "right"와 같은 문자열 값을 갖는 키 입력의 순서를 나타내며, 이에 따라 캐릭터의 좌표가 변경됩니다. board 배열은 게임 맵의 크기를 나타내는데, 좌표의 최대값을 제한하기 위해 사용됩니다. 함수를 호출하면 최종적으로 이동된 캐릭터의 좌표 [x, y]가 반환됩니다.


최댓값 만들기(2)

문제

정수 배열 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 입니다.

 

solution.js

function solution(numbers) {
    var maxProduct = numbers[0] * numbers[1];

    for (var i = 0; i < numbers.length - 1; i++) {
        for (var j = i + 1; j < numbers.length; j++) {
            var product = numbers[i] * numbers[j];
            if (product > maxProduct) {
                maxProduct = product;
            }
        }
    }

    return maxProduct;
}
  1. maxProduct 변수를 첫 번째 두 수의 곱으로 초기화합니다. 이 변수는 현재까지 찾은 최댓값을 유지합니다.
  2. 첫 번째 반복문은 배열의 첫 번째 수부터 끝에서 두 번째 수까지 반복합니다. i 변수는 첫 번째 수의 인덱스를 나타냅니다.
  3. 두 번째 반복문은 첫 번째 반복문의 다음 수부터 배열의 마지막 수까지 반복합니다. j 변수는 두 번째 수의 인덱스를 나타냅니다.
  4. 현재 반복 회차에서의 두 수를 곱한 값을 product 변수에 저장합니다.
  5. product가 현재까지의 최댓값인 maxProduct보다 크다면 maxProduct를 product로 업데이트합니다.
  6. 모든 반복이 완료되면 최종적으로 찾은 최댓값인 maxProduct를 반환합니다.

위의 함수는 중첩된 반복문을 사용하여 주어진 숫자 배열에서 두 수를 곱한 결과 중 최댓값을 찾는 알고리즘을 구현합니다. 함수를 호출하면 최대 곱을 반환합니다.


다향식 더하기

문제

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

 

 

제한사항

  • 0 < polynomial에 있는 수 < 100
  • polynomial에 변수는 'x'만 존재합니다.
  • polynomial은 양의 정수, 공백, ‘x’, ‘+'로 이루어져 있습니다.
  • 항과 연산기호 사이에는 항상 공백이 존재합니다.
  • 공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
  • 하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
  • " + 3xx + + x7 + "와 같은 잘못된 입력은 주어지지 않습니다.
  • 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"입니다.

 

solution.js

function solution(polynomial) {
    const arr = polynomial.split(" + ");
    const xNum = arr
                .filter(n => n.includes("x"))
                .map(n => n.replace('x', '') || '1')
                .reduce((acc, cur) => acc + parseInt(cur, 10), 0);
    const num = arr
                .filter(n => !isNaN(n))
                .reduce((acc, cur) => acc + parseInt(cur, 10), 0);

    let answer = [];
    if(xNum) answer.push(`${xNum === 1 ? "" : xNum}x`);
    if(num) answer.push(num);

    return answer.join(" + ");
}
  1. polynomial 문자열을 " + "를 기준으로 분할하여 배열 arr에 저장합니다. 이 배열은 각 항을 나타냅니다.
  2. arr 배열에서 "x"를 포함하는 요소만 필터링하여 새로운 배열을 생성합니다. 그리고 각 요소에서 "x"를 제거하고 남은 문자열을 가져옵니다. 만약 "x"만 남는 경우에는 "1"로 대체합니다. 그 후, 문자열을 정수로 변환하여 합을 계산합니다. 이 값을 xNum 변수에 저장합니다.
  3. arr 배열에서 숫자로 이루어진 요소만 필터링하여 새로운 배열을 생성합니다. 그리고 이 배열의 요소들을 정수로 변환하여 합을 계산합니다. 이 값을 num 변수에 저장합니다.
  4. 빈 배열인 answer를 선언합니다.
  5. xNum이 0이 아닌 경우, answer 배열에 ${xNum === 1 ? "" : xNum}x 형식의 문자열을 추가합니다. 이는 x의 계수를 나타내는데, 계수가 1인 경우에는 "x"만 추가하고 그 외의 경우에는 계수와 "x"를 함께 추가합니다.
  6. num이 0이 아닌 경우, answer 배열에 num을 추가합니다. 이는 상수항을 나타냅니다.
  7. answer 배열의 요소들을 " + "로 구분하여 문자열로 결합한 후 반환합니다.

위의 함수는 주어진 다항식을 단순화하여 나타내는 기능을 수행합니다. 다항식은 polynomial 문자열로 전달되며, 다항식 내에는 x의 계수와 상수항이 포함될 수 있습니다. 함수를 호출하면 단순화된 다항식을 나타내는 문자열이 반환됩니다.

반응형
Adventure Time - BMO