코딩테스트 20일차
직사각형 넓이 구하기
2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.
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;
}
✏️풀이
함수 solution은 dots라는 매개변수를 받습니다. dots는 네 개의 좌표를 담은 2차원 배열입니다. 코드 내에서 사용할 x 좌표와 y 좌표를 추출하기 위해 빈 배열 xCoords와 yCoords를 선언합니다.
그리고 반복문을 사용하여 dots 배열에 저장된 네 개의 좌표에서 x 좌표와 y 좌표를 추출하여 각각 xCoords와 yCoords 배열에 추가합니다. dots[i][0]는 dots 배열의 i번째 요소에서 x 좌표를 나타내고, dots[i][1]은 y 좌표를 나타냅니다.
다음으로, xCoords 배열에서 최솟값과 최댓값을 각각 xMin과 xMax에 저장하고, yCoords 배열에서 최솟값과 최댓값을 각각 yMin과 yMax에 저장합니다. Math.min.apply(null, xCoords)는 xCoords 배열의 최솟값을 구하는 함수이며, Math.max.apply(null, xCoords)는 xCoords 배열의 최댓값을 구하는 함수입니다.
이렇게 구한 최솟값과 최댓값은 각각 x 좌표의 범위인 xMin과 xMax, 그리고 y 좌표의 범위인 yMin과 yMax를 나타냅니다.
다음으로, xCoords 배열에서 최솟값과 최댓값을 각각 xMin과 xMax에 저장하고, yCoords 배열에서 최솟값과 최댓값을 각각 yMin과 yMax에 저장합니다. Math.min.apply(null, xCoords)는 xCoords 배열의 최솟값을 구하는 함수이며, Math.max.apply(null, xCoords)는 xCoords 배열의 최댓값을 구하는 함수입니다.
이렇게 구한 최솟값과 최댓값은 각각 x 좌표의 범위인 xMin과 xMax, 그리고 y 좌표의 범위인 yMin과 yMax를 나타냅니다.
캐릭터의 좌표
머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.
function solution(keyinput, board) {
var answer = [[0, 0]]; // 시작 위치 [0, 0]를 answer 배열에 추가
var x = 0; // 캐릭터의 x 좌표
var y = 0; // 캐릭터의 y 좌표
for (var i = 0; i < keyinput.length; i++) {
var direction = keyinput[i];
// 방향키에 따라 x, y 좌표 갱신
if (direction === "up") {
y += 1;
} else if (direction === "down") {
y -= 1;
} else if (direction === "left") {
x -= 1;
} else if (direction === "right") {
x += 1;
}
// 유효한 위치인지 확인
if (Math.abs(x) <= board[0] / 2 && Math.abs(y) <= board[1] / 2) {
answer.push([x, y]);
} else {
// 유효하지 않은 위치라면 이전 좌표로 되돌리기
if (direction === "up") {
y -= 1;
} else if (direction === "down") {
y += 1;
} else if (direction === "left") {
x += 1;
} else if (direction === "right") {
x -= 1;
}
}
}
return answer[answer.length - 1];
}
✏️풀이
answer 배열을 초기화하고 시작 위치 [0, 0]를 배열에 추가합니다. 이 배열은 캐릭터의 이동 경로를 저장하는 역할을 합니다.
x와 y 변수를 선언하고 0으로 초기화합니다. 이 변수는 캐릭터의 현재 위치를 나타냅니다.
keyinput 배열을 순회하면서 각 방향키에 따라 x와 y 좌표를 갱신합니다. "up"이면 y를 1만큼 증가시키고, "down"이면 y를 1만큼 감소시키고, "left"이면 x를 1만큼 감소시키고, "right"이면 x를 1만큼 증가시킵니다.
갱신된 x와 y 좌표가 유효한 위치인지 확인합니다. 유효한 위치인 경우 해당 좌표를 answer 배열에 추가합니다.
유효하지 않은 위치인 경우, 이전 좌표로 되돌려야 합니다. 이전 좌표로 되돌리기 위해 현재 방향키에 따라 y 값을 조정합니다. "up"이면 y를 1만큼 감소시키고, "down"이면 y를 1만큼 증가시킵니다. 마찬가지로 "left"이면 x를 1만큼 증가시키고, "right"이면 x를 1만큼 감소시킵니다.
모든 방향키를 처리한 후, answer 배열의 마지막 요소인 [x, y]를 반환합니다. 이는 캐릭터의 최종 위치를 나타냅니다.
최댓값 만들기 (2)
정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
function solution(numbers) {
var maxProduct = -Infinity;
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;
}
✏️풀이
maxProduct 변수를 -Infinity로 초기화합니다. 이 변수는 최댓값을 저장하는 역할을 합니다. -Infinity로 초기화하는 이유는 배열 numbers의 모든 숫자가 음수일 수도 있기 때문에 0 또는 양수로 초기화하면 최댓값을 올바르게 구할 수 없습니다.
첫 번째 반복문에서는 i를 0부터 numbers.length - 2까지 반복합니다. 이는 첫 번째 숫자를 선택하는 인덱스입니다. 왜냐하면 두 번째 숫자는 첫 번째 숫자 이후의 인덱스에서 선택되기 때문에, 첫 번째 숫자를 선택하는 인덱스는 배열 길이에서 1을 뺀 값까지만 반복하면 됩니다.
두 번째 반복문에서는 j를 i + 1부터 numbers.length - 1까지 반복합니다. 이는 두 번째 숫자를 선택하는 인덱스입니다. 첫 번째 숫자 이후의 인덱스부터 끝까지 반복하면 됩니다.
내부 반복문에서는 numbers[i]와 numbers[j]를 곱하여 product 변수에 저장합니다.
product와 maxProduct를 비교하여 product가 더 크면 maxProduct를 product로 갱신합니다.
반복문이 종료되면 maxProduct 변수에는 numbers 배열에서 가능한 모든 숫자 쌍의 곱 중 최댓값이 저장됩니다.
maxProduct를 반환합니다. 이 값은 주어진 배열 numbers에서 두 개의 숫자를 선택하여 곱한 값 중에서 최댓값입니다.
다항식 더하기
한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.
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(" + ");
}
✏️풀이
주어진 다항식을 "+"를 기준으로 분리하여 배열 arr에 저장합니다.
그 다음, arr 배열을 순회하면서 "x"를 포함하는 항들을 필터링하고, "x"를 제거한 뒤 숫자로 변환합니다. 만약 "x"가 없는 경우, 기본값으로 1을 사용합니다. 그리고 이들을 모두 더하여 xNum 변수에 저장합니다.
그 후, arr 배열을 순회하면서 숫자인 항들을 필터링하고, 이들을 모두 더하여 num 변수에 저장합니다.
answer 배열을 생성한 뒤, xNum이 0이 아닌 경우 "x"를 추가합니다. 이때, xNum이 1인 경우는 빈 문자열로 처리합니다. 그리고 num이 0이 아닌 경우에는 num을 추가합니다.
최종적으로, answer 배열을 " + "로 구분하여 문자열로 변환한 뒤 반환합니다.