players
와 해설진이 부른 이름을 담은 문자열 배열 callings
가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.players
의 길이 ≤ 50,000players[i]
는 i번째 선수의 이름을 의미합니다.players
의 원소들은 알파벳 소문자로만 이루어져 있습니다.players
에는 중복된 값이 들어가 있지 않습니다.players[i]
의 길이 ≤ 10callings
의 길이 ≤ 1,000,000callings
는 players
의 원소들로만 이루어져 있습니다.function solution(players, callings) {
const swapPlayer = (arr, index) => {
const prevPlayer = arr[index - 1];
const currPlayer = arr[index];
arr[index - 1] = currPlayer;
arr[index] = prevPlayer;
}
callings.forEach((calledPlayer) => {
const calledPlayerIndex = players.indexOf(calledPlayer);
if (calledPlayerIndex === 0) {
return;
}
swapPlayer(players, calledPlayerIndex);
});
return players;
}
function solution(players, callings) {
const playerIndice = {};
for (let index = 0; index < players.length; index++) {
playerIndice[players[index]] = index;
}
callings.forEach((calledPlayer, calledPlayerIndex) => {
const playerIndex = playerIndice[calledPlayer];
if (playerIndex > 0) {
const prevPlayer = players[playerIndex - 1];
players[playerIndex - 1] = calledPlayer;
players[playerIndex] = prevPlayer;
playerIndice[calledPlayer] = playerIndex - 1;
playerIndice[prevPlayer] = playerIndex;
}
});
return players;
}
storey
가 주어졌을 때, 0층으로 가기 위해 필요한 마법의 돌의 최소값을 return 하도록 solution 함수를 완성하세요.storey
≤ 100,000,0004function solution(storey) {
let answer = 100000000;
const dfs = (number, movement) => {
if (movement > answer) {
return;
}
if (number === 0) {
answer = Math.min(answer, movement);
return;
}
const digit = number % 10;
const quotient = Math.floor(number / 10);
dfs(quotient, movement + digit);
dfs(quotient + 1, movement + 10 - digit);
}
dfs(storey, 0);
return answer;
}
이 보드게임은 격자모양 게임판 위에서 말을 움직이는 게임으로, 시작 위치에서 목표 위치까지 최소 몇 번만에 도달할 수 있는지 말하는 게임입니다.
...D..R
.D.G...
....D.D
D....D.
..D....
여기서 "."은 빈 공간을, "R"은 로봇의 처음 위치를, "D"는 장애물의 위치를, "G"는 목표지점을 나타냅니다.
위 예시에서는 "R" 위치에서 아래, 왼쪽, 위, 왼쪽, 아래, 오른쪽, 위 순서로 움직이면 7번 만에 "G" 위치에 멈춰 설 수 있으며, 이것이 최소 움직임 중 하나입니다.
게임판의 상태를 나타내는 문자열 배열 board
가 주어졌을 때, 말이 목표위치에 도달하는데 최소 몇 번 이동해야 하는지 return 하는 solution함수를 완성하세요. 만약 목표위치에 도달할 수 없다면 -1을 return 해주세요.
board
의 길이 ≤ 100board
의 원소의 길이 ≤ 100board
의 원소의 길이는 모두 동일합니다.function solution(board) {
let answer = 0;
const queue = [];
const n = board.length;
const m = board[0].length;
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
const visited = Array.from({length: n}, () => new Array(m).fill(false));
board = board.map((str) => str.split(''));
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (board[i][j] === 'R') {
visited[i][j] = true;
queue.push([i, j, 0]);
}
}
}
while (queue.length) {
const size = queue.length;
for (let i = 0; i < size; i++) {
const [x, y, movement] = queue.shift();
for (let j = 0; j < dx.length; j++) {
let nx = x + dx[j];
let ny = y + dy[j];
while (nx >= 0 && nx < n && ny >= 0 && ny < m & board[nx][ny] !== 'D') {
nx += dx[j];
ny += dy[j];
}
nx -= dx[j];
ny -= dy[j];
if (board[nx][ny] === 'G') {
return movement + 1;
}
if (!visited[nx][ny]) {
visited[nx][ny] = true;
queue.push([nx, ny, movement + 1])
}
}
}
}
return -1;
}
numbers
가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.numbers
가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.numbers
의 길이 ≤ 1,000,000numbers[i]
≤ 1,000,000function solution(numbers) {
const findLargeNumber = (number, index) => {
for (let i = index + 1; i < numbers.length; i++) {
if (numbers[i] > number) {
return numbers[i];
}
}
return -1;
}
return numbers.map((number, index) => findLargeNumber(number, index));
}
function solution(numbers) {
const answer = new Array(numbers.length).fill(-1);
const stack = [];
for (let index = 0; index < numbers.length; index++) {
while (stack.length && numbers[stack.at(-1)] < numbers[index]) {
answer[stack.pop()] = numbers[index];
}
stack.push(index);
}
return answer;
}
topping
이 매개변수로 주어질 때, 롤케이크를 공평하게 자르는 방법의 수를 return 하도록 solution 함수를 완성해주세요.function solution(topping) {
let answer = 0;
const toppingCount = new Set(topping).size;
if (toppingCount % 2 !== 0) {
return -1;
}
for (let i = toppingCount / 2; i < topping.length; i++) {
const toppingCount1 = new Set(topping.slice(0, i)).size;
const toppingCount2 = new Set(topping.slice(i)).size;
if (toppingCount1 === toppingCount2) {
answer++;
}
}
return answer;
}
function solution(topping) {
let answer = 0;
const toppingMap = new Map();
const broTopping = new Map();
for (let curTopping of topping) {
toppingMap.set(curTopping, (toppingMap.get(curTopping) || 0) + 1);
}
for (let curTopping of topping) {
if (toppingMap.has(curTopping)) {
toppingMap.set(curTopping, toppingMap.get(curTopping) - 1);
}
broTopping.set(curTopping, 1);
if (!toppingMap.get(curTopping)) {
toppingMap.delete(curTopping);
}
if (toppingMap.size === broTopping.size) {
answer++;
}
if (broTopping.size > toppingMap.size) {
break;
}
}
return answer;
}
park
, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes
가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.park
의 길이 ≤ 50park[i]
의 길이 ≤ 50park[i]
는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.park
는 직사각형 모양입니다.routes
의 길이 ≤ 50routes
의 각 원소는 로봇 강아지가 수행할 명령어를 나타냅니다.routes
의 첫 번째 원소부터 순서대로 명령을 수행합니다.routes
의 원소는 "op n"과 같은 구조로 이루어져 있으며, - op는 이동할 방향, n은 이동할 칸의 수를 의미합니다.n
≤ 9function solution(park, routes) {
const directionObj = {
'N': [-1, 0],
'S': [1, 0],
'W': [0, -1],
'E': [0, 1]
};
const H = park.length;
const W = park[0].length;
let start;
const parkMap = park.map((str, strIndex) => {
if (!start) {
const startIndex = str.indexOf('S');
if (startIndex !== -1) {
start = [strIndex, startIndex];
}
}
return str.split('');
});
for (let route of routes) {
let [name, movement] = route.split(' ');
movement = Number(movement);
let x = start[0];
let y = start[1];
let canMove = true;
while (canMove && movement) {
x += directionObj[name][0];
y += directionObj[name][1];
if (x < 0 || x > H -1 || y < 0 || y > W -1 || parkMap[x][y] === 'X') {
canMove = false;
break;
}
movement--;
}
if (canMove) {
start[0] = x;
start[1] = y;
}
}
return start;
}