
링크: https://school.programmers.co.kr/learn/courses/30/lessons/60057
문제분류 : 문자열
난이도 : Level 2
풀이시간 : 40분
결과: 실패
풀이 아이디어나 과정 자체는 모범 답안과 일치했다.
문제에서 변하는 부분은 길이와 비교하는 문자열 단위이다.
그래서 변하는 부분만 잘 잡아놓으면 쉽게 답을 도출 할 수 있을 줄 알았다.
하지만 내 아이디어를 코드로 풀어내는 방식이 오히려 알고리즘 풀이를 어렵게 만들었다.
모범 답안과 내 풀이를 비교하면서 다시 한번 깨달은 점이 하나있다.
프로그래머는 큰 문제를 작게 만들어서 해결해야 한다는 것이다.
풀이 방법을 알았다고 해서 코드 작성하는 단위를 너무 큼직하게 잡으니 오히려 풀이가 꼬였다.
천리 길도 한 걸음부터라고 하는데, 문제를 더 작은 단위로 쪼개서 하나하나 맞춰나가자!

문제 해결은 다음과 같이 진행된다.
1번은 for문으로 구현했다. 자르는 길이를 1부터 시작해서 점차 늘려간다.
2번, 3번은 compress 메서드 안에 구현했다.

이 메서드에서 split 메서드 아래로는 3번에 해당하는 로직이 구현되어 있다.
잘린 문자열(token)을 기준이 되는 문자열(last)과 비교(equals)한다.
기준 문자와 잘린 문자를 비교하고 규칙에 따라 아래와 같이 진행한다.
잘린 문자열과 비교가 모두 끝나면 마지막에 못 붙인 문자열을 붙인다.
압축된 문자열을 반환한다.
여기서 내 코드 풀이와 크게 차이가 났던 부분은 split 메서드 부분이었다.

이 코드는 자르는 단위를 기준으로 문자열 전체를 모두 자른다.
그리고 그 자른 문자열들(tokens)를 반환한다.
이렇게 한 번에 나르고 나서 비교를 하니 알고리즘 구현이 훨~씬 간단했다.
내가 구현한 방식은 너무 복잡했다. 나는 아래와 같은 방법으로 구현했다.
이렇게 구현했을 때 어려웠던 점은 아래와 같다.
모범 답안처럼 문자열을 한 번에 잘라 놓으면 자를 때
위에 말한 3가지 어려운 점을 모두 해결할 수 있다.
여러 개의 작업을 한 번에 수행(자르고, 비교하고, 위치 변경)하니 로직이 꼬인다.
항상 생각하자...! 복잡한 문제가 있다면 작게 더 작게!