https://programmers.co.kr/learn/courses/30/lessons/12973
문제
- 문자열 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;
}
}
'algorithm' 카테고리의 다른 글
[프로그래머스][1차]캐시 (0) | 2020.04.04 |
---|---|
[프로그래머스]소수 만들기 - 재귀함수 (0) | 2020.03.22 |
[프로그래머스]더 맵게 (0) | 2020.03.07 |
[프로그래머스]멀쩡한 사각형 (0) | 2020.03.01 |
[프로그래머스]기능개발 (0) | 2020.01.12 |