🙇♂️ URL : https://leetcode.com/problems/make-the-string-great/
🤷♂️ Difficulty: Easy
💆♂️ Submissions
- RunTime: 2 ms, faster than 86.43% of Java online submissions
- Memory Usage: 38.9 MB, less than 42.38% of Java online submissions
class Solution {
public String makeGood(String s) {
Deque<Character> queue = new ArrayDeque<>();
String result = "";
if(s.length() == 1) {
return s;
}
int count = 0;
while(count != s.length()) {
char value = s.charAt(count);
if(queue.isEmpty()) {
queue.offer(value);
} else {
if(Math.abs((int)(queue.peekLast()) - (int)value) == 32) {
queue.pollLast();
} else {
queue.offer(value);
}
}
count+=1;
}
while(!queue.isEmpty()) {
result += queue.poll();
}
return result;
}
}
서로 마주한 인덱스가 소문자-대문자 또는 대문자-소문자 형식으로 이루어졌을 경우, 해당 두 문자를 삭제해서 최종적으로 남는 문자열의 모양을 반환해주는 문제이다. 결국 인덱스 별로 하나씩 문자를 넣어보면서 인접하면 바로 지워주는 방식을 만들어줘야 하는데, 처음에는 Stack으로 접근했다.
대소문자의 구분은 아스키코드를 사용했다. 인접한 두 값의 차이가 32면 대소문자로 확인할 수 있다.
Stack은 LIFO(Last In First Out) 형식으로, 가장 최근에 삽입한 항목과 비교할 데이터를 조회하면서 대소문자 형태면 새로운 데이터를 넣지 않고 가장 최근에 삽입한 데이터를 Pop해주는 방식으로 구현하려 했다. 하지만 최종적으로 만들어진 Stack 안의 데이터를 다 출력하려다 보니 Stack은 역순화를 다시 시켜줘야 하는 번거로움이 있었다.
그러던 중 Deque(Stack 기능도 쓸 수 있고, Queue 기능도 쓸 수 있음)를 사용하면 대소문자 구분시에는 Stack의 기능을, 최종적으로 데이터를 만들어낼 때에는 Queue의 기능을 사용할 수 있을 것이라 판단하였고, 손쉽게 구현을 완료할 수 있었다.