๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV3] 110 ์˜ฎ๊ธฐ๊ธฐ (Stack, ์Šคํƒ)

๋ฐ˜์‘ํ˜•
SMALL

๐Ÿง ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV3. 110 ์˜ฎ๊ธฐ๊ธฐ

๋ฌธ์ œ ์„ค๋ช…

0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ์–ด๋–ค ๋ฌธ์ž์—ด x์— ๋Œ€ํ•ด์„œ, ๋‹น์‹ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ–‰๋™์„ ํ†ตํ•ด x๋ฅผ ์ตœ๋Œ€ํ•œ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์•ž์— ์˜ค๋„๋ก ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
- x์— ์žˆ๋Š” "110"์„ ๋ฝ‘์•„์„œ, ์ž„์˜์˜ ์œ„์น˜์— ๋‹ค์‹œ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, x = "11100" ์ผ ๋•Œ, ์—ฌ๊ธฐ์„œ ์ค‘์•™์— ์žˆ๋Š” "110"์„ ๋ฝ‘์œผ๋ฉด x = "10" ์ด ๋ฉ๋‹ˆ๋‹ค. ๋ฝ‘์•˜๋˜ "110"์„ x์˜ ๋งจ ์•ž์— ๋‹ค์‹œ ์‚ฝ์ž…ํ•˜๋ฉด x = "11010" ์ด ๋ฉ๋‹ˆ๋‹ค.
๋ณ€ํ˜•์‹œํ‚ฌ ๋ฌธ์ž์—ด x๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋“ค์–ด์žˆ๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด s๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ ์œ„์˜ ํ–‰๋™์œผ๋กœ ๋ณ€ํ˜•ํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด ์ค‘ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ๊ฐ€์žฅ ์•ž์— ์˜ค๋Š” ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

- 1 ≤ s์˜ ๊ธธ์ด ≤ 1,000,000
- 1 ≤ s์˜ ๊ฐ ์›์†Œ ๊ธธ์ด ≤ 1,000,000
- 1 ≤ s์˜ ๋ชจ๋“  ์›์†Œ์˜ ๊ธธ์ด์˜ ํ•ฉ ≤ 1,000,000

์ž…์ถœ๋ ฅ ์˜ˆ

s result
["1110","100111100","0111111010"] ["1101","100110110","0110110111"]

 

๐Ÿ’ก ๋ฌธ์ œ ํ’€์ด

๋ฐฉํ–ฅ์„ฑ์ด ์•„์˜ˆ ๋– ์˜ค๋ฅด์ง€ ์•Š์•„์„œ ๊ตฌ๊ธ€๋ง์œผ๋กœ ์ฐพ์•„ ํ’€์–ด๋ณธ ๋ฌธ์ œ๋‹ค.

1. 0์„ ์ตœ๋Œ€ํ•œ ์™ผ์ชฝ์œผ๋กœ ๋ณด๋‚ด๊ณ , 1์„ ์ตœ๋Œ€ํ•œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ณด๋‚ธ๋‹ค.

2. Stack์„ ํ™œ์šฉํ•ด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ’€์–ด๋‚ธ๋‹ค.

์ฐพ์•„๋ณด๋‹ˆ ์š” 2๊ฐ€์ง€๊ฐ€ ํ•ต์‹ฌ ์š”์ธ์ด์—ˆ๋‹ค.

1๋ฒˆ์„ ์œ„ํ•ด์„œ๋Š” 110์„ ๋บ€ ํ›„์˜ ์ˆซ์ž์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” 0 ์ธ๋ฑ์Šค ๋ฐ”๋กœ ๋’ค์— ๋นผ๋‚ธ 110์„ ์ด์–ด ๋ถ™์ด๊ณ ,

2๋ฒˆ์€ Stack์„ ํ™œ์šฉํ•ด์„œ ๊ธฐ์กด ๋ฌธ์ž์—ด์—์„œ 110์„ ๋นผ๋‚ด๋ฉด ๋œ๋‹ค.

์ข€ ๋” ์ž์„ธํ•œ ํ’€์ด๋Š” ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.

https://yabmoons.tistory.com/668

https://wellbell.tistory.com/228

 

๋จผ์ € Stack์„ ํ™œ์šฉํ•ด์„œ "110"์„ ๋นผ๋‚ด๋ณด์ž.

Stack<Character> stack = new Stack<>();
int cnt = 0; // ๋นผ๋‚ธ 110 ๊ฐœ์ˆ˜
        
for (int i = 0; i < str.length(); i++) {
	char z = str.charAt(i);
            
	if (stack.size() >= 2) { // ์Šคํƒ ํฌ๊ธฐ๊ฐ€ 2 ์ด์ƒ์ด๋ฉด 110 ํŒ๋ณ„
		char y = stack.pop();
		char x = stack.pop();
                
		if (x == '1' && y == '1' && z == '0') {
			cnt++;
		} else { // ํ™•์ธํ•˜๊ณ  ์•„๋‹ˆ๋ฉด ๋‹ค์‹œ ๋„ฃ๊ธฐ(์ˆœ์„œ ์ค‘์š”)
			stack.push(x);
			stack.push(y);
			stack.push(z);
		}
	} else {
		stack.push(z);
	}
}

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ์กด ๋ฌธ์ž์—ด์—์„œ 110์„ ๋นผ๊ณ  ๋‚จ์€ ๋ฌธ์ž๋งŒ์ด Stack์— ๋‹ด๊ฒจ์žˆ๋‹ค.

 

์ด์ œ 110์„ ๋ฌธ์ž์—ด์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” 0 ๋’ค์— ๋„ฃ์–ด์ฃผ์ž.

int idx = stack.size();
boolean flag = false; // 0 ๋ฐœ๊ฒฌ ์—ฌ๋ถ€
StringBuilder sb = new StringBuilder(); // stack์—์„œ ๋ฌธ์ž ์˜ฎ๊ธธ ๊ณณ
        
while(!stack.isEmpty()) {
	if(!flag && stack.peek() == '1') { // 0์ด ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜๊ณ , 1์ด๋ฉด
		idx--;
	}
            
 	if(!flag && stack.peek() == '0') { // 0์ด ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜๊ณ , 0์ด๋ฉด
		flag = true;
	}
            
	sb.insert(0, stack.pop()); // ์™ผ์ชฝ์— ์‚ฝ์ž…
}
            
if (cnt > 0) { // 110 ๊ฐœ์ˆ˜๋งŒํผ ๋ถ™์—ฌ์ค€๋‹ค.
	while(cnt-- > 0) {
		sb.insert(idx, "110");
		idx += 3;
	}
}

 

์œ„ ํ’€์ด ๋ฐฉ์‹์„ ์ „์ฒด ์ฝ”๋“œ๋กœ ํ’€์–ด๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

import java.util.*;

class Solution {
    public String[] solution(String[] s) {
        String[] answer = new String[s.length];
        for(int i = 0; i < s.length; i++) {
            answer[i] = solve(s[i]);
        }
        return answer;
    }
    
    private String solve(String str) {
        Stack<Character> stack = new Stack<>();
        int cnt = 0;
        
        for (int i = 0; i < str.length(); i++) {
            char z = str.charAt(i);
            
            if (stack.size() >= 2) {
                char y = stack.pop();
                char x = stack.pop();
                
                if (x == '1' && y == '1' && z == '0') {
                    cnt++;
                } else { // ํ™•์ธํ•˜๊ณ  ์•„๋‹ˆ๋ฉด ๋‹ค์‹œ ๋„ฃ๊ธฐ
                    stack.push(x);
                    stack.push(y);
                    stack.push(z);
                }
            } else {
                stack.push(z);
            }
        }
        
        int idx = stack.size();
        boolean flag = false;
        StringBuilder sb = new StringBuilder();
        
        while(!stack.isEmpty()) {
            if(!flag && stack.peek() == '1') {
                idx--;
            }
            
            if(!flag && stack.peek() == '0') {
                flag = true;
            }
            
            sb.insert(0, stack.pop()); // ์™ผ์ชฝ์— ์‚ฝ์ž…
        }
            
        if (cnt > 0) {
            while(cnt-- > 0) {
                sb.insert(idx, "110");
                idx += 3;
            }
        }
            
        return sb.toString();
    }
}

 

โœจ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๋ฉฐ

ํ’€์ด๋ฐฉ๋ฒ•์„ ๋– ์˜ฌ๋ฆฌ๊ธฐ ์–ด๋ ค์› ๊ณ , ๊ตฌํ˜„ ์ž์ฒด๋Š” ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์€ ๋ฌธ์ œ์˜€๋‹ค. ํ•ญ์ƒ ๋ฌธ์ž์—ด ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์ƒ๊ฐํ•œ ๊ฑด๋ฐ ๋ฌธ์ž์—ด ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค๋ฉด ์ผ๋‹จ ์Šคํƒ ํ™œ์šฉ์„ ์ƒ๊ฐํ•˜๋ฉฐ ์ ‘๊ทผํ•˜๋ฉด ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•
LIST