[TIL] 23.02.06 알고리즘 신규아이디 추천

hyewon jeong·2023년 2월 6일
0

TIL

목록 보기
84/138

1. 프로그래머스 문제

https://school.programmers.co.kr/learn/courses/30/lessons/72410

2. 시도

2-1 시도

class Solution {
public String solution(String new_id) {
      String answer = "";
      answer = new_id.toLowerCase();
      answer = answer.replaceAll("[^a-z0-9_.-]", "");
      answer = answer.replaceAll("[.]+", ".");
      answer = answer.replaceAll("^[.]|[.]$", "");
      if (answer.equals("")) {
        answer = answer.replaceAll(" ", "a");
      }

      if (answer.length() >= 16) {
        answer = answer.substring(0, 15);
        answer = answer.replaceAll("[.]$", "");
      }

      if (answer.length() <= 2) {
        for (int i = 0; i < 3; i++) {
          char lastChar = answer.charAt(answer.length() - 1);
          answer = answer + lastChar;
        }
      }

      return answer;
    }
    
}

에러발생

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
  if (answer.length() <= 2) {
        for (int i = 0; i < 3; i++) {
          char lastChar = answer.charAt(answer.length() - 1);
          answer = answer + lastChar;
        }
      }

이 부분에 모순을 찾게 되어 다시 시도했다.

    if (answer.length() <= 2) {
        while(answer.length()!=3) {
          char lastChar = answer.charAt(answer.length() - 1);
          answer = answer + lastChar;
        }
      }

여전히 같은 에러

      if (answer.equals("")) {
        answer += "a";
      }

에러 해결

3 정답 코드

 public String solution(String new_id) {
      String answer = "";
      answer = new_id.toLowerCase();
      answer = answer.replaceAll("[^-_.a-z0-9]", "");
      answer = answer.replaceAll("[.]{2,}", ".");//[.]+
      answer = answer.replaceAll("^[.]|[.]$", "");
      if (answer.equals("")) {
        answer += "a";
      }

      if (answer.length() >= 16) {
        answer = answer.substring(0, 15);
        answer = answer.replaceAll("[.]$", "");
      }

      if (answer.length() <= 2) {
        while(answer.length()!=3) {
          char lastChar = answer.charAt(answer.length() - 1);
          answer = answer + lastChar;
        }
      }
      System.out.println(answer);
      return answer;
    }

정규식으로 하드코드를 하지 않았지만 실행속도가 17이상되는부분이 많다.
속도 면에서.. 하드코어를 하는게 맞나 싶다..

4. 다른 사람의 답안

class Solution {
    public String solution(String new_id) {
        String answer;
        
        // 1단계
        String step1 = new_id.toLowerCase();

        // 2단계
        char[] step1_arr = step1.toCharArray();
        StringBuilder step2 = new StringBuilder();
        for (char c : step1_arr) {
            if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.') {
                step2.append(c);
            }
        }

        // 3단계
        String step3 = step2.toString().replace("..", ".");
        while (step3.contains("..")) {
            step3 = step3.replace("..", ".");
        }

        // 4단계
        String step4 = step3;
        if (step4.length() > 0) {
            if (step4.charAt(0) == '.') {
                step4 = step4.substring(1, step4.length());
            }
        }
        if (step4.length() > 0) {
            if (step4.charAt(step4.length() - 1) == '.') {
                step4 = step4.substring(0, step4.length() - 1);
            }
        }

        // 5단계
        String step5 = step4;
        if (step5.equals("")) {
            step5 = "a";
        }

        // 6단계
        String step6 = step5;
        if (step6.length() >= 16) {
            step6 = step6.substring(0, 15);

            if (step6.charAt(step6.length() - 1) == '.') {
                step6 = step6.substring(0, step6.length() - 1);
            }
        }

        // 7단계
        StringBuilder step7 = new StringBuilder(step6);
        if (step7.length() <= 2) {
            char last = step7.charAt(step7.length() - 1);

            while (step7.length() < 3) {
                step7.append(last);
            }
        }

        answer = String.valueOf(step7);
        return answer;
    }
}


엄청빠르다... 나랑은 극과극

참고

https://hamait.tistory.com/342

profile
개발자꿈나무

0개의 댓글