문제 링크
문제
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
예제 입력 1
3
1110
100111100
0111111010
예제 출력 1
1101
100110110
0110110111
입출력 예 설명
입출력 예 #1
- 다음 그림은 "1110"을 "1101"로 만드는 과정을 나타낸 것입니다.
- "1101"보다 사전 순으로 더 앞에 오는 문자열을 만들 수 없으므로, 배열에 "1101"을 담아야 합니다.
- 다음 그림은 "100111100"을 "100110110"으로 만드는 과정을 나타낸 것입니다.
- "100110110"보다 사전 순으로 더 앞에 오는 문자열을 만들 수 없으므로, 배열에 "100110110"을 담아야 합니다.
- 그림에 나온 방식 말고도 다른 방법으로 "100110110"을 만들 수 있습니다.
- 다음 그림은 "0111111010"을 "0110110111"로 만드는 과정을 나타낸 것입니다.
- "0110110111"보다 사전 순으로 더 앞에 오는 문자열을 만들 수 없으므로, 배열에 "0110110111"을 담아야 합니다.
- 그림에 나온 방식 말고도 다른 방법으로 "0110110111"을 만들 수 있습니다.
알고리즘 분류
- 자료 구조
풀이
문자열을 순서대로 스택에 추가하면서, 도중에 110이 등장하면 110은 스택에서 제외하고 110 count를 1 증가시킨다.
작업이 끝났다면, count개의 110을 적절하게 배치하여 사전 순으로 가장 앞으로 오도록 문자열을 정렬해야 한다.
근데 문자열에는 0과 1밖에 존재하지 않는다. 110은 1로 시작하고 0으로 끝난다. 따라서 110의 앞에 0이 등장해야 한다.
예를 들면 문자열 0이 있고, 110 1개가 존재하면, 0110이 1100보다 사전 순으로 앞에 오는 것이 당연하다.
이렇게 1을 발견하면 그 앞의 문자열을 탐색하고, 0을 발견하면 해당 0 뒤에 110을 배치한다.
문자열의 앞까지 탐색했는데도 0이 없었다면, 문자열의 맨 앞에 110을 배치한다.
이런 식으로 count개의 110을 배치하고 마지막으로 반환되는 문자열을 출력한다.
해결 완료 시각
코드
import java.util.*;
class Solution {
private static Stack<Character> stack = new Stack<>();
private static int count;
private static String[] Answer;
public String[] solution(String[] s) {
Answer = new String[s.length];
for (int i = 0; i < s.length; i++) {
stack.clear();
count = 0;
String nowS = s[i];
for (int j = 0; j < nowS.length(); j++) {
if (nowS.charAt(j) == '1') {
stack.push('1');
} else {
if (stack.size() >= 2) {
char First = stack.pop();
char Second = stack.pop();
if ((First == '1') && (Second == '1')) {
count++;
} else {
stack.push(Second);
stack.push(First);
stack.push('0');
}
} else {
stack.push('0');
}
}
}
for (int j = 0; j < count; j++) {
Stack<Character> tmp = new Stack<>();
while (true) {
if (stack.isEmpty()) {
stack.push('1');
stack.push('1');
stack.push('0');
while (!tmp.isEmpty()) {
stack.push(tmp.pop());
}
break;
} else {
char now = stack.pop();
if (now == '0') {
stack.push(now);
stack.push('1');
stack.push('1');
stack.push('0');
while (!tmp.isEmpty()) {
stack.push(tmp.pop());
}
break;
} else {
tmp.push(now);
}
}
}
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
String Result = sb.reverse().toString();
Answer[i] = Result;
System.out.println();
}
return Answer;
}
}
'Programmers > Level 3' 카테고리의 다른 글
[Programmers/Level 3] 파괴되지 않은 건물(Java) (0) | 2024.11.14 |
---|---|
[Programmers/Level 3] 보석 쇼핑(Java) (1) | 2024.11.14 |
[Programmers/Level 3] 미로 탈출 명령어(Java) (0) | 2024.10.23 |
[Programmers/Level 3] 정수 삼각형(Java) (0) | 2024.10.10 |
[Programmers/Level 3] 경주로 건설(C++, Java) (1) | 2024.09.13 |