did_story

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / JAVA] ν‘œ νŽΈμ§‘ λ³Έλ¬Έ

Algorithm🌊/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€(Programmers)

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

μ–΄μ œμ‹œμž‘ 2025. 10. 9. 20:29

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

문제

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

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

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

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

 

풀이

처음 문제λ₯Ό ν’€ λ•Œ μƒκ°ν•œκ²ƒμ€ stack에 제거된 indexλ₯Ό 순차적으둜 μ§‘μ–΄λ„£μœΌλ©΄ λ‚˜μ€‘μ— κΊΌλ‚΄λ©΄μ„œ μΆ”κ°€ν•˜λŠ”κ²Œ μ’‹μ§€ μ•Šμ„κΉŒ μƒκ°ν–ˆλ‹€.

  • "C" 와 "Z" κ°€ μž…λ ₯될 λ•Œλ§ˆλ‹€ n 의 크기λ₯Ό μ‘°μ • ν•œλ‹€.
  • stack에 μ‚­μ œλœ ν–‰μ˜ indexλ₯Ό μ €μž₯ν•œλ‹€. 
  • μ΅œμ’… n만큼 StringBuilder에 "O"λ₯Ό repeatν•˜κ³  
  • λ§ˆμ§€λ§‰μœΌλ‘œ stackμ—μ„œ  ν•΄λ‹Ή indexλ₯Ό κΊΌλ‚΄λ©΄μ„œ "X" λ₯Ό μ£Όμž…(insert)ν•œλ‹€.

μ΄λ ‡κ²Œ ν–ˆλŠ”λ°, (정닡이 λ‚˜μ™”μ§€λ§Œ) λ‹€λ₯Έ λΆ„λ“€μ˜ 풀이λ₯Ό 보닀가 λ‚΄κ°€ 잘λͺ» ν‘Ό 것을 λ°œκ²¬ν•˜μ˜€λ‹€. (좜처: 빈λ‘₯λ²€λ‘₯ IT logging)

 

λ‹€μ‹œ ν‘Ό 풀이

1. κ° ν–‰μ˜ μ΄μ „ ν–‰κ³Ό λ‹€μŒ ν–‰μ— λŒ€ν•œ μ •보λ₯Ό λ‹΄μ€ λ°°μ—΄μ„ λ§Œλ“ λ‹€.
2. μŠ€νƒμ„ μ‚¬μš©ν•΄ μ‚­μ œν•œ ν–‰μ˜ μ •보λ₯Ό μ €μž₯ν•œλ‹€.
3. StringBuilderλ₯Ό μ‚¬μš©ν•΄ κ²°κ³Ό λ¬Έμžμ—΄μ„ λ§Œλ“ λ‹€.
4. λͺ…λ Ήμ–΄λ₯Ό ν•˜λ‚˜μ”© μ²˜λ¦¬ν•œλ‹€.

  • U X : XμΉΈ μœ„λ‘œ 이동
  • D X : XμΉΈ μ•„λž˜λ‘œ 이동
  • C : ν˜„μž¬ μ„ νƒλœ 행을 μ‚­μ œν•˜κ³ , λ°”λ‘œ μ•„λž˜ 행을 선택.
          λ§Œμ•½, μ‚­μ œλœ 행이 λ§ˆμ§€λ§‰ 행이라면 λ°”λ‘œ μœ„ 행을 μ„ νƒν•œλ‹€.
  • Z : κ°€μž₯ μ΅œκ·Όμ— μ‚­μ œλœ 행을 λ³΅κ΅¬ν•œλ‹€. 볡ꡬ된 행은 μ›λž˜ 있던 μœ„μΉ˜μ— λŒμ•„κ°„λ‹€.

5. λͺ¨λ“  λͺ…λ Ήμ–΄λ₯Ό μ²˜λ¦¬ν•œ ν›„, κ²°κ³Ό λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.

μ •λ‹΅

import java.util.Stack;

class Solution {
    public class Node {
        int pre;
        int cur;
        int nxt;

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

    public String solution(int n, int k, String[] cmd) {
        int[] pres = new int[n];
        int[] nxts = new int[n];
        Stack<Node> stack = new Stack<>();
        StringBuilder sb = new StringBuilder("O".repeat(n));

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

        for(String s : cmd){
            char c = s.charAt(0);
            if(c == 'U'){
                int num = Integer.parseInt(s.substring(2));
                while(num-- > 0) k = pres[k];
            } else if (c == 'D'){
                int num = Integer.parseInt(s.substring(2));
                while(num-- > 0) k = nxts[k];
            } else if (c == 'C'){
                stack.push(new Node(pres[k], k, nxts[k]));
                if(pres[k] != -1) nxts[pres[k]] = nxts[k];
                if(nxts[k] != -1) pres[nxts[k]] = pres[k];
                sb.setCharAt(k, 'X');

                if(nxts[k] != -1) k = nxts[k];
                else k = pres[k];
            } else {
                Node node = stack.pop();
                if(node.pre != -1) nxts[node.pre] = node.cur;;
                if(node.nxt != -1) pres[node.nxt] = node.cur;;
                sb.setCharAt(node.cur, 'O');
            }
        }

        return sb.toString();
    }
}

 

* insertλŠ” μ•žμ—μ„œλΆ€ν„° ν•΄λ‹Ή indexκΉŒμ§€ λ‹€ μ°Ύμ•„κ°€λŠ” 것이라, n * n의 λ¬Έμ œκ°€ 생긴닀. 이λ₯Ό κΉŒλ¨Ήμ§€ 말자..

 

μ°Έμ‘°

https://moonsbeen.tistory.com/294#rp