-
[프로그래머스 / JAVA] 짝지어 제거하기 (정답 코드)코딩/코테준비(JAVA) 2025. 2. 1. 21:04
자바 공부와 코딩테스트 준비를 병행할 겸 자바로 코테 준비를 며칠 전 시작했다.
막히거나 틀린 부분이 있더라도, 그냥 그대로 내가 스스로 작성한 부분들을 기록해 두려고 한다.
그냥 미래의 복기용으로 나를 위해 적어둔 기록이다.
(이 사람은 어떻게 성공하거나 실패했는지 살펴보는 용도로도 적합할 것 같다.)이 문제는 아이디어가 바로 떠오르지 않아, 접근법을 참고해서 코드를 작성했다.
처음에 내가 이 문제를 마주했을 때는, 인덱스 0부터 문자열의 끝까지 순회하면서 문자열을 자르고 붙이는 방식으로 해결해야 할 것 같다는 생각이 들었다.
그런데 제약 조건에서 나와있듯이, 문자열의 길이가 1,000,000 이하의 자연수로, 조금만 복잡하게 구현하면 바로 시간 초과가 떠버린다.
이 정도의 제약 조건이면, O(N)의 알고리즘을 이용해야 한다. 즉, 문자열을 순회하면서 한큐에 해결해버려야 하는 문제였다.
이 문제는 "현재 문자와 그다음에 나타날 문자"(인덱스 i와 i+1)의 시각으로 바라보면 해결 방법을 떠올리기 어렵다.
"현재 문자와 바로 이전에 나타난 문자"(인덱스 i와 i-1)의 시각으로 바라보면 편하다.
나(현재 문자) 바로 앞에 있는 문자가 나랑 같으면 짝이니까 지워주면 된다.
짝이 아직 안 지어진 앞쪽 문자열들은 어딘가에 저장해놔야 한다.
제일 최근에 집어넣은 문자가 제일 먼저 나오는 자료구조는 스택(Stack)이다.
나랑 스택의 맨 위의 문자가 같으면, 나는 없애버리고, 나랑 짝인 맨 위의 문자도 없애버려야 하니 스택을 한번 pop 시켜주면 된다.
전부 다 순회한 이후, 스택이 비어있으면 성공.
import java.util.ArrayDeque; class Solution { public int solution(String s) { char[] a = s.toCharArray(); ArrayDeque<Character> stack = new ArrayDeque<>(); stack.push(a[0]); //맨 앞 문자는 그 앞에 짝이 없으므로 스택에 집어넣어놓기 for (int i = 1; i < a.length; i++) { //맨 앞 다음 문자부터 맨 뒤 문자까지 순회 if(stack.isEmpty()) { //스택이 비어있으면 이어질 짝이 없는거니까 스택에 push해 놓고 다음 문자로 넘어가기 stack.push(a[i]); continue; } if(stack.peek() == a[i]) { //스택 맨위의 문자(현재 문자 바로 앞에 있는 문자)랑 같으면 짝지어주고 두개 없애버리기 stack.pop(); } else { //짝이 안맞으면 그냥 이 문자도 스택에 push하고 다음 문자로 넘어가기 stack.push(a[i]); } } if (stack.isEmpty()) { //전부 다 돌았을 때 스택(문자열)이 비어있으면 성공 return 1; } else { //아니면 실패 return 0; } } }
하루에 한문제 이상 꾸준히 풀자.
실수는 많이 할수록, 더 많이 배울 수 있다.
https://school.programmers.co.kr/learn/courses/30/lessons/12973
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
'코딩 > 코테준비(JAVA)' 카테고리의 다른 글
[프로그래머스 / JAVA] 크레인 인형뽑기 게임 (정답 풀이) (0) 2025.02.06 [프로그래머스 / JAVA] 주식 가격 (정답 풀이) (1) 2025.02.02 [프로그래머스 / JAVA] 올바른 괄호 (정답 코드) (1) 2025.01.31 [프로그래머스 / JAVA] 방문 길이 (잘못된 풀이) (0) 2025.01.31 [프로그래머스 / JAVA] 실패율 (중간에 막힘) (0) 2025.01.28