📍 문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/81303
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 접근
기존의 행번호를 기억해야된다는 생각에 List랑 Map, Stack을 사용해서 풀려고 했다.
복원하는 과정에서 서로의 연결지점을 변경하는 부분이 문제가 있었다.
잘 안풀려서 타 블로그를 참고를 했다.
리스트 자체를 조작하지 않고 사용여부로 판단한다면 서로 연결된 노드만 신경써주면 된다!
👩💻 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
class Node {
private int prev;
private int next;
private int status; // 사용여부
public Node(int prev, int next, int status) {
this.prev = prev;
this.next = next;
this.status = status;
}
@Override
public String toString() {
return "p=" + prev +
",n=" + next +
",s=" + status;
}
}
public String solution(int n, int k, String[] cmd) {
StringBuilder answer = new StringBuilder();
//노드들의 정보 담을 리스트
ArrayList<Node> list = new ArrayList<>();
//삭제된 노드들 보관하는 스택
Stack<Integer> stack = new Stack<>();
//노드 정보 담기
for(int i=0; i <= n-2; i++) list.add(new Node(i-1, i+1, 1));
list.add(new Node(n-2, -1, 1));
for(int i = 0; i < cmd.length; i++) {
String[] split = cmd[i].split(" ");
System.out.println("before k : " + k);
switch (split[0]) {
//위로 -> 이전 인덱스는 prev 값으로 판단
case "U" : {
System.out.println("up");
int distance = Integer.parseInt(split[1]);
while (distance-- > 0) {
System.out.println("up!!");
k = list.get(k).prev;
System.out.println("k!! : " + k);
}
break;
}
//아래로 -> 이후 인덱스는 next 값으로 판단
case "D" : {
System.out.println("down");
int distance = Integer.parseInt(split[1]);
while (distance-- > 0) {
System.out.println("down!!");
k = list.get(k).next;
System.out.println("k!! : " + k);
}
break;
}
//삭제 -> 처음과 끝 값이 마지막이 아닐 때 prev, next 갱신
case "C" : {
System.out.println("delete");
stack.add(k);
list.get(k).status = 0;
if (list.get(k).prev != -1) list.get(list.get(k).prev).next = list.get(k).next;
if (list.get(k).next != -1) list.get(list.get(k).next).prev = list.get(k).prev;
k = (list.get(k).next == -1 ? list.get(k).prev : list.get(k).next);
break;
}
//복구 -> 처음과 끝 값이 아닐 때 prev, next 갱신
case "Z" : {
System.out.println("restore");
Integer restoreNum = stack.pop();
list.get(restoreNum).status = 1;
if (list.get(restoreNum).prev != -1) list.get(list.get(restoreNum).prev).next = restoreNum;
if (list.get(restoreNum).next != -1) list.get(list.get(restoreNum).next).prev = restoreNum;
break;
}
}
System.out.println("after k : " + k);
System.out.println(list);
System.out.println();
}
for(int i = 0; i < n; i++) {
if(list.get(i).status == 1) answer.append("O");
else answer.append("X");
}
return answer.toString();
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Main main = new Main();
int n = 8;
int k = 2;
String[] cmd = {"D 2","C","U 3","C","D 4","C","U 2","Z","Z"};
main.solution(n, k, cmd);
}
}
'Algorithm > programmers' 카테고리의 다른 글
[2019 카카오 인턴십]불량 사용자★ (0) | 2022.07.14 |
---|---|
[2020 카카오 인턴십]보석 쇼핑 (0) | 2022.07.14 |
[2018 카카오 블라인드 1차]셔틀버스 (0) | 2022.07.14 |
[2018 카카오 블라인드 1차]추석트래픽 (0) | 2022.07.07 |
[2022 카카오 블라인드]양궁 대회★ (0) | 2022.07.06 |