🧠 문제 요약
-
- N장의 카드가 1부터 N까지 순서대로 쌓여있을 때,
- 다음 동작을 카드가 1장 남을 때까지 반복한다
- 맨 위의 카드를 바닥에 버린다
- 그 다음 맨 위의 카드를 제일 아래로 옮긴다
- 입력: N (1 ≤ N ≤ 500,000)
- 출력: 마지막에 남는 카드의 번호
✅ 실행 예시 및 결과
입력: 6
출력: 4
✍️ 내 풀이
- 인덱스를 확용하여 실제 요소를 제거하지 않고 "가상 제거" 방식 사용
- start 변수로 현재 맨 앞 위치를 추적한다
💻 내가 푼 코드
const N = parseInt(require('fs').readFileSync('/dev/stdin').toString().trim());
const cards = [];
for(let i = 1; i <= N; i++) {
cards.push(i)
}
let start= 0;
while(cards.length - start > 1) {
start++;
cards.push(cards[start])
start++
}
console.log(cards[start])
📎 남이 푼 코드
const N = parseInt(require('fs').readFileSync(0, 'utf8').trim(), 10);
// 원형 버퍼 기반 덱 배열 (길이는 N 고정)
const deque = Array.from({ length: N }, (_, i) => i + 1);
let front = 0; // 현재 맨 앞 인덱스
let rear = N - 1; // 현재 맨 뒤 인덱스
let size = N; // 남아 있는 카드 수
while (size > 1) {
// 1) 맨 앞 카드 버리기
front = (front + 1) % N;
size--;
if (size > 1) {
// 2) 새로운 맨 앞 카드를 맨 뒤로 보내기
rear = (rear + 1) % N;
deque[rear] = deque[front]; // 맨 앞 값을 맨 뒤에 넣음
front = (front + 1) % N; // 앞에서 제거 처리
// size는 그대로 유지 (재배치니까 카드 수는 줄지 않음)
}
}
console.log(deque[front]);
- 덱(Deque) 자료구조를 원형 버퍼로 구현
- 배열 크기를 고정하고 앞/뒤 위치만 추적하는 방식
- front와 rear로 현재 앞뒤 위치를 가리킴
- % 연산으로 배열 끝에서 처음으로 돌아가는 원형 구조
- 실제 카드를 복사해서 뒤로 보내는 방식
- 배열이 커지지 않아서 메모리 효율 굳
🔍 회고 & 배운 점
- 처음에는 shift()와 push()로 구현하면 되겠다 했는데 시간초과로 연속된 실패;;;;;;
- 숫자가 작으면 괜찮은데 만 단위로 올라가면 shift()가 시간복잡도가 O(N)으로 실패....
- 인덱스로 접근해서 풀이 성공!!
- 덱 자료구조 방식 풀이는 처음 봤는데.... 공부하자 ㅋㅋ
반응형
'Study > Coding Test' 카테고리의 다른 글
[BaekJoon] 숫자 카드2(JavaScript) (1) | 2025.08.25 |
---|---|
[baekjoon] 괄호(JavaScript) (0) | 2025.08.23 |
[baekjoon] 수 찾기(JavaScript) (0) | 2025.08.21 |
[baekjoon] 체스판 다시 칠하기(JavaScript) (0) | 2025.08.20 |
[baekjoon] 좌표 정렬하기(JavaScript) (1) | 2025.08.19 |