프로그래머스 - 숫자 문자열과 영단어

프로그래머스 - 숫자 문자열과 영단어

프로그래머스 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;
        }
    }
}



© 2022. All rights reserved.