728x90
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/81303
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
구조화
실패 코드 때도 클래스를 만들어서 썼기 때문에 기왕 클래스 쓰는거 잘 활용해보자
기존에 idx, origin은 현재 위치와 원본 위치를 비교
바뀐 코드에선 node 배열로 원본 위치를 보존
클래스에서 나의 앞 뒤 위치 저장
삭제면 삭제 다음 위치를 next로 가리키게!
소스 코드
import java.util.*;
class Solution {
static class Node {
int prev, next;
boolean isDeleted;
public Node(int prev, int next) {
this.prev = prev;
this.next = next;
this.isDeleted = false;
}
}
public String solution(int n, int k, String[] cmd) {
Node[] nodes = new Node[n];
for (int i = 0; i < n; i++) {
nodes[i] = new Node(i - 1, i + 1);
}
nodes[n - 1].next = -1; // 마지막 노드 처리
Stack<Integer> removed = new Stack<>();
int cur = k;
int x;
for (String str : cmd) {
String[] parts = str.split(" ");
char action = parts[0].charAt(0);
switch (action) {
case 'U':
x = Integer.parseInt(parts[1]);
while (x-- > 0) cur = nodes[cur].prev;
break;
case 'D':
x = Integer.parseInt(parts[1]);
while (x-- > 0) cur = nodes[cur].next;
break;
case 'C':
removed.push(cur);
nodes[cur].isDeleted = true;
if (nodes[cur].prev != -1)
nodes[nodes[cur].prev].next = nodes[cur].next;
if (nodes[cur].next != -1)
nodes[nodes[cur].next].prev = nodes[cur].prev;
cur = (nodes[cur].next != -1) ? nodes[cur].next : nodes[cur].prev;
break;
case 'Z':
int r = removed.pop();
nodes[r].isDeleted = false;
if (nodes[r].prev != -1) nodes[nodes[r].prev].next = r;
if (nodes[r].next != -1) nodes[nodes[r].next].prev = r;
break;
}
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < n; i++) {
result.append(nodes[i].isDeleted ? 'X' : 'O');
}
return result.toString();
}
}
실패 코드
문제점: ArrayList를 직접 만들어서 삭제, 조회를 하니깐 시간이 오래 걸림 + 인덱스 관리 제대로 안됨
import java.util.*;
class Solution {
static class Node {
int idx;
int origin;
public Node(int idx, int origin) {
this.idx = idx;
this.origin = origin;
}
}
public String solution(int n, int k, String[] cmd) {
char[] c = new char[n];
Arrays.fill(c, 'O');
Stack<Node> s = new Stack<>();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(i);
}
int x = 0;
for (int i = 0; i < cmd.length; i++) {
switch(cmd[i].charAt(0)) {
case 'U':
x = cmd[i].charAt(2) - '0';
k -= x;
//System.out.println(k+" "+list.size());
break;
case 'D':
x = cmd[i].charAt(2) - '0';
k += x;
//System.out.println(k+" "+list.size());
break;
case 'C':
s.add(new Node(k, list.get(k)));
list.remove(k);
if (k == list.size()) k--;
//System.out.println(k+" "+list.size());
break;
case 'Z':
int tmp = s.pop().idx;
if (k > tmp) k++;
list.add(tmp, tmp);
//System.out.println(k+" "+list.size());
break;
}
}
while (!s.isEmpty()) {
c[s.pop().origin] = 'X';
}
String answer = String.valueOf(c);
return answer;
}
}
'Algorithm > 프로그래머스' 카테고리의 다른 글
[플머] 메뉴 리뉴얼 📝 (Java) (2) | 2024.11.23 |
---|---|
[플머] 전력망을 둘로 나누기 ⚡️ (Java) (0) | 2024.11.22 |
[플머] 체육복 🏋️♀️ (Java) (0) | 2024.05.08 |
[플머] 폰켓몬 🐰 (Java) (0) | 2024.05.04 |
[플머] 스킬트리 🌲 (Java) (0) | 2024.05.03 |