반응형
문제
- 문제 링크: 표 편집
해설
- 자료구조:
- 시간복잡도:
(풀이과정)
1)
2)
3)
4)
코드
(C언어)
solution 1)
더보기
solution 1
#include<>
solution 2)
더보기
#include<>
solution 3)
더보기
#include<>
(C++)
solution 1)
더보기
#include<>
solution 2)
더보기
#include<>
solution 3)
더보기
#include<>
(C#)
solution 1)
더보기
#include<>
solution 2)
더보기
#include<>
solution 3)
더보기
#include<>
(Java)
solution 1)
- N: 표의 행 길이
- 초기에 리스트를 초기화할 때 시간 복잡도: O(N)
- 제약사항을 보면 명령어 뒤의 X의 모든 합이 100만을 넘지 않는다고 했으므로 명렁어를 처리할 때 시간 복잡도는 O(1,000,000)
- 최종 시간 복잡도: O(N)
더보기
import java.util.Arrays;
import java.util.Stack;
class Solution {
public String solution(int n, int k, String[] cmd) {
// 삭제된 행의 인덱스를 저장하는 스택
Stack<Integer> deleted = new Stack<>();
// 각 행을 기준으로 연산에 따른 위치를 표시하기 위한 배열
int[] up = new int[n + 2];
int[] down = new int[n + 2];
for (int i = 0; i < n + 2; ++i) {
up[i] = i - 1;
down[i] = i + 1;
}
// 현재 위치를 나타내는 인덱스
k++;
// 주어진 명령어(cmd) 배열을 하나씩 처리
for (String c : cmd) {
// 현재 위치를 삭제하고 그 다음 위치로 이동
if (c.startsWith("C")) {
deleted.push(k);
up[down[k]] = up[k];
down[up[k]] = down[k];
k = n < down[k] ? up[k] : down[k];
}
// 가장 최근에 삭제된 행을 복원
else if (c.startsWith("Z")) {
int restore = deleted.pop();
down[up[restore]] = restore;
up[down[restore]] = restore;
}
// U 또는 D를 사용해 현재 위치를 위, 아래로 이동
else {
String[] s = c.split(" ");
int x = Integer.parseInt(s[1]);
for (int i = 0; i < x; ++i) {
k = s[0].equals("U") ? up[k] : down[k];
}
}
}
// 삭제된 행의 위치에 'X'를, 그렇지 않은 행의 위치에는 'O'를 저장한 문자열 반환
char[] answer = new char[n];
Arrays.fill(answer, 'O');
for (int i : deleted) {
answer[i - 1] = 'X';
}
return new String(answer);
}
}
solution 2)
더보기
#include<>
solution 3)
더보기
#include<>
(Python)
solution 1)
- N: 표의 행 길이
- 초기에 리스트 초기화: O(N^2)
- 명령어 뒤의 X의 모든 합이 100만을 넘지 않으므로 명령어 처리 시간복잡도: O(10^6)
- 최종시간복잡도: O(N)
더보기
def solution(n, k, cmd):
# 삭제된 행의 인덱스를 저장하는 리스트
deleted = []
# 링크드리스트에서 각 행 위아래의 행의 인덱스를 저장하는 리스트
up = [i - 1 for i in range(n + 2)]
down = [i + 1 for i in range(n + 1)]
# 현재 위치를 나타내는 인덱스
k += 1
# 주어진 명령어(cmd) 리스트를 하나씩 처리
for cmd_i in cmd:
# 현재 위치를 삭제하고 그 다음 위치로 이동
if cmd_i.startswith("C"):
deleted.append(k)
up[down[k]] = up[k]
down[up[k]] = down[k]
k = up[k] if n < down[k] else down[k]
# 가장 최근에 삭제된 행을 복원
elif cmd_i.startswith("Z"):
restore = deleted.pop()
down[up[restore]] = restore
up[down[restore]] = restore
# U 또는 D를 사용해 현재 위치를 위아래로 이동
else:
action, num = cmd_i.split()
if action == "U":
for _ in range(int(num)):
k = up[k]
else:
for _ in range(int(num)):
k = down[k]
# 삭제된 행의 위치에 'X'를, 그렇지 않은 행의 위치에 'O'를 포함하는 문자열 반환
answer = ["O"] * n
for i in deleted:
answer[i - 1] = "X"
return "".join(answer)
solution 2)
더보기
import
solution 3)
더보기
import
(JavaScript)
solution 1)
- N: 표의 행 길이
- 초기에 배열 초기화: O(N^2)
- 명령어 뒤의 X의 모든 합이 100만을 넘지 않으므로 명령어 처리 시간복잡도: O(10^6)
- 최종시간복잡도: O(N)
더보기
function solution(n, k, cmd) {
// 삭제된 행의 인덱스를 저장하는 배열
const deleted = [];
// 연결리스트에서 각 행 위아래의 행의 인덱스를 저장하는 배열
const up = [...new Array(n + 2)].map((_, i) => i - 1);
const down = [...new Array(n + 1)].map((_, i) => i + 1);
// 현재 위치를 나타내는 인덱스
k += 1;
// 주어진 명령어(cmd) 배열 요소를 하나씩 처리
for (const item of cmd) {
// 현재 위치를 삭제하고 그다음 위치로 이동
if (item[0] === "C") {
deleted.push(k);
up[down[k]] = up[k];
down[up[k]] = down[k];
k = n < down[k] ? up[k] : down[k];
}
// 가장 최근에 삭제된 행을 복원
else if (item[0] === "Z") {
const restore = deleted.pop();
down[up[restore]] = restore;
up[down[restore]] = restore;
}
// U 또는 D를 사용해 현재 위치를 위아래로 이동
else {
const [action, num] = item.split(" ");
if (action === "U") {
for (let i = 0; i < num; ++i) {
k = up[k];
}
} else {
for (let i = 0; i < num; ++i) {
k = down[k];
}
}
}
}
// 삭제된 행의 위치에 'X'를 그렇지 않은 행의 위치에 'O'를 포함하는 문자열 반환
const answer = new Array(n).fill("O");
for (const i of deleted) {
answer[i - 1] = "X";
}
return answer.join("");
}
solution 2)
더보기
import
solution 3)
더보기
import
반응형
'1-4. 코딩테스트 문제집(진행중) > PCCP(Lv3)' 카테고리의 다른 글
[PCCP] Lv3: 양과 늑대(92343) 해설 (0) | 2024.12.25 |
---|---|
[PCCP] Lv3: 섬 연결하기(42861) 해설 (0) | 2024.12.24 |
[PCCP] Lv3: 길 찾기 게임(42892) 해설 (0) | 2024.12.24 |
[PCCP] Lv3: 다단계 칫솔 판매(77486) 해설 (0) | 2024.12.24 |
[PCCP] Lv3: 베스트 앨범(42579) 해설 (0) | 2024.12.24 |