코딩테스트 38일차
직사각형 별찍기
이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.
process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
const n = data.split(" ");
const a = Number(n[0]), b = Number(n[1]);
for (let i = 0; i < b; i++) {
let row = "";
for (let j = 0; j < a; j++) {
row += "*";
}
console.log(row);
}
});
✏️풀이
process.stdin.setEncoding('utf8');: 입력 스트림의 인코딩을 UTF-8로 설정합니다. 이를 통해 유니코드 문자열을 올바르게 처리할 수 있습니다.
process.stdin.on('data', data => { ... });: 표준 입력으로 데이터를 받을 때의 동작을 정의하는 이벤트 핸들러입니다. 입력된 데이터를 data 매개변수로 받아 실행됩니다.
const n = data.split(" ");: 입력된 데이터를 공백을 기준으로 분할하여 배열로 저장합니다. 입력된 값이 "5 3"과 같이 공백으로 구분된 두 개의 정수로 이루어져 있다면, n은 ["5", "3"] 배열이 됩니다.
const a = Number(n[0]), b = Number(n[1]);: 분할된 배열 n의 첫 번째 요소를 가로의 길이를 나타내는 정수 a로 변환하고, 두 번째 요소를 세로의 길이를 나타내는 정수 b로 변환합니다.
for (let i = 0; i < b; i++) { ... }: 세로의 길이 b에 따라 반복문을 실행합니다. i는 0부터 b-1까지 증가합니다.
let row = "";: 현재 행의 문자열을 초기화합니다.
for (let j = 0; j < a; j++) { ... }: 가로의 길이 a에 따라 반복문을 실행합니다. j는 0부터 a-1까지 증가합니다.
row += "*";: 현재 행의 문자열에 별(*) 문자를 추가합니다.
console.log(row);: 현재 행의 문자열을 출력합니다.
내부 반복문이 종료되면 다음 행으로 이동하여 반복합니다. 모든 행이 출력될 때까지 반복합니다.
[카카오 인턴] 키패드 누르기
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
✏️풀이
function solution(numbers, hand) {
const keypad = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
['*', 0, '#']
];
let leftHand = '*';
let rightHand = '#';
let answer = '';
const getDistance = (x1, y1, x2, y2) => {
return Math.abs(x1 - x2) + Math.abs(y1 - y2);
};
const findHandPosition = num => {
for (let i = 0; i < keypad.length; i++) {
for (let j = 0; j < keypad[i].length; j++) {
if (keypad[i][j] === num) {
return { x: i, y: j };
}
}
}
};
const determineHand = (num, hand) => {
const { x, y } = findHandPosition(num);
if (num === 1 || num === 4 || num === 7) {
leftHand = num;
return 'L';
} else if (num === 3 || num === 6 || num === 9) {
rightHand = num;
return 'R';
} else {
const leftDistance = getDistance(x, y, findHandPosition(leftHand).x, findHandPosition(leftHand).y);
const rightDistance = getDistance(x, y, findHandPosition(rightHand).x, findHandPosition(rightHand).y);
if (leftDistance < rightDistance) {
leftHand = num;
return 'L';
} else if (leftDistance > rightDistance) {
rightHand = num;
return 'R';
} else {
if (hand === 'left') {
leftHand = num;
return 'L';
} else {
rightHand = num;
return 'R';
}
}
}
};
for (let i = 0; i < numbers.length; i++) {
answer += determineHand(numbers[i], hand);
}
return answer;
}
keypad 배열: 스마트폰 전화 키패드의 숫자들을 2차원 배열로 정의합니다.
leftHand와 rightHand 변수: 초기 왼손과 오른손의 위치를 나타냅니다.
getDistance 함수: 두 좌표 사이의 거리를 계산하여 반환하는 함수입니다.
findHandPosition 함수: 주어진 숫자의 키패드 상의 좌표를 찾아 객체 형태로 반환하는 함수입니다.
determineHand 함수: 숫자와 왼손잡이 여부를 기반으로 해당 숫자를 누를 때 왼손인지 오른손인지를 결정하는 함수입니다.
만약 숫자가 1, 4, 7 중 하나라면, 왼손을 사용하고 leftHand를 업데이트합니다.
만약 숫자가 3, 6, 9 중 하나라면, 오른손을 사용하고 rightHand를 업데이트합니다.
그 외의 경우, 주어진 숫자의 좌표와 왼손과 오른손의 위치 사이의 거리를 계산하여 가까운 손을 사용합니다. 거리가 같을 경우, 왼손잡이인 경우에는 왼손을, 오른손잡이인 경우에는 오른손을 사용합니다.
반복문을 통해 numbers 배열의 각 숫자를 순회하며 determineHand 함수를 호출하여 왼손인지 오른손인지를 결정하고, 결과를 answer 문자열에 추가합니다.
최종적으로 answer를 반환합니다.