본문 바로가기

algorithm

[프로그래머스]짝지어 제거하기

https://programmers.co.kr/learn/courses/30/lessons/12973

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

  • 문자열 S가 주어졌을 떄, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다. 예를 들어, 문자열 S = baabaa 라면 b aa baa -> bb aa -> aa 의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

제한사항

  • 문자열의 길이 : 1,000,000 이하의 자연수
  • 문자열은 모두 소문자로 이루어져 있습니다.

입출력의 예

      s                     result

  baabaa                    1

  cdcd                       0

 

풀이

입력을 스트링 값으로 받기에 toCharArray();를 사용하여 char 형으로 변경 하여 스택에 값을 저장할 수 있게 설정하였다.

 	char[] charS = new char[s.length()];
	Stack<Character> stack = new Stack<Character>();
    charS = s.toCharArray();

 

이 if 문은 while 문 안에 있는데 while 문을 탈출할 수 있는 조건(i는 char의 길이이다.)이면서 stack 안에 값이 없으면 answer의 값 1, stack 안에 값이 있으면 answer 의 값을 0을 준다. 

if (i ==  s.length()) {
	if(stack.empty()) {
		answer = 1;
		break;
	} else {
		answer = 0;
		break;
	}
}		
			

 

첫번째 조건은 stack에 값이 없으면 char의 배열의 값을 하나씩 넣어준다.

두번쨰 조건은 stack의 맨 위에 값이 다음에 들어올 char의 값이랑 같으면 기존에 stack에 있는 값을 빼준다.

세번째 조건은 stack에 값도 있고, peek() 값이 다음에 들어 올 값이랑 다를 때 char 값을 push 해준다.

 

이 조건을 chars의 길이 만큼 반복 해주고, char 길이 만큼 반복문이 돌았을 때, stack에 값이 남아 있는지 없는지를

판단해서 문자열을 짝지어서 제거했는지 안했는지 판단한다.

if (stack.empty()) {
	stack.push(charS[i]);
	i++;
}else if (stack.peek() == charS[i] ) {
	i++;
	stack.pop();
} else {
	stack.push(charS[i]);
	i++;
}

 

여기서 중요한 것은 처음에는 같은 값이 2개 이상 짝지어져 있으면 다 지워져도 되는줄 알았는데

2개 일때만 지워주어야 한다는 점이였다.

import java.util.*;
class Solution
{
    public int solution(String s)
    {
        int answer = 0;
        char[] charS = new char[s.length()];
		Stack<Character> stack = new Stack<Character>();
		int i = 0;
		
		charS = s.toCharArray();
						
		while(true) {
			
			if (i ==  s.length()) {
				if(stack.empty()) {
					answer = 1;
					break;
				} else {
					answer = 0;
					break;
				}
			}		
				
				if (stack.empty()) {
					stack.push(charS[i]);
					i++;
				}else if (stack.peek() == charS[i] ) {
					i++;
					stack.pop();
				} else {
					stack.push(charS[i]);
					i++;
				}
			
			}

        return answer;
    }
}