알고리즘 공부
프로그래머스 2017:팁스다운 [짝지어 제거하기] Java 문제 풀이
개발자가 말대꾸?
2022. 4. 21. 19:11
https://programmers.co.kr/learn/courses/30/lessons/12973?language=java
코딩테스트 연습 - 짝지어 제거하기
짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙
programmers.co.kr
import java.util.Stack;
class Solution
{
public int solution(String s)
{
Stack<Character> stack = new Stack<>();
for(char c : s.toCharArray()){
if( ! stack.isEmpty() && stack.peek() == c ) stack.pop();
else stack.push(c);
}
return stack.isEmpty() ? 1 : 0;
}
}
문제 요약
- 같은 문자가 연이어 나온다면 제거할 수 있습니다.
- 계속 반복해서 문자열을 없앤다면 1을 리턴합니다.
예시
- s 가 "baabaa"라면 가운데 "aa"를 없앱니다.
- "bbaa"에서 "bb"를 없앱니다.
- "aa" 마지막으로 "aa"를 없애면 문자열의 길이는 0입니다.
- 1을 리턴합니다.
로직
- Stack<Character> 를 만듭니다.
- 문자열을 순회합니다.
- 스택이 비어있다면 push(Element e) 메소드를 사용해서 문자열을 스택에 넣습니다.
- 스택이 비어있지않다면 다음 문자열이 스택에 있는 문자열과 같은지 체크합니다.
- 같다면 현재의 문자열은 stack에 넣지 않고, 전 문자열은 pop() 메소드를 사용해서 빼냅니다.
문자열의 순회가 끝났을때 스택이 비어있다면 1을 리턴, 반대라면 0을 리턴합니다.
다른 개발자 분의 풀이
import java.util.Stack;
class Solution
{
public int solution(String s)
{
byte[] bytes = s.getBytes();
int length = bytes.length;
Stack<Integer> stack = new Stack<>();
int iLeft = 0, iRight = iLeft + 1;
for (; iLeft < length && iRight < length; ) {
if (bytes[iLeft] == bytes[iRight]) {
// bytes[iLeft] = 0;
// bytes[iRight] = 0;
if (stack.empty()) {
/*
while (iLeft >= 0 && bytes[iLeft] == 0) iLeft--;
while (iRight < length && bytes[iRight] == 0) iRight++;
if (iLeft < 0) iLeft = iRight;
if (iRight <= iLeft) iRight = iLeft + 1;
*/
iLeft = iRight + 1;
iRight = iLeft + 1;
} else {
iLeft = stack.pop();
iRight++;
}
} else {
stack.push(iLeft);
iLeft = iRight;
iRight = iLeft + 1;
}
}
return iLeft >= length && iRight >= length ? 1 : 0;
}
}
1바이트 문자열에 쓸 수 있는 신박한 풀이네요.
한 수 배웠습니다.