티스토리 뷰

프로그래머스 72410번 - 신규 아이디 추천

프로그래머스 72410번 - https://programmers.co.kr/learn/courses/30/lessons/72410
프로그래머스 72410번 - https://programmers.co.kr/learn/courses/30/lessons/72410
프로그래머스 72410번 - https://programmers.co.kr/learn/courses/30/lessons/72410

 

요구사항

1. 주어진 문자열을 주어진 1~7단계의 처리 과정을 거친 후의 추천 아이디를 반환하라.

 

요구사항 분석 및  풀이과정

1. 정직하게 각 단계의 처리 과정에 맞게 처리하여주면 된다. 뇌를 빼고 가능하다.

 

각 단계마다 메서드를 분할하였으며 각 단계의 처리과정에 해당하는 메서드는 다음과 같다.

 

1단계 : toLower(String id)

2단계 : eraseDenyPattern(String id)

3단계 : eraseContinuousPoint(String id)

4단계 : trimPoint(String id)

5단계 : requireNonEmpty(String id)

6단계 : cutOver(String id, 16)

7단계 : lastLetterRepeat(String id, 3)

 

소스코드 작성

import java.util.Stack;

class Solution {

    private static boolean isCheckEmptyOrPoint(String id) {
        return "".equals(id) || ".".equals(id);
    }

    private static String toLowerCase(String id) {
        return id.toLowerCase();
    }

    private static String eraseDenyPattern(String id) {
        StringBuilder result = new StringBuilder();

        for (char c : id.toCharArray()) {
            if ((Character.isLowerCase(c) && Character.isLetter(c)) || Character.isDigit(c)
                || c == '-' || c == '_' || c == '.') {
                result.append(c);
            }
        }

        return result.toString();
    }

    private static String eraseContinuousPoint(String id) {
        Stack<Integer> stack = new Stack<>();

        for (char c : id.toCharArray()) {
            if (c == '.') {
                if (!stack.isEmpty() && stack.peek() == c) {
                    continue;
                }

                stack.push((int) c);
                continue;
            }

            stack.push((int) c);
        }

        StringBuilder result = new StringBuilder();

        for (int v : stack) {
            result.append((char) v);
        }

        return result.toString();
    }

    private static String leftTrimPoint(String id) {
        if (isCheckEmptyOrPoint(id)) {
            return "";
        }

        return id.charAt(0) == '.' ? id.substring(1) : id;
    }

    private static String rightTrimPoint(String id) {
        if (isCheckEmptyOrPoint(id)) {
            return "";
        }

        return id.charAt(id.length() - 1) == '.' ? id.substring(0, id.length() - 1) : id;
    }

    private static String trimPoint(String id) {
        return leftTrimPoint(rightTrimPoint(id));
    }

    private static String requireNonEmpty(String id) {
        return id.length() == 0 ? "a" : id;
    }

    private static String cutOver(String id, int len) {
        if (id.length() >= len) {
            return rightTrimPoint(id.substring(0, len - 1));
        }

        return id;
    }

    private static String lastLetterRepeat(String id, int len) {
        if (id.length() <= 2) {
            StringBuilder result = new StringBuilder(id);
            for (int i = 1; i <= len - id.length(); i++) {
                result.append(id.charAt(id.length() - 1));
            }

            return result.toString();
        }

        return id;
    }

    public String recommandIdFrom(String id) {
        String first = toLowerCase(id);
        String second = eraseDenyPattern(first);
        String third = eraseContinuousPoint(second);
        String fourth = trimPoint(third);
        String fifth = requireNonEmpty(fourth);
        String sixth = cutOver(fifth, 16);
        return lastLetterRepeat(sixth, 3);
    }

    public String solution(String newId) {
        return recommandIdFrom(newId);
    }
}

 

결과

 

소스코드 깃허브 주소

링크

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함