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

LeeYulhee·2023년 8월 16일
0

💻 문제 출처 : 프로그래머스_신규 아이디 추천

👉 내가 작성한 답


class Solution {
    public String solution(String new_id) {
        
        new_id = new_id.toLowerCase();
        new_id = new_id.replaceAll("[^a-z0-9-_.]", "");
        new_id = new_id.replaceAll("[/.]+", ".");
        
        if(new_id.length() > 0 && new_id.charAt(0) == '.') {
            new_id = new_id.substring(1, new_id.length());
        }
        
        if(new_id.length() > 0 && new_id.charAt(new_id.length() - 1) == '.') {
            new_id = new_id.substring(0, new_id.length() - 1);
        }
        
        if(new_id.length() == 0) {
            new_id = "a";
        }
        
        if(new_id.length() > 15) {
            new_id = new_id.substring(0, 15);
        }
        
        if(new_id.length() > 0 && new_id.charAt(new_id.length() - 1) == '.') {
            new_id = new_id.substring(0, new_id.length() - 1);
        }
        
        if(new_id.length() < 3) {
            String s = String.valueOf(new_id.charAt(new_id.length() - 1));
            new_id += s.repeat(3 - new_id.length());
        }
        
        return new_id;
    }
}

📌 문제 풀이 설명

  • new_id에 new_id를 소문자로 변환한 값을 대입
  • newid에 new_id에서 a-z(알파벳 소문자), 0-9(숫자), “-”, “”, “.”를 제외하고 “”로 대체
  • new_id에 new_id의 “.”이 여러 개면 “.”으로 대체
  • 만약 new_id의 길이가 0 초과이고, new_id의 첫 글자가 “.”이면
    • new_id에 new_id의 1번 인덱스부터 new_id의 길이 미만까지 자른 값을 대입
  • 만약 new_id의 길이가 0 초과이고, new_id의 마지막 글자가 “.”이면
    • new_id에 new_id의 0번 인덱스부터 new_id의 길이 - 1 미만(마지막 인덱스 전)까지 자른 값을 대입
  • 만약 new_id의 길이가 0과 같다면
    • new_id에 “a”를 대입
  • 만약 new_id의 길이가 15 초과이면
    • new_id에 new_id를 0부터 15 미만까지(15글자까지) 자른 값을 대입
  • 만약 new_id의 길이가 0보다 크고, new_id의 마지막 글자가 “.”과 같다면
    • new_id에 new_id의 0번 인덱스부터 new_id의 길이 - 1 미만(마지막 인덱스 전)까지 자른 값을 대입
  • 만약 new_id의 길이가 3 미만이면
    • String s에 charAt으로 new_id의 마지막 글자를 대입
    • new_id에 s를 repeat 메서드로 3 - new_id의 길이를 계산한 만큼 반복해서 더함
      • 길이가 3이 되면 되니까 부족한 수만큼만 반복
  • 위 과정이 전부 끝나면 return new_id



👉 다른 사람이 작성한 답


class Solution {
    public String solution(String new_id) {

        String s = new KAKAOID(new_id)
                .replaceToLowerCase()
                .filter()
                .toSingleDot()
                .noStartEndDot()
                .noBlank()
                .noGreaterThan16()
                .noLessThan2()
                .getResult();


        return s;
    }

    private static class KAKAOID {
        private String s;

        KAKAOID(String s) {
            this.s = s;
        }

        private KAKAOID replaceToLowerCase() {
            s = s.toLowerCase();
            return this;
        }

        private KAKAOID filter() {
            s = s.replaceAll("[^a-z0-9._-]", "");
            return this;
        }

        private KAKAOID toSingleDot() {
            s = s.replaceAll("[.]{2,}", ".");
            return this;
        }

        private KAKAOID noStartEndDot() {
            s = s.replaceAll("^[.]|[.]$", "");
            return this;
        }

        private KAKAOID noBlank() {
            s = s.isEmpty() ? "a" : s;
            return this;
        }

        private KAKAOID noGreaterThan16() {
            if (s.length() >= 16) {
                s = s.substring(0, 15);
            }
            s = s.replaceAll("[.]$", "");
            return this;
        }

        private KAKAOID noLessThan2() {
            StringBuilder sBuilder = new StringBuilder(s);
            while (sBuilder.length() <= 2) {
                sBuilder.append(sBuilder.charAt(sBuilder.length() - 1));
            }
            s = sBuilder.toString();
            return this;
        }

        private String getResult() {
            return s;
        }
    }
}

📌 문제 풀이 설명

  • 빌더 패턴을 사용하여 KAKAOID 객체 생성 후 해당 메서드들을 실행한 값을 대입
  • KAKAOID의 클래스 변수 String s를 선언하고, 생성자를 이용해 해당 변수 초기화
    • replaceToLowerCase()
      • toLowerCase를 사용해 소문자로 치환한 값 return
    • filter()
      • a-z(알파벳 소문자), 0-9(숫자), “-”, “_”, “.”를 제외하고 “”로 대체
    • toSingleDot()
      • s.replaceAll("[.]{2,}", ".")에서 [.]은 마침표를 의미(원래 대괄호에 안 넣으면 정규식에서 다른 의미로 쓰임), {2,}는 직전의 문자나 문자 그룹이 2번 이상 연속으로 등장하는 것을 찾음
      • “.”이 두 개 이상이면 “.”으로 바꾸고 return
    • noStartEndDot()
      • s.replaceAll("^[.]|[.]$", "")
        • ^ : 문자열 시작을 의미
        • ^[.] : 문자열 시작 부분에 있는 마침표를 의미
        • $ : 문자열 끝을 의미
        • [.]$ : 문자열 끝 부분에 있는 마침표를 의미
        • | : 또는
      • 문자열의 시작이나 끝에 “.”이 있으면 “”로 바꾸고 return
    • noBlank()
      • s가 비어있는지 isEmpty로 확인하고 true라면 s에 “a”를 대입, 아니면 s를 대입해서 return
    • noGreaterThan16()
      • 만약 s의 길이가 16 이상이면 0, 15미만까지 substring으로 자른 값을 대입
      • s.replaceAll("[.]$", "")를 이용해 마지막 글자가 “.”이면 “”으로 대체해준 값을 s에 대입하고 return
    • noLessThan2()
      • s 값을 넣어서 StringBuilder 생성
      • while문으로 StringBuilder의 길이가 2 이하면 반복
        • StringBuilder에 s의 마지막 글자를 더함
      • while문이 끝나면 StringBuilder를 String으로 변환해서 s에 대입한 뒤 this를 retrun
    • getResult();
      • 지금까지 this를 return했는데, 해당 방법은 Method Chaining이라는 패턴
        • Method Chaining은 객체의 메서드를 연속적으로 호출하게 해주는 프로그래밍 기술
        • 각 메서드는 현재 객체(this)를 반환하기 때문에 바로 다음 메서드를 호출할 수 있음
      • 지금까지는 return this(KAKAOID 객체 자신)를 한 메서드고, 마지막 메서드에서 s를 return
  • 위 과정이 끝나면 return s
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글