ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ณ ๋“์  Kit ์‡ ๋ง‰๋Œ€๊ธฐ
    Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ/Programmers 2020. 7. 6. 20:55

    ๋ฌธ์ œ ์„ค๋ช…

    ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‡ ๋ง‰๋Œ€๊ธฐ๋ฅผ ๋ ˆ์ด์ €๋กœ ์ ˆ๋‹จํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํšจ์œจ์ ์ธ ์ž‘์—…์„ ์œ„ํ•ด์„œ ์‡ ๋ง‰๋Œ€๊ธฐ๋ฅผ ์•„๋ž˜์—์„œ ์œ„๋กœ ๊ฒน์ณ ๋†“๊ณ , ๋ ˆ์ด์ €๋ฅผ ์œ„์—์„œ ์ˆ˜์ง์œผ๋กœ ๋ฐœ์‚ฌํ•˜์—ฌ ์‡ ๋ง‰๋Œ€๊ธฐ๋“ค์„ ์ž๋ฆ…๋‹ˆ๋‹ค. ์‡ ๋ง‰๋Œ€๊ธฐ์™€ ๋ ˆ์ด์ €์˜ ๋ฐฐ์น˜๋Š” ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

    - ์‡ ๋ง‰๋Œ€๊ธฐ๋Š” ์ž์‹ ๋ณด๋‹ค ๊ธด ์‡ ๋ง‰๋Œ€๊ธฐ ์œ„์—๋งŒ ๋†“์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    - ์‡ ๋ง‰๋Œ€๊ธฐ๋ฅผ ๋‹ค๋ฅธ ์‡ ๋ง‰๋Œ€๊ธฐ ์œ„์— ๋†“๋Š” ๊ฒฝ์šฐ ์™„์ „ํžˆ ํฌํ•จ๋˜๋„๋ก ๋†“๋˜, ๋์ ์€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ๋†“์Šต๋‹ˆ๋‹ค.
    - ๊ฐ ์‡ ๋ง‰๋Œ€๊ธฐ๋ฅผ ์ž๋ฅด๋Š” ๋ ˆ์ด์ €๋Š” ์ ์–ด๋„ ํ•˜๋‚˜ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
    - ๋ ˆ์ด์ €๋Š” ์–ด๋–ค ์‡ ๋ง‰๋Œ€๊ธฐ์˜ ์–‘ ๋์ ๊ณผ๋„ ๊ฒน์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์•„๋ž˜ ๊ทธ๋ฆผ์€ ์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ˆ˜ํ‰์œผ๋กœ ๊ทธ๋ ค์ง„ ๊ตต์€ ์‹ค์„ ์€ ์‡ ๋ง‰๋Œ€๊ธฐ์ด๊ณ , ์ ์€ ๋ ˆ์ด์ €์˜ ์œ„์น˜, ์ˆ˜์ง์œผ๋กœ ๊ทธ๋ ค์ง„ ์ ์„  ํ™”์‚ดํ‘œ๋Š” ๋ ˆ์ด์ €์˜ ๋ฐœ์‚ฌ ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค.

     

     

    ์ด๋Ÿฌํ•œ ๋ ˆ์ด์ €์™€ ์‡ ๋ง‰๋Œ€๊ธฐ์˜ ๋ฐฐ์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    (a) ๋ ˆ์ด์ €๋Š” ์—ฌ๋Š” ๊ด„ํ˜ธ์™€ ๋‹ซ๋Š” ๊ด„ํ˜ธ์˜ ์ธ์ ‘ํ•œ ์Œ '()'์œผ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  '()'๋Š” ๋ฐ˜๋“œ์‹œ ๋ ˆ์ด์ €๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    (b) ์‡ ๋ง‰๋Œ€๊ธฐ์˜ ์™ผ์ชฝ ๋์€ ์—ฌ๋Š” ๊ด„ํ˜ธ '('๋กœ, ์˜ค๋ฅธ์ชฝ ๋์€ ๋‹ซํžŒ ๊ด„ํ˜ธ ')'๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

    ์œ„ ์˜ˆ์˜ ๊ด„ํ˜ธ ํ‘œํ˜„์€ ๊ทธ๋ฆผ ์œ„์— ์ฃผ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์‡ ๋ง‰๋Œ€๊ธฐ๋Š” ๋ ˆ์ด์ €์— ์˜ํ•ด ๋ช‡ ๊ฐœ์˜ ์กฐ๊ฐ์œผ๋กœ ์ž˜๋ฆฌ๋Š”๋ฐ, ์œ„ ์˜ˆ์—์„œ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ์‡ ๋ง‰๋Œ€๊ธฐ๋Š” ๊ฐ๊ฐ 3๊ฐœ์™€ 2๊ฐœ์˜ ์กฐ๊ฐ์œผ๋กœ ์ž˜๋ฆฌ๊ณ , ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฃผ์–ด์ง„ ์‡ ๋ง‰๋Œ€๊ธฐ๋“ค์€ ์ด 17๊ฐœ์˜ ์กฐ๊ฐ์œผ๋กœ ์ž˜๋ฆฝ๋‹ˆ๋‹ค.

    ์‡ ๋ง‰๋Œ€๊ธฐ์™€ ๋ ˆ์ด์ €์˜ ๋ฐฐ์น˜๋ฅผ ํ‘œํ˜„ํ•œ ๋ฌธ์ž์—ด arrangement๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ž˜๋ฆฐ ์‡ ๋ง‰๋Œ€๊ธฐ ์กฐ๊ฐ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

     

    ์ œํ•œ์‚ฌํ•ญ

    • arrangement์˜ ๊ธธ์ด๋Š” ์ตœ๋Œ€ 100,000์ž…๋‹ˆ๋‹ค.

    • arrangement์˜ ์—ฌ๋Š” ๊ด„ํ˜ธ์™€ ๋‹ซ๋Š” ๊ด„ํ˜ธ๋Š” ํ•ญ์ƒ ์Œ์„ ์ด๋ฃน๋‹ˆ๋‹ค.

     

    ๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ํ’€์—ˆ๋‚˜

    ์ฒซ๋ฒˆ์งธ ์‹œ๋„ (Queue ์‚ฌ์šฉ/ 100์  ๋งŒ์ ์— 10์  ๐Ÿ˜ญ)

    import java.util.Stack;
    import java.util.Queue;
    import java.util.LinkedList;
    import java.util.Arrays;
    import java.util.stream.Collectors;
    
    class Solution {
        public int solution(String arrangement) {
            int numSlicedIronBar = 0;
            Queue<String> arrgQ = new LinkedList<>();
             int numAccumLaser = 0, numValidLaser = 0;
             int level = 0;
            
            // init
            arrgQ = Arrays.stream(arrangement.split("")).collect(Collectors.toCollection(LinkedList::new));
            
            while(!arrgQ.isEmpty()) {
                String curr = arrgQ.remove();
                
                if(arrgQ.isEmpty() && curr.equals(")")) { // deal with the last one
                    // System.out.println("Level : " + level);
                    // System.out.println("# valid laser : " + numValidLaser);
                    
                    numSlicedIronBar += (level > 0) ? (numValidLaser + 1) : 0;
                    break;
                }
                
                String next = arrgQ.element();
                
                if(isLaser(curr, next)) {
                    arrgQ.remove(); // revmove ')'
                    
                    if(level > 0) {
                    	numAccumLaser++;
                    	numValidLaser++;	
                    }
                    
                    continue;
                }
                
                if(curr.equals("(")) { // level up        
                    numValidLaser = 0;
                    
                    level++;
                }
                
                if(curr.equals(")")) { // level down
                    // System.out.println("Level : " + level);
                    // System.out.println("# valid laser : " + numValidLaser);
                    
                    numSlicedIronBar += (level > 0) ? (numValidLaser + 1) : 0;
                    
                    level--;
                   
                    numAccumLaser = (level > 0) ? numAccumLaser : 0;
                    numValidLaser = numAccumLaser;
                }
            }
            
            return numSlicedIronBar;
        }
        
        public boolean isLaser(String curr, String next) {
            return (curr.equals("(") && next.equals(")"));
        }
    }

     

    ๋‘๋ฒˆ์งธ ์‹œ๋„ (stack ์‚ฌ์šฉ)

    import java.util.Stack;
    import java.util.Arrays;
    import java.util.ArrayList;
    import java.util.stream.Collectors;
    
    class Solution {
        public int solution(String arrangement) {
            int numSlicedIronBar = 0;
            
            // pre-processing
            String revisedArrg = arrangement.replace("()", "0");
            
            // init
            ArrayList<String> arrgLIst = Arrays.stream(revisedArrg.split(""))
                                            .collect(Collectors.toCollection(ArrayList::new));
            
            Stack<String> lParens = new Stack<>();
            
            for(String curr : arrgLIst) {
                if(isLaser(curr)) {
                    numSlicedIronBar += lParens.size();
                    continue;
                }
                
                if(curr.equals("(")) {
                    lParens.push(curr);
                }
                
                if(curr.equals(")")) {
                    lParens.pop();
                    numSlicedIronBar += 1;
                }
            }
            
            return numSlicedIronBar;
        }
        
        public boolean isLaser(String curr) {
            return curr.equals("0");
        }
    }

     

    ๋‚˜๋Š” ์™œ ์ €๋ ‡๊ฒŒ ํ’€์—ˆ๋‚˜

    ์ฒซ๋ฒˆ์งธ ์‹œ๋„

    ์ฒซ๋ฒˆ์งธ ์‹œ๋„๋Š” '(์ž˜๋ฆฐ ์‡ ๋ง‰๋Œ€๊ธฐ์˜ ๊ฐœ์ˆ˜) = (์‡ ๋ง‰๋Œ€๊ธฐ ์—ฐ์ง ๋ฐฉํ–ฅ์— ์žˆ๋Š” ๋ ˆ์ด์ €์˜ ๊ฐœ์ˆ˜ + 1)' ์ด๋ผ๋Š” ์„ฑ์งˆ์„ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     

    1. arrangement๋ฅผ ๋‚˜๋ˆ ์„œ ํ์— ๋„ฃ๋Š”๋‹ค.

    2. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ์•„๋ž˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

      1. ๋‘๊ฐœ์”ฉ ์‚ดํŽด๋ณด๋Š”๋ฐ ๋ ˆ์ด์ €์ด๋ฉด ์ฆ‰, ํ•˜๋‚˜๊ฐ€ '('์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๊ฐ€ ')'์ด๋ฉด '๋ˆ„์ ๋œ ๋ ˆ์ด์ € ๊ฐœ์ˆ˜'์™€ '์œ ํšจํ•œ ๋ ˆ์ด์ € ๊ฐœ์ˆ˜'๋ฅผ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ continueํ•œ๋‹ค.

      2. ๋งŒ์•ฝ ๋ ˆ์ด์ €๊ฐ€ ์•„๋‹ˆ๊ณ  ํ˜„์žฌ popํ•œ ๋ฌธ์ž๊ฐ€ '('์ด๋ฉด ์ฆ‰, ์‡ ๋ง‰๋Œ€๊ธฐ๊ฐ€ ํ•˜๋‚˜ ์Œ“์ด๋ฉด level์„ 1 ์ฆ๊ฐ€ํ•˜๊ณ  '์œ ํšจํ•œ ๋ ˆ์ด์ € ๊ฐœ์ˆ˜'๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

      3. ๋งŒ์•ฝ ๋ ˆ์ด์ €๊ฐ€ ์•„๋‹ˆ๊ณ  ํ˜„์žฌ popํ•œ ๋ฌธ์ž๊ฐ€ ')'์ด๋ฉด ์ฆ‰, ์‡ ๋ง‰๋Œ€๊ธฐ๊ฐ€ ์Œ“์ธ level์ด ์ค„์–ด๋“ค๋ฉด level์„ ์‚ดํŽด๋ด์„œ 0๋ณด๋‹ค ํฌ๋ฉด '์ž˜๋ฆฐ ์‡ ๋ง‰๋Œ€๊ธฐ ๊ฐœ์ˆ˜'์— '์œ ํšจํ•œ ๋ ˆ์ด์ € ๊ฐœ์ˆ˜' + 1๋งŒํผ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0๋งŒํผ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ level์„ 1 ๊ฐ์†Œํ•˜๊ณ  level์„ ํ™•์ธํ•ด์„œ '๋ˆ„์ ๋œ ๋ ˆ์ด์ € ๊ฐœ์ˆ˜'๊ฐ€ 0๋ณด๋‹ค ํด ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ 0์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ '์œ ํšจํ•œ ๋ ˆ์ด์ € ๊ฐœ์ˆ˜'๋ฅผ '๋ˆ„์ ๋œ ๋ ˆ์ด์ € ๊ฐœ์ˆ˜'๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

     

    ์ด๋ ‡๊ฒŒ ํ–ˆ๋”๋‹ˆ ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ•˜๋Š”๋ฐ ์ •์ž‘ ์ฝ”๋“œ๋ฅผ ์ œ์ถœํ•˜๋‹ˆ๊นŒ 1๋ฒˆ๊ณผ 3๋ฒˆ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์‹คํŒจ๋‹ค..

    ์–ด๋””๊ฐ€ ํ‹€๋ฆฐ๊ฑธ๊นŒ... ๐Ÿ˜ญ๐Ÿ˜ญ

     

    ๋‘๋ฒˆ์งธ ์‹œ๋„

    ๋‘๋ฒˆ์งธ ์‹œ๋„๋Š” ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

    https://medium.com/@nsh235482/java-coding-programmers-stack-queue-lv2-%EC%87%A0%EB%A7%89%EB%8C%80%EA%B8%B0-d3c482da3d98

     

    ์ด ์‹œ๋„๋Š” '๋ ˆ์ด์ €๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „ '('์˜ ๊ฐœ์ˆ˜ = ํ† ๋ง‰๋‚œ ๋ง‰๋Œ€๊ธฐ์˜ ๊ฐœ์ˆ˜' ๋ผ๋Š” ์„ฑ์งˆ๊ณผ ')์„ ๋งŒ๋‚˜๋ฉด ํ† ๋ง‰๋‚œ ๋ง‰๋Œ€๊ธฐ์˜ ๊ฐœ์ˆ˜๋ฅผ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.'๋ผ๋Š” ์„ฑ์งˆ์„ ์ด์šฉํ•œ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     

    1. ๋ ˆ์ด์ €๋ฅผ ์˜๋ฏธํ•˜๋Š” '()'์„ '0'์œผ๋กœ replaceํ•œ๋‹ค.

    2. ์ˆ˜์ •ํ•œ arrg๋ฅผ list์— ์ €์žฅํ•œ๋‹ค.

    3. '('์„ ์ €์žฅํ•˜๋Š” ์Šคํƒ(lParens)์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

    4. ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ list๋ฅผ ์ˆœํšŒํ•œ๋‹ค.

      1. ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ๋ ˆ์ด์ €์ด๋ฉด ํ† ๋ง‰๋‚œ ์‡ ๋ง‰๋Œ€๊ธฐ์˜ ๊ฐœ์ˆ˜๋ฅผ lParens์˜ ํฌ๊ธฐ๋งŒํผ ์ฆ๊ฐ€ํ•œ๋‹ค.

      2. ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ '('์ด๋ฉด lParens์— ํ˜„์žฌ ๋ฌธ์ž๋ฅผ pushํ•œ๋‹ค.

      3. ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ')'์ด๋ฉด lParens๋ฅผ popํ•œ ๋’ค ํ† ๋ง‰๋‚œ ์‡ ๋ง‰๋Œ€๊ธฐ์˜ ๊ฐœ์ˆ˜๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€ํ•œ๋‹ค.

     

    ๋‚˜๋Š” ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜

    ๋Š˜ ๋Š๋ผ๋Š” ๊ฒƒ์ด์ง€๋งŒ ๋‚ด๊ฒ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋งŒ ๊ณ ์ง‘ํ•˜์ง€ ์•Š๋Š” ์œ ์—ฐํ•œ ์‚ฌ๊ณ ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

    ์œ ์—ฐํ•œ ์‚ฌ๊ณ ๋ฅผ ๊ฐ€์ง€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋„ ์ฝ์–ด๋ณด๊ณ  ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•๋“ค์„ ๋ฐฐ์›Œ์„œ ๋งŽ์ด ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๊ณต๋ถ€ํ•˜์ž!

    ๋Œ“๊ธ€

Designed by Tistory.