해당 포스팅은 이전 기수 프리코스 1주차 2번 문제를 풀어보았다.
알고리즘 문제에서 자주 나올법한 문제였다. 생각보다 로직을 어떻게 구성할지 고민을 많이하였다. 풀이 방법도 여러가지가 있을 것 같은데 Stack을 활용해 풀어보았다.
private static String solution(String word) {
Stack<Character> stack = removeConsecutiveDuplicates(word);
return stackToString(stack);
}
private static String stackToString(Stack<Character> stack) {
StringBuilder sb = new StringBuilder();
for (Character character : stack) {
sb.append(character);
}
return sb.toString();
}
private static Stack<Character> removeConsecutiveDuplicates(String word) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < word.length(); i++) {
if (!stack.isEmpty() && stack.peek() == word.charAt(i)) {
char target = word.charAt(i);
while (i < word.length() && word.charAt(i) == target) {
i++;
}
stack.pop();
i--;
} else {
stack.push(word.charAt(i));
}
}
return stack;
}
이번 문제는 기능을 구현하는데 분리가 어디서 되어야하지? 라는 고민을 하게 되었다.
solution은 각각 문자를 Stack을 통해 연속된 문자를 제거하는 기능, Stack을 String으로 변환하는 기능을 분리하였다. 내가 고민했던 부분은 연속된 문자를 제거하는 기능이였는데, 해당 기능이 더 분리되어야할까? 였다.
설계한 프로세스가 좋은 프로세스인가? 라는 생각이 많이 들었다. 기능을 분리하려다보니 이미 for문 안에서 한번에 기능을 수행하고 있다보니 분리하는데 고민이 많았는데, 하나의 로직에서 하나의 결과를 도출 하는 것은 맞지만 다소 가독성이 떨어지는 코드인 것 같다.
나중에 개선의 여지가 보인다면 수정해보고싶다..🥲