Develop/Algorithm
우테코 온보딩 - Problem 2
IJY
2022. 11. 9. 11:28
우테코 온보딩 - Problem 2 문제 풀이
문제 설명
암호문을 좋아하는 괴짜 개발자 브라운이 이번에는 중복 문자를 이용한 새로운 암호를 만들었다. 예를 들어 "browoanoommnaon"이라는 암호문은 다음과 같은 순서로 해독할 수 있다.
1. "browoanoommnaon"
2. "browoannaon"
3. "browoaaon"
4. "browoon"
5. "brown"
임의의 문자열 cryptogram이 매개변수로 주어질 때, 연속하는 중복 문자들을 삭제한 결과를 return 하도록 solution 메서드를 완성하라.
제한사항
- cryptogram은 길이가 1 이상 1000 이하인 문자열이다.
- cryptogram은 알파벳 소문자로만 이루어져 있다.
문제의 자세한 내용은 해당 링크를 통해 확인 : 문제 링크
풀이 코드
package onboarding;
import java.util.List;
import java.util.stream.Collectors;
public class Problem2 {
public static String solution(String cryptogram) {
int count = 0;
List<Character> charList = cryptogram.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
Character base = charList.get(0);
for (int i = 1; i < charList.size(); ) {
if (charList.get(i).equals(base)) {
count += 1;
charList.remove(i);
} else {
if (count == 0) {
base = charList.get(i++);
} else {
count = 0;
charList.remove(--i);
base = charList.get(i - 1);
}
}
}
if (count != 0) {
charList.remove(charList.size() - 1);
}
return charList.stream().map(String::valueOf).collect(Collectors.joining());
}
}
문제 해결 전략
이라 쓰고 문제를 보고서 어떻게 풀면 될까?에 대한 생각을 정리한 항목
입력으로 들어오는 문자열을 문자 단위로 나눈 List로 변환 후 증감식을 정의하지 않은 for문을 돌면서 중복 단어 제거
base(left)와 index(i, right)에 위치한 문자를 비교
- 같은 경우
- index 문자를 리스트에서 제거
- count 증가
- 다른 경우
- count 확인, 0인 경우
- base를 index 문자로 변경 후 index 1 증가
- count 확인, 0이 아닌 경우
- count를 0으로 초기화
- index 1 감소 후 리스트에서 제거(base 제거 로직)
- base를 index - 1 값으로 변경(현재 index는 비교할 문자열(right)에 위치해 있으므로 -1을 해주어야 한다)
- count 확인, 0인 경우
for문을 빠져나온 후 count 확인하여 0이 아닌 경우 마지막 문자를 리스트에서 제거(마지막 base를 제거하는 로직)
이 후 리스트를 문자열로 변환하여 반환
정규표현식을 이용한 풀이(알고리즘 스터디원) : 깃 허브
코드를 업로드해 둔 깃 허브