μ•Œκ³ λ¦¬μ¦˜/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / Programmers Level 3 ] ν‘œ νŽΈμ§‘

KIMHYEYUN 2021. 9. 23. 16:32
λ°˜μ‘ν˜•

https://programmers.co.kr/learn/courses/30/lessons/81303

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - ν‘œ νŽΈμ§‘

8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z"] "OOOOXOOO" 8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z","U 1","C"] "OOXOXOOO"

programmers.co.kr

 

문제 μ„€λͺ…


μ—…λ¬΄μš© μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•˜λŠ” λ‹ˆλ‹ˆμ¦ˆμ›μŠ€μ˜ 인턴인 μ•™λͺ¬λ“œλŠ” λͺ…λ Ήμ–΄ 기반으둜 ν‘œμ˜ 행을 선택, μ‚­μ œ, λ³΅κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” 과제λ₯Ό λ§‘μ•˜μŠ΅λ‹ˆλ‹€. μ„ΈλΆ€ μš”κ΅¬ 사항은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€

μœ„ κ·Έλ¦Όμ—μ„œ νŒŒλž€μƒ‰μœΌλ‘œ μΉ ν•΄μ§„ 칸은 ν˜„μž¬ μ„ νƒλœ 행을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 단, ν•œ λ²ˆμ— ν•œ ν–‰λ§Œ 선택할 수 있으며, ν‘œμ˜ λ²”μœ„(0ν–‰ ~ λ§ˆμ§€λ§‰ ν–‰)λ₯Ό λ²—μ–΄λ‚  수 μ—†μŠ΅λ‹ˆλ‹€. μ΄λ•Œ, λ‹€μŒκ³Ό 같은 λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•˜μ—¬ ν‘œλ₯Ό νŽΈμ§‘ν•©λ‹ˆλ‹€.

  • "U X": ν˜„μž¬ μ„ νƒλœ ν–‰μ—μ„œ XμΉΈ μœ„μ— μžˆλŠ” 행을 μ„ νƒν•©λ‹ˆλ‹€. 
  • "D X": ν˜„μž¬ μ„ νƒλœ ν–‰μ—μ„œ XμΉΈ μ•„λž˜μ— μžˆλŠ” 행을 μ„ νƒν•©λ‹ˆλ‹€. 
  • "C" : ν˜„μž¬ μ„ νƒλœ 행을 μ‚­μ œν•œ ν›„, λ°”λ‘œ μ•„λž˜ 행을 μ„ νƒν•©λ‹ˆλ‹€. 단, μ‚­μ œλœ 행이 κ°€μž₯ λ§ˆμ§€λ§‰ 행인 경우 λ°”λ‘œ μœ— 행을 μ„ νƒν•©λ‹ˆλ‹€.
  • "Z" : κ°€μž₯ μ΅œκ·Όμ— μ‚­μ œλœ 행을 μ›λž˜λŒ€λ‘œ λ³΅κ΅¬ν•©λ‹ˆλ‹€. λ‹¨, ν˜„μž¬ μ„ νƒλœ 행은 λ°”λ€Œμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μœ„ ν‘œμ—μ„œ "D 2"λ₯Ό μˆ˜ν–‰ν•  경우 μ•„λž˜ 그림의 μ™Όμͺ½μ²˜λŸΌ 4행이 μ„ νƒλ˜λ©°, "C"λ₯Ό μˆ˜ν–‰ν•˜λ©΄ μ„ νƒλœ 행을 μ‚­μ œν•˜κ³ , λ°”λ‘œ μ•„λž˜ ν–‰μ΄μ—ˆλ˜ "λ„€μ˜€"κ°€ 적힌 행을 μ„ νƒν•©λ‹ˆλ‹€(4행이 μ‚­μ œλ˜λ©΄μ„œ μ•„λž˜ 있던 행듀이 ν•˜λ‚˜μ”© λ°€λ € 올라였고, μˆ˜μ •λœ ν‘œμ—μ„œ λ‹€μ‹œ 4행을 μ„ νƒν•˜λŠ” 것과 λ™μΌν•©λ‹ˆλ‹€).

λ‹€μŒμœΌλ‘œ "U 3"을 μˆ˜ν–‰ν•œ λ‹€μŒ "C"λ₯Ό μˆ˜ν–‰ν•œ ν›„μ˜ ν‘œ μƒνƒœλŠ” μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ "D 4"λ₯Ό μˆ˜ν–‰ν•œ λ‹€μŒ "C"λ₯Ό μˆ˜ν–‰ν•œ ν›„μ˜ ν‘œ μƒνƒœλŠ” μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 5행이 ν‘œμ˜ λ§ˆμ§€λ§‰ ν–‰ μ΄λ―€λ‘œ, 이 경우 λ°”λ‘œ μœ— 행을 μ„ νƒν•˜λŠ” 점에 μ£Όμ˜ν•©λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ "U 2"λ₯Ό μˆ˜ν–‰ν•˜λ©΄ ν˜„μž¬ μ„ νƒλœ 행은 2행이 λ©λ‹ˆλ‹€.

μœ„ μƒνƒœμ—μ„œ "Z"λ₯Ό μˆ˜ν–‰ν•  경우 κ°€μž₯ μ΅œκ·Όμ— 제거된 "라이언"이 적힌 행이 μ›λž˜λŒ€λ‘œ λ³΅κ΅¬λ©λ‹ˆλ‹€.

λ‹€μ‹œν•œλ²ˆ "Z"λ₯Ό μˆ˜ν–‰ν•˜λ©΄ κ·Έ λ‹€μŒμœΌλ‘œ μ΅œκ·Όμ— 제거된 "콘"이 적힌 행이 μ›λž˜λŒ€λ‘œ λ³΅κ΅¬λ©λ‹ˆλ‹€. μ΄λ•Œ, ν˜„μž¬ μ„ νƒλœ 행은 λ°”λ€Œμ§€ μ•ŠλŠ” 점에 μ£Όμ˜ν•˜μ„Έμš”.

μ΄λ•Œ, μ΅œμ’… ν‘œμ˜ μƒνƒœμ™€ 처음 μ£Όμ–΄μ§„ ν‘œμ˜ μƒνƒœλ₯Ό λΉ„κ΅ν•˜μ—¬ μ‚­μ œλ˜μ§€ μ•Šμ€ 행은 "O", μ‚­μ œλœ 행은 "X"둜 ν‘œμ‹œν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

처음 ν‘œμ˜ ν–‰ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ n, μ²˜μŒμ— μ„ νƒλœ ν–‰μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ k, μˆ˜ν–‰ν•œ λͺ…령어듀이 λ‹΄κΈ΄ λ¬Έμžμ—΄ λ°°μ—΄ cmdκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, λͺ¨λ“  λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•œ ν›„ ν‘œμ˜ μƒνƒœμ™€ 처음 μ£Όμ–΄μ§„ ν‘œμ˜ μƒνƒœλ₯Ό λΉ„κ΅ν•˜μ—¬ μ‚­μ œλ˜μ§€ μ•Šμ€ 행은 O, μ‚­μ œλœ 행은 X둜 ν‘œμ‹œν•˜μ—¬ λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

 

μ œν•œ 사항


  • 5 ≤ n ≤ 1,000,000
  • 0 ≤ k < n
  • 1 ≤ cmd의 μ›μ†Œ 개수 ≤ 200,000
    • cmd의 각 μ›μ†ŒλŠ” "U X", "D X", "C", "Z" μ€‘ ν•˜λ‚˜μž…λ‹ˆλ‹€.
    • XλŠ” 1 이상 300,000 μ΄ν•˜μΈ μžμ—°μˆ˜μ΄λ©° 0으둜 μ‹œμž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • Xκ°€ λ‚˜νƒ€λ‚΄λŠ” μžμ—°μˆ˜μ— ',' λŠ” μ£Όμ–΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 123,456의 경우 123456으둜 μ£Όμ–΄μ§‘λ‹ˆλ‹€.
    • cmd에 λ“±μž₯ν•˜λŠ” λͺ¨λ“  Xλ“€μ˜ 값을 ν•©μΉœ κ²°κ³Όκ°€ 1,000,000 μ΄ν•˜μΈ 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§‘λ‹ˆλ‹€.
    • ν‘œμ˜ λͺ¨λ“  행을 μ œκ±°ν•˜μ—¬, 행이 ν•˜λ‚˜λ„ 남지 μ•ŠλŠ” κ²½μš°λŠ” μž…λ ₯으둜 μ£Όμ–΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • λ³Έλ¬Έμ—μ„œ 각 행이 제거되고 λ³΅κ΅¬λ˜λŠ” 과정을 보닀 μžμ—°μŠ€λŸ½κ²Œ 보이기 μœ„ν•΄ "이름" μ—΄μ„ μ‚¬μš©ν•˜μ˜€μœΌλ‚˜, "이름"μ—΄μ˜ λ‚΄μš©μ΄ μ‹€μ œ 문제λ₯Ό ν‘ΈλŠ” 과정에 ν•„μš”ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. "이름"μ—΄μ—λŠ” μ„œλ‘œ λ‹€λ₯Έ 이름듀이 쀑볡없이 μ±„μ›Œμ Έ μžˆλ‹€κ³  κ°€μ •ν•˜κ³  문제λ₯Ό ν•΄κ²°ν•΄ μ£Όμ„Έμš”.
  • ν‘œμ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λŠ” 이동은 μž…λ ₯으둜 μ£Όμ–΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ›λž˜λŒ€λ‘œ 볡ꡬ할 행이 없을 λ•Œ(즉, μ‚­μ œλœ 행이 없을 λ•Œ) "Z"κ°€ λͺ…λ Ήμ–΄λ‘œ μ£Όμ–΄μ§€λŠ” κ²½μš°λŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • 정닡은 ν‘œμ˜ 0ν–‰λΆ€ν„° n - 1ν–‰κΉŒμ§€μ— ν•΄λ‹Ήλ˜λŠ” O, Xλ₯Ό μˆœμ„œλŒ€λ‘œ 이어뢙인 λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•΄μ£Όμ„Έμš”.

 

풀이


μ²˜μŒμ— HashMap <Integer, Boolean> 을 μ΄μš©ν•΄μ„œ ν’€λ €ν–ˆμ§€λ§Œ, μ΄λ™ν•˜λŠ” 과정이 μ‰½μ§€μ•Šμ•„μ„œ PASS〰️

λ‘λ²ˆμ§ΈλŠ” Listλ₯Ό μ΄μš©ν–ˆλŠ”λ°,,,, μ •ν™•μ„±μ—μ„œ λͺ‡κ°œ 틀리고............... νš¨μœ¨μ„±μ΄ πŸ’©λ§!!! YEAH‼️

κ·Έλž˜μ„œ κ²°κ΅­ μ§ˆλ¬Έλ“€μ„ μ°Έκ³ ν•΄μ„œ ν’€μ—ˆλ”°... λ‹ˆκ°€ 푼거냐~! λ­ μ¨Œλ“ ..

 

1️⃣ pre, next 배열을 이용

  • μœ„μΉ˜ i 의 이전 λ…Έλ“œ, λ‹€μŒ λ…Έλ“œμ˜ μœ„μΉ˜λ₯Ό μ €μž₯
  • 처음의 pre와 λ§ˆμ§€λ§‰μ˜ nextλŠ” -1

2️⃣ LinkedListλ₯Ό μ΄μš©ν•˜μ—¬ μ‚­μ œ, 볡ꡬ μ—°μ‚° κ΅¬ν˜„

  • Stack <Node> delStack
  • i λ₯Ό μ‚­μ œ μ‹œ, pre[i], i, next[i] λ₯Ό μ €μž₯  μœ„μΉ˜ κΈ°μ–΅
  • λ³΅κ΅¬μ‹œ, Node node = delStack.pop(); κ°€μž₯ 졜근 μ‚­μ œλœ λ…Έλ“œ
  • node의 pre, next κ°’μœΌλ‘œ μ›λž˜ μœ„μΉ˜λ‘œ 볡ꡬ

 

μ½”λ“œ


μ²˜μŒμ— ν‹€λ¦Ό.... νš¨μœ¨μ„± πŸ’©λ§

public static String solution(int n, int k, String[] cmd) {
        String answer = "";

        Stack<Integer> delStack = new Stack<>();
        List<Integer> list = new ArrayList<>();
        int now = k;
        int nowValue = k;

        for(int i = 0 ; i < n ; i++){
            list.add(i);
        }

        for(String s : cmd){
            String[] op = s.split(" ");

            if(op[0].equals("D")){
                int x = Integer.parseInt(op[1]);
                now = now + x;
                nowValue = list.get(now);
            }
            else if(op[0].equals("U")){
                int x = Integer.parseInt(op[1]);
                now = now - x;
                nowValue = list.get(now);
            }
            else if(op[0].equals("C")){
                delStack.push(list.get(now));
                list.remove(now);
                if(list.size() <= now)
                    now = now - 1;
                
                nowValue = list.get(now);
            }
            else{
                list.add(delStack.pop());
                Collections.sort(list);
                if(nowValue != list.get(now)){
                    now = list.indexOf(nowValue);
                }
            }
        }

        int idx = 0;
        for(int i = 0 ; i < list.size() ; i++){
            if(list.get(i) == idx) 
                answer += "O";
            else{
                answer += "X";
                i--;
            }
            idx++;
        }
        

        return answer; 
    }

 

λ§žμ€ μ½”λ“œ - LinkedList 이용

  public static class Node{
        int pre;
        int cur;
        int next;

        Node(int pre, int cur, int next){
            this.pre = pre;
            this.cur = cur;
            this.next = next;
        }
    }

    public static String solution(int n, int k, String[] cmd){

        int[] pre = new int[n];
        int[] next = new int[n];

        for(int i = 0 ; i < n; i++){
            pre[i] = i-1;
            next[i] = i+1;
        }
        next[n-1] = -1;

        Stack<Node> delStack = new Stack<>();
        StringBuilder sb = new StringBuilder("O".repeat(n));
        int now = k;

        for(String c : cmd){
            String[] op = c.split(" ");

            if(op[0].equals("U")){
                int x = Integer.parseInt(op[1]);
                while(x-- > 0){
                    now = pre[now];
                }
            }
            else if(op[0].equals("D")){
                int x = Integer.parseInt(op[1]);
                while(x-- > 0){
                    now = next[now];
                }
            }
            else if(op[0].equals("C")){
                delStack.push(new Node(pre[now], now, next[now]));
                if(pre[now] != -1)
                    next[pre[now]] = next[now];
                if(next[now] != -1)
                    pre[next[now]] = pre[now];
                sb.setCharAt(now, 'X');

                if(next[now] != -1)
                    now = next[now];
                else
                    now = pre[now];
            }
            else{
                Node node = delStack.pop();

                if(node.pre != -1)
                    next[node.pre] = node.cur;
                if(node.next != -1)
                    pre[node.next] = node.cur;
                
                sb.setCharAt(node.cur, 'O');
            }
        }

        return sb.toString();
    }
728x90
λ°˜μ‘ν˜•