📖 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12973
문제 설명
짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.
예를 들어, 문자열 S = baabaa 라면
b aa baa → bb aa → aa →
의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.
제한사항- 문자열의 길이 : 1,000,000이하의 자연수
- 문자열은 모두 소문자로 이루어져 있습니다.
🔑 풀이
[실패 1] 효율성 테스트 실패
문자열을 순환하며 연속하는 문자가 있으면 삭제하고 처음부터 다시 순환하는 방식으로 풀었더니 시간 초과됨. stack을 사용하여 해결
[성공]
1. 문자열을 한 문자씩 순환한다
2. stack이 비었으면 문자를 넣는다.
3. 비지 않았다면 스택 상단 문자와 현재 문자를 비교해 같다면 pop, 다르다면 push.
4. 순환이 끝난 후 stack의 크기가 0이라면 answer=1, 아니라면 0
import java.util.Stack;
public class Solution {
public static int solution(String s) {
int answer = 0;
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (stack.empty())
stack.push(c);
else {
if (c == stack.peek())
stack.pop();
else
stack.push(c);
}
}
if (stack.size() == 0)
answer = 1;
return answer;
}
// public static void main(String[] args) {
// System.out.println(solution("cdcd"));
// }
}
첨에는 0으로 계속 되돌아가는 반복문이 문제라는 생각을 못해서 배열.. sb.. 리스트.. 다 써봐도 효율성 실패하길래(심지어 정확성 테스트에서까지 런타임 초과함 ㄷ ㄷ) 찾아봤더니 stack을 이용하면 단번에 풀리는 문제였다... 흥 ㅋ
stack 쓰겠다는 생각은 1번도 하지 않았기 때문에? 나만의 다른 방법을 찾아보겠답시고 replace를 이용해 aa부터 zz까지 한번에 싸악 바꿔버리는 코드를 짰다... 레전드 광기 어린 코드였는데 놀랍게도 처음 짠 코드보다 효율성 높게 나옴 ㅋ
하지만 여전히 완벽하게 통과하지 못해서 결국 그냥 스택으로 풀었다... 결국 나만의방법 못찾은 게 자존심상하네 ㅋ
'알고리즘' 카테고리의 다른 글
[프로그래머스 Lv.2] 카펫.java (0) | 2023.04.26 |
---|---|
[프로그래머스 Lv.2] 영어 끝말잇기.java (0) | 2023.04.26 |
[프로그래머스 Lv.2] 피보나치 수.java (0) | 2023.04.26 |
[프로그래머스 Lv.2] 다음 큰 숫자.java (0) | 2023.04.15 |
[프로그래머스 Lv.2] 숫자의 표현.java (0) | 2023.04.15 |