https://programmers.co.kr/learn/courses/30/lessons/12973
코딩테스트 연습 - 짝지어 제거하기
짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙
programmers.co.kr
문제 요약
1. 입력받은 문자열에서 붙어있는 문자 중 같은 문자가 있을 경우 제거한다.
ex) baab -> bb
2. 위 예제와 같이 제거 후 남는 문자열로 1번 작업을 다시 실행한다.
3. 위 예제와 같이 모두 제거되는 경우 1을 반환, 아닌 경우 0을 반환한다.
풀이 방법
1. 자료형을 뭘 쓸까 하다 처음 든 생각은 Stack을 2개 써서 옮겨담는다 였으나
생각해보니 index계산하기가 귀찮아서 ArrayList로 우회했다.
2. ArrayList에 입력받은 문자열을 쪼개서 나눠 담는다.
3. 리스트가 빌때까지 while문을 반복하며 그 안에서 for문으로 인접해있는 동일 문자를 찾으면 제거 하도록 한다.
4. for문으로 탐색 시 동일 문자가 없어 제거된 문자가 없을 경우 더이상 진행이 불가능 하다고 판단하고 0을 반환한다.
5. 모두 제거가 되었다면 1을 반환한다.
효율화 테스트 통과 방법
풀이방법 2번에서
입력받은 문자열을 쪼개서 리스트에 담을 때
리스트의 마지막 문자와 담으려는 문자가 일치 할 경우 담지 않고 마지막 문자를 제거하는 로직을 추가.
while문을 돌릴 대상을 만드는 과정에서부터 인접하며 동일한 문자들을 제거하기 때문에
반복문의 횟수가 줄어드는 것을 확인 할 수 있다.
import java.util.ArrayList;
class Solution
{
public int solution(String s)
{
ArrayList<String> strArr = new ArrayList<>();
int answer = 1;
for(String temp : s.split("")){
if(strArr.size()>0){
// 리스트에 담기전에 동일한 문자가 겹치는 경우
// 대상 문자도 리스트에 담지 않고, 이와 인접한 마지막 문자를 제거한다.
if(!strArr.get(strArr.size()-1).equals(temp)){
strArr.add(temp);
}else{
strArr.remove(strArr.size()-1);
}
}else{
strArr.add(temp);
}
}
while(!strArr.isEmpty()){
boolean isDeleted = false;
for(int i=0; i<strArr.size()-1; i++){
if(strArr.get(i).equals(strArr.get(1+i))){
strArr.remove(i);
strArr.remove(i);
isDeleted = true;
break;
}
}
if(!isDeleted){
answer = 0;
break;
}
}
return answer;
}
}

'PROGRAMMING > ALGORITHM' 카테고리의 다른 글
| [프로그래머스] 타겟 넘버 JAVA DFS (0) | 2021.08.02 |
|---|---|
| [프로그래머스] 문자열 압축 JAVA (0) | 2021.07.31 |
| [프로그래머스] 음양 더하기 JAVA KOTLIN (0) | 2021.07.12 |
| [백준] 1476번 날짜 계산 JAVA (0) | 2021.06.20 |
| [백준] 2309번 일곱 난쟁이 JAVA 완전탐색 (0) | 2021.06.14 |