• [프로그래머스/java] 신규 아이디 추천 문제 풀이

    2021. 9. 29.

    by. 하루플스토리

    반응형

    안녕하세요, 하루플 입니다.

     

    프로그래머스로 신규 아이디 추천 문제를 풀어보았는데요, 간단한 문제임에도 조금 헷갈릴 수 있는 부분이 있었습니다.

     

    class Solution {
    public String solution(String new_id) {
    // 1단계. 소문자로 치환
    new_id = new_id.toLowerCase();
    // 2단계. 소문자 숫자 - _ . 제외한 모든 문자 제거
    String id = "";
    for(int i=0; i<new_id.length(); i++){
    char ch = new_id.charAt(i); //한문자식 읽기
    if(ch >= 'a' && ch <= 'z'){
    id += String.valueOf(ch); //String으로 ch 값 넣어준다.
    }
    else if(ch >= '0' && ch <= '9'){
    id += String.valueOf(ch);
    }
    else if(ch == '-' || ch == '_' || ch=='.'){
    id += String.valueOf(ch);
    }
    }
    //3단계. .2번이상 연속된 부분을 . 하나로 치환
    for(int i=0; i<id.length(); i++){
    if(id.charAt(i) == '.'){
    int j = i+1;
    String dot = ".";
    while(j != id.length() && id.charAt(j) == '.'){
    dot += '.';
    j++;
    }
    if(dot.length() > 1){
    id = id.replace(dot, "."); //.으로 치환
    }
    }
    }
    //4단계. .이 처음이나 끝에 있다면 제거
    if(id.startsWith(".")){ //처음에 . 있는가?
    id = id.substring(1, id.length()); //1번째 인덱스부터 끝까지 자르기. 즉, 처음 제거
    }
    else if(id.endsWith(".")){ //마지막에 . 있는가?
    id = id.substring(0, id.length()-1); //처음부터 최종 -1 인덱스까지 자르기. 즉, 마지막 제거
    }
    //5단계. 빈 문자열이라면 "a" 대입
    if(id.length() == 0){
    id += "a";
    }
    //6단계. 길이 16자 이상이면 첫 15개 문자 제외 나머지 제거.
    if(id.length() >= 16){
    id = id.substring(0, 15);
    }
    // 제거 후 .이 끝에 있다면 . 제거
    if(id.endsWith(".")){
    id = id.substring(0, id.length() -1);
    }
    //7단계. id가 2자 이하면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임.
    String last = id.charAt(id.length()-1) +"";
    if(id.length() == 2){
    id = id + last;
    }
    else if(id.length() == 1){
    id = id + last + last;
    }
    return id;
    }
    }
    view raw Solution.java hosted with ❤ by GitHub

    먼저 1단계 소문자 치환입니다.

    저는 사실 A = 65, a = 97 아스키코드를 활용해서 for문과 if문을 사용해 소문자로 치환하려 했는데요,

    toLowerCase() 라는 아주 간단한 방법이 있었습니다..ㅎㅎ

     

    2단계는 소문자, 숫자, -, _, . 제외한 모든 문자를 제거하는 코드를 작성합니다.

    String 형을 한 문자식 읽기 위해 charAt을 사용하였고 for문으로 한 문자식 인덱스 읽는게 가장 간편했습니다.

     

    3단계는 ... 이렇게 점이 여러개인 경우 . 점 하나로 치환해주는 겁니다.

    전체 점의 개수를 세고 점 값을 dot에 저장합니다. 이후, replace를 통해 "." 점 하나로 치환해주었습니다.

     

    4단계는 . 점이 처음이나 끝에 있을 때 제거해야합니다.

    startsWith와 endsWith를 사용해 문자 처음과 마지막을 읽고, subString으로 원하는 만큼 문자를 잘라줍니다.

    점이 처음 있는 경우 자를때는 맨 첫 글자인 0번째 인덱스를 자르면 되니 (1, id.length()); 하면되고

    점이 마지막에 있는 경우 자를 때는 (0, id.length()-1) 을 해주어 마지막 글자를 잘라줍니다.

     

    5단계는 빈 문자열이면 "a"를 대입합니다.

    저는 처음에 NULL을 하면 될까 하였는데, length() == 0 이 훨씬 간단하겠군요.

     

    다음 6단계 입니다.

    길이 16자 이상이면 첫 15문자 제외 나머지 글자를 제거합니다.

    제거 후 .이 끝에 있다면 다시 .점을 제거합니다.

    이 문제 중 5, 6단계가 가장 쉬운 것 같습니다.

     

    마지막 7단계 입니다.

    id가 2자 이하면 마지막 문자를 길이가 3이 될 때까지 복사하여 늘려줍니다.

    last에 마지막 문자 값을 저장해두고

    length 값에 따라 last를 이어주면 끝입니다!

     

     

    아래는 참고한 블로그 입니다.

    https://minhamina.tistory.com/121

     

     

     

    반응형

    댓글