๐ง ํ๋ก๊ทธ๋๋จธ์ค 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();
}
}
โจ ํฌ์คํ ์ ๋ง์น๋ฉฐ
ํ์ด๋ฐฉ๋ฒ์ ๋ ์ฌ๋ฆฌ๊ธฐ ์ด๋ ค์ ๊ณ , ๊ตฌํ ์์ฒด๋ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ ๋ฌธ์ ์๋ค. ํญ์ ๋ฌธ์์ด ๊ด๋ จ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์๊ฐํ ๊ฑด๋ฐ ๋ฌธ์์ด ๋ฌธ์ ๊ฐ ๋์ค๋ฉด ์ผ๋จ ์คํ ํ์ฉ์ ์๊ฐํ๋ฉฐ ์ ๊ทผํ๋ฉด ์ข ๋ ํจ์จ์ ์ผ๋ก ํ ์ ์์ ๊ฒ ๊ฐ๋ค.