티스토리 뷰
[ 프로그래머스 ] 짝지어 제거하기 ( 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 |
- Total
- Today
- Yesterday
- 단체사진 찍기
- Brainf**k 인터프리터
- 라면공장
- 괄호 변환
- 프로그래머스
- programmers
- 짝지어 제거하기
- 가장 큰 정사각형 찾기
- 정수 내림차순으로 배치하기
- 큰 수 만들기
- 3954
- 게리맨더링 2
- 17779
- 주사위 윷놀이
- 카카오 2020 공채
- 2018 카카오 공채
- java
- 17825
- 티스토리챌린지
- DP
- 문자열을 정수로 바꾸기
- 백준
- 찾아라 프로그래밍 마에스터
- 124 나라의 숫자
- 투포인터
- 자바
- 오블완
- 후보키
- 2019 카카오 공채
- 카카오2020 공채
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |