프로그래머스 - 숫자 문자열과 영단어
in Computer Science / Data-structure-algorithm
프로그래머스 81301번 문제
@DisplayName("프로그래머스 81301 - 숫자 문자열과 영단어")
class Programmers81301Test {
Programmers81301 solve = new Programmers81301();
@MethodSource
@ParameterizedTest
void solution(String question, int expected) throws Exception {
int actual = solve.solution(question);
assertThat(actual).isEqualTo(expected);
}
static Stream<Arguments> solution() {
return Stream.of(
Arguments.of("one4seveneight", 1478),
Arguments.of("23four5six7", 234567),
Arguments.of("2three45sixseven", 234567),
Arguments.of("123", 123)
);
}
}
전형적인 문자열 문제이다.
사용하는 언어의 SDK
를 잘 활용한다면 쉽게 풀 수 있을 것 같다.
나는 enum
과 정규식
을 통해 풀었다.
처음 입력받은 문자열이 오직 숫자로만 이뤄져있다면 별도의 연산이 필요없으므로 즉시 반환한다.
이후 정규식을 사용해 스텝바이 스텝으로 문자를 숫자로 변경하고 문자열에 문자가 없는지를 체크한다.
replace
를 통해 문자를 숫자로 변경하고 보니 문자열에 더이상 문자가 존재하지 않다면 추가적인 연산이 필요하지 않기 때문이다.
아마 enum
을 사용하지 않고 클래스 멤버에 배열을 하드코딩했다면 코드가 훨씬 짧아지긴 했겠지만, 이러면 가독성과 유지보수성이 똥이되므로 선호하지 않는다.
class Programmers81301 {
int solution(String question) {
if (isDigitAll(question)) {
return Integer.parseInt(question);
}
for (Numbers number : Numbers.values()) {
question = question.replace(number.getRegex(), number.getReplacement());
if (isDigitAll(question)) {
return Integer.parseInt(question);
}
}
return Integer.parseInt(question);
}
private boolean isDigitAll(String question) {
return question.chars()
.allMatch(Character::isDigit);
}
private enum Numbers {
ZERO("0"),
ONE("1"),
TWO("2"),
THREE("3"),
FOUR("4"),
FIVE("5"),
SIX("6"),
SEVEN("7"),
EIGHT("8"),
NINE("9");
private final String replacement;
Numbers(String replacement) {
this.replacement = replacement;
}
private String getRegex() {
return this.name()
.toLowerCase();
}
private String getReplacement() {
return replacement;
}
}
}