728x90
⬛ 프로그래머스 | LV.2 짝지어 제거하기 - Stack 활용
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이하의 자연수
- 문자열은 모두 소문자로 이루어져 있습니다.
💚나의 풀이
- 이 문제를 딱 봤을 때 처리해야 하는 큰 2가지 쟁점이 떠오를 것이다.
(1) 연달아 2개의 문자가 짝을 이룬다는 걸 어떻게 확인할 거냐 ?
(2) 그걸 확인했다면 어떻게 제거할 거냐 ?
- 바로 스택(Stack) 을 활용하여 풀면 된다.
- 처음 마주했을 때, 문자열을 for문이든 while() 문이든 처리하려고 했다면 무조건 틀린다. 무.조.건
- 제한 사항을 보면 알겠지만, 문자열 길이는 최대 1,000,000 만큼 들어오기 때문이다. 이중 for문만 돌려도 초과가 뜰 것이다.
[풀이 과정]
- 처음부터 길이가 0인 String 값이 들어올 경우, 애초에 어떤 처리도 불가능한 상태. 0반환
- idx = 0 일 때, 첫 글자를 스택에 push한다. 그리고, idx = 0→1
- idx = 1인 상태에서 while() 문을 진입한다.
(1) 현재 c의 값은 ‘a’ 가 된다. idx = 1 → 2
peek()한 값인 ‘b’와 현재 c의 값인 ‘a’가 다르다. 따라서 현재 ‘a’값을 스택에 push() 처리
(2) 현재 c의 값은 ‘a’가 된다. idx = 2 → 3
peek()한 값은 ‘a’이고, 현재 값도 ‘a’로 같다. 따라서 스택 값 pop() 처리
(3) 현재 c의 값은 ‘b’가 된다. idx = 3 → 4
peek()한 값은 ‘b’이고, 현재 값도 ‘b’로 같다. 따라서 스택 값 pop() 처리
(4) 현재 c의 값은 ‘a’가 된다. idx = 4 → 5
스택이 현재 isEmpty()인 상태이므로, 현재값을 스택에 push() 처리
(5) 현재 c의 값은 ‘a’가 된다, idx = 5 → 6
peek()한 값은 ‘a’ 이고, 현재 값도 ‘a’로 같다. 따라서 스택 pop() 처리한다.
동시에, 현재 idx값이 6이 된 상태이다. while()문의 조건 탈락해서 탈출한다. - while()문을 탈출한 상태에서, 스택의 상태가 빈 상태이면 모두 처리한 것이므로 1을 반환, 아니라면 0을 반환한다.
💚 제출 코드
import java.util.*;
class Solution{
public int solution(String s) {
int answer = -1;
Stack<Character> stack = new Stack<>();
int idx = 0; //인덱스 지칭용
if(s.length() == 0){ //처음부터 길이 0 짜리가 들어왔다면
return 0; //그냥 적용 불가능한 상태이므로 - 0 반환
}
//1) 첫 글자는 스택에 push
stack.push(s.charAt(idx));
idx++;
while(idx<s.length()){
char c = s.charAt(idx);
idx++;
if(!stack.isEmpty() && stack.peek() == c){
stack.pop();
}else{
stack.push(c);
}
}
if(stack.isEmpty()){
answer = 1;
}else{
answer= 0;
}
return answer;
}
}
728x90
'코딩 테스트 [준비] > [문풀] 프로그래머스_문풀_조지기' 카테고리의 다른 글
프로그래머스 | LV.2 예상 대진표 - 단순 구현 문풀 (Java) (2) | 2023.12.11 |
---|---|
프로그래머스 | LV.2 영어 끝말잇기 - HashMap 활용 (Java) (3) | 2023.12.06 |
프로그래머스 | LV.3 섬 연결하기 - 최소비용 신장 트리 (Java) (0) | 2023.07.20 |
프로그래머스 | LV.2 구명보트 - 그리디 문풀 (Java) (0) | 2023.06.30 |
프로그래머스 | LV.2 게임 맵 최단 거리 - BFS 풀이 (Java) (0) | 2023.06.29 |