Algorithm/programmers

[2021 카카오 인턴십]표 편집

마닐라 2022. 7. 14. 12:08

📍 문제 설명

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);
    }
}