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

Sorbet·2021년 6월 12일
0

후기

  • 단순 구현문제라고 생각했는데, 생각보다 쉽지않았다
  • 먼저, 코딩해야할 분량이 많았는데, 정규표현식이나 stream을 좀 더 잘 활용할수 있었더라면 더 쉽게 풀렸을꺼같다. 나중에 정규표현식과 stream을 공부해서 다시 도전할 계획이다.
  • 논리적으로 7단계로 나눠져 있는데, 단계별로 쪼개서 공략하는거야 대부분의 로지컬 띵킹이 탑재된 사람이라면 생각해낼꺼같다.
  • 로컬에서 테스크코드를 작성해서 디버깅을 돌려가며 테스트 해보지 않았더라면 풀기 정말 힘들었을 문제였다.
class Solution {

    public String solution(String new_id) {
        String answer = s1(new_id);
        answer = s2(answer);
        answer = s3(answer);
        answer = s4(answer);
        answer = s5(answer);
        answer = s6(answer);
        answer = s7(answer);
        return answer;
    }

    private String s7(String answer) {
        StringBuilder builder = new StringBuilder(answer);
        if (answer.length() <= 2) {
            int idx = answer.length();

            while (builder.length() < 3) {
                builder.append(answer.charAt(idx - 1));
            }
        }
        return builder.toString();
    }

    private String s6(String answer) {
        if (answer.length() >= 16) {
            answer = answer.substring(0, 15);
        }

        answer = s4(answer);
        return answer;
    }

    private String s5(String answer) {
        if (answer.equals("")) {
            return "a";
        }
        return answer;
    }

    private String s4(String answer) {
        if (answer.equals(".")) {
            return "";
        }
        char[] arr = answer.toCharArray();

        if (arr[arr.length - 1] == '.') {
            answer = answer.substring(0, answer.length() - 1);
        }

        if (arr[0] == '.') {
            answer = answer.substring(1, answer.length());
        }
        return answer;
    }

    private String s3(String answer) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < answer.length(); i++) {
            if (answer.charAt(i) == '.' && (i != (answer.length() - 1))) {

                for (int j = i; j < answer.length(); j++) {
                    if (answer.charAt(j) != '.') {
                        builder.append('.');
                        builder.append(answer.charAt(j));
                        i = j;
                        break;
                    }
                }

            } else {
                builder.append(answer.charAt(i));
            }
        }

        return builder.toString();
    }

    private String s2(String answer) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < answer.length(); i++) {
            char curChar = answer.charAt(i);
            if ('a' <= curChar && curChar <= 'z') {
                builder.append(curChar);
            } else if ((curChar == '-') || (curChar == '_') || (curChar == '.')) {
                builder.append(curChar);
            } else if ('0' <= curChar && curChar <= '9') {
                builder.append(curChar);
            }
        }
        return builder.toString();
    }

    private String s1(String answer) {
        return answer.toLowerCase();
    }


    public static void main(String[] args) {
        Solution s = new Solution();

        tester("...!@BaT#*..y.abcdefghijklm", "bat.y.abcdefghi");
        tester("z-+.^.", "z--");
        tester("=.=", "aaa");
        tester("123_.def", "123_.def");
        tester("abcdefghijklmn.p", "abcdefghijklmn");

        // case 5
        tester("b......@", "bbb");  //@는 특수 문자이므로 지워지고 마지막 '.'는 계속 지워져서 결국 'b'하나가 남고 마지막 단계에서 'b'는 'bbb'가 됩니다.

        //case 22 & 23
        tester("........................", "aaa");
    }

    private static void tester(String new_id, String result) {
        Solution s = new Solution();
        String yours = s.solution(new_id);
        if (result.equals(yours)) {
            System.out.println("OK");
        } else {
            System.out.println("NG : " + yours);
        }
    }

}
profile
Sorbet is good...!

0개의 댓글