기기

[ 프로그래머스 ] 짝지어 제거하기 ( 자바 ) 본문

CS/알고리즘 풀이

[ 프로그래머스 ] 짝지어 제거하기 ( 자바 )

notEmpty 2019. 12. 30. 18:57

[ 프로그래머스 ] 짝지어 제거하기 ( 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

 

코딩테스트 연습 - 짝지어 제거하기 | 프로그래머스

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다. 예를 들

programmers.co.kr

 

핵심 

' 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;
		}
	}
}