https://school.programmers.co.kr/learn/courses/30/lessons/81303
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
// 인덱스로 계산하되, 해당 인덱스의 위 아래에 있는 애들로 저장
// 각 행을 기준으로 연산이 수행된 후의 위치를 표시
// 삭제 시 삭제한 행의 down을 윗 행의 down에, 삭제한 행의 up을 아래 행의 up에
// 복구 시 삭제한 행 값을 삭제한 행 윗 행 down과 아래 행 up에
function solution(n, k, cmd) {
const deleted = []; // 삭제된 행의 인덱스 저장
const answer = Array(n).fill('O'); // 초기 상태 배열
// 연결 리스트 초기화: 각 행의 위/아래를 저장
const up = Array.from({ length: n }, (_, i) => i - 1); // i번째 행 위의 행
const down = Array.from({ length: n }, (_, i) => i + 1); // i번째 행 아래의 행
down[n - 1] = -1; // 마지막 행 아래는 없음
let currentIdx = k; // 현재 위치
for (const command of cmd) {
if (command.startsWith('C')) {
// 삭제 명령어
deleted.push(currentIdx);
answer[currentIdx] = 'X';
// 연결 갱신
if (up[currentIdx] !== -1) down[up[currentIdx]] = down[currentIdx];
if (down[currentIdx] !== -1) up[down[currentIdx]] = up[currentIdx];
// 현재 위치 이동
currentIdx = down[currentIdx] !== -1 ? down[currentIdx] : up[currentIdx];
} else if (command.startsWith('Z')) {
// 복원 명령어
const restore = deleted.pop();
answer[restore] = 'O';
// 연결 복원
if (up[restore] !== -1) down[up[restore]] = restore;
if (down[restore] !== -1) up[down[restore]] = restore;
} else {
// 이동 명령어
const [direction, steps] = command.split(' ');
const move = Number(steps);
for (let i = 0; i < move; i++) {
currentIdx = direction === 'U' ? up[currentIdx] : down[currentIdx];
}
}
}
return answer.join('');
}
연결리스트와 인덱스를 활용하여 풀었다.
'코딩테스트 > Programmers' 카테고리의 다른 글
베스트 앨범 (JS) (1) | 2025.01.06 |
---|---|
오픈 채팅방 (JS) (1) | 2025.01.06 |
크레인 인형 뽑기 (JS) (0) | 2025.01.05 |
방문 길이 (JS) (0) | 2025.01.05 |
실패율 (JS) (0) | 2025.01.05 |