[ 프로그래머스 ] 짝지어 제거하기 ( java )
짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.
예를 들어, 문자열 S = baabaa 라면
b aa baa → bb aa → aa →
의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.
제한사항
-
문자열의 길이 : 1,000,000이하의 자연수
-
문자열은 모두 소문자로 이루어져 있습니다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/12973
핵심
' b aa baa → bb aa → aa ' 를 보면 바로 짝지어 지는 문자열 끼리 제거 후 다시 이어붙이게 된다.
문자열 사용하게 되면 삭제하고 이어붙이는 작업이 많아진다. 다른 방법을 생각하다 스택쓰면 되겠다고 생각했다.
스택 사용하기
루프를 돌며 새로운 문자를 검사할때, 직전에 저장해둔 문자와 같은지 검사하고 삭제하면 된다.
stack: 아직 짝 지어지지 않은 가장 최근에 검사한 문자가 제일 위에 있도록 유지한다.
- push(새 문자): 새 문자가 stack의 top과 매칭이 안 되면 저장한다.
- pop(); 새 문자가 stack의 top과 동일하다. 그래서 저장대신 pop하여 제일 최근에 넣어둔 문자를 제거.
모든 문자를 검사했을 때, stack이 비었다면, 모든 문자가 짝을 이룰 수 있다.
아니면, 짝을 못 이루는 문자가 존재. stack에는 아직 짝 지어지지 않은 문자만 저장하기 때문
추가적으로 더 궁금한 점 있으면 댓글 달아주세요
코드
import java.util.*;
class Solution
{
public int solution(String s)
{
char[] input = s.toCharArray();
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < input.length ; i++) {
if(!stack.empty() && stack.peek() == input[i] ) {
stack.pop();
}else {
stack.push(input[i]);
}
}
if(stack.empty()) {
return 1;
}else {
return 0;
}
}
}
'CS > 알고리즘 풀이' 카테고리의 다른 글
[ 프로그래머스 ] 땅따먹기 ( 자바 ) (0) | 2020.01.22 |
---|---|
[ 프로그래머스 ] 라면공장 ( 자바 ) (0) | 2020.01.05 |
[ 프로그래머스 ] 큰 수 만들기 ( 자바) (0) | 2019.12.30 |
[ 프로그래머스 ] 구명보트 ( 자바 ) (0) | 2019.12.28 |
[ 프로그래머스 ] H-Index (자바) (0) | 2019.12.28 |