신규 아이디 추천

magicdrill·2025년 1월 24일
0

신규 아이디 추천

String 타입으로 대입을 하거나 += 연산을 수행하니 비효율성이 굉장히 높다.

class Solution {
    public String solution(String new_id) {
        String answer = "";
        
        new_id = step1(new_id);
        System.out.println(new_id);
        new_id = step2(new_id);
        System.out.println(new_id);
        new_id = step3(new_id);
        System.out.println(new_id);
        new_id = step4(new_id);
        System.out.println(new_id);
        new_id = step5(new_id);
        System.out.println(new_id);
        new_id = step6(new_id);
        System.out.println(new_id);
        new_id = step7(new_id);
        System.out.println(new_id);
        answer = new_id;
        
        return answer;
    }
    
    public String step1(String id){
        //대문자를 소문자로 치환
        id = id.toLowerCase();
        
        return id;
    }
    
    public String step2(String id){
        //소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자 제거
        int i;
        String edit = "";
        char current;
        
        for(i = 0; i < id.length(); i++){
            current = id.charAt(i);
            if(Character.isLetter(current))
            {
                edit += current;
            }
            else if(Character.isDigit(current)){
                edit += current;
            }
            else if(current == '-' || current == '_' || current == '.'){
                edit += current;
            }
        }
        
        return edit;
    }
    
    public String step3(String id){
        //마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환
        String edit = "";
        int i;
        
        for(i = 0; i < id.length(); i++){
            if(edit.length() == 0){
                edit += id.charAt(i);
            }
            else if(id.charAt(i) == '.' && edit.charAt(edit.length() - 1) == '.'){
                continue;
            }
            else{
                edit += id.charAt(i);
            }
        }
        
        return edit;
    }
    
    public String step4(String id){
        //마침표가 처음이나 끝에 위치하면 제거
        if (id == null || id.length() == 0 || id.equals(".")) {
            return "";
        }

        // 마침표가 처음이나 끝에 위치하면 제거
        if(id.charAt(0) == '.') {
            id = id.substring(1); // 첫 번째 문자가 마침표일 경우 제거
        }
        if(id.charAt(id.length() - 1) == '.') {
            id = id.substring(0, id.length() - 1); // 마지막 문자가 마침표일 경우 제거
        }
        
        return id;        
    }
    
    public String step5(String id){
        if(id.length() == 0){
            id = "a";
        }
        
        return id;
    }
    
    public String step6(String id){
        //길이가 16자면 첫 15개 문자까지만 반환
        //만약 제거 후 마침표가 위치하면 마침표 제거
        if(id.length() >= 16){
            id = id.substring(0, 15);//index 0~14까지 15개//15는 포함 안됨
            if(id.charAt(14) == '.'){//마지막 문자가 .이라면
                id = id.substring(0, 14);//0부터 13까지 14개 //13은 포함 안됨
            }
        }
        
        return id;
    }
    
    public String step7(String id){
        //길이가 2자 이하면 마지막 문자를 길이가 3이 될때까지 반복
        char last;
        
        if(id.length() <= 2){
            last = id.charAt(id.length() - 1);
            while(id.length() < 3){
                id += last;
            }
        }
        
        return id;
    }
}

StringBuilder 타입으로 전환하니 시간이 크게 줄었다. 근데 다른 사람들 풀이를 보니 객체 메서드로 바꿔서 푸는게 더 멋있어 보인다.
또한 replaceAll()이라는 메서드를 사용하는데 나는 사용해본적이 없다.

class Solution {
    public String solution(String new_id) {
        String answer = "";
        
        new_id = step1(new_id);
        System.out.println(new_id);
        new_id = step2(new_id);
        System.out.println(new_id);
        new_id = step3(new_id);
        System.out.println(new_id);
        new_id = step4(new_id);
        System.out.println(new_id);
        new_id = step5(new_id);
        System.out.println(new_id);
        new_id = step6(new_id);
        System.out.println(new_id);
        new_id = step7(new_id);
        System.out.println(new_id);
        answer = new_id;
        
        return answer;
    }
    
    public String step1(String id){
        // 대문자를 소문자로 치환
        return id.toLowerCase();
    }
    
    public String step2(String id){
        // 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자 제거
        StringBuilder edit = new StringBuilder();
        for (int i = 0; i < id.length(); i++) {
            char current = id.charAt(i);
            if (Character.isLetterOrDigit(current) || current == '-' || current == '_' || current == '.') {
                edit.append(current);
            }
        }
        return edit.toString();
    }
    
    public String step3(String id){
        // 마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환
        StringBuilder edit = new StringBuilder();
        for (int i = 0; i < id.length(); i++) {
            if (edit.length() == 0 || id.charAt(i) != '.') {
                edit.append(id.charAt(i));
            } else if (edit.charAt(edit.length() - 1) != '.') {
                edit.append(id.charAt(i));
            }
        }
        return edit.toString();
    }
    
    public String step4(String id) {
        // 빈 문자열일 경우 처리
        if (id.isEmpty()) {
            return "";
        }

        // 마침표가 처음이나 끝에 위치하면 제거
        if (id.charAt(0) == '.') {
            id = id.substring(1);
        }
        if (id.length() > 0 && id.charAt(id.length() - 1) == '.') {
            id = id.substring(0, id.length() - 1);
        }
    
        return id;
    }

    
    public String step5(String id){
        // 빈 문자열이면 "a"를 추가
        return id.isEmpty() ? "a" : id;
    }
    
    public String step6(String id){
        // 길이가 16자면 첫 15개 문자까지만 반환, 마침표가 있으면 마지막에 제거
        if (id.length() > 15) {
            id = id.substring(0, 15);
            if (id.charAt(14) == '.') {
                id = id.substring(0, 14);
            }
        }
        return id;
    }
    
    public String step7(String id){
        // 길이가 2자 이하면 마지막 문자를 길이가 3이 될때까지 반복
        StringBuilder sb = new StringBuilder(id);
        char last = sb.charAt(sb.length() - 1);
        while (sb.length() < 3) {
            sb.append(last);
        }
        return sb.toString();
    }
}

replaceAll()?

replaceAll() 메서드는 Java에서 문자열을 처리할 때 유용하게 사용되는 메서드로, 정규 표현식(Regex)을 사용하여 문자열 내에서 특정 패턴을 찾아 다른 문자열로 교체하는 기능을 합니다.

사용법

String result = originalString.replaceAll(String regex, String replacement);
  • regex: 교체할 문자열을 찾기 위한 정규 표현식.
  • replacement: 찾은 문자열을 교체할 문자열.

예시

  1. 모든 공백을 제거하기:

    String str = "Hello World!";
    String result = str.replaceAll(" ", "");
    System.out.println(result);  // 출력: HelloWorld!
  2. 숫자만 제거하기:

    String str = "abc123def456";
    String result = str.replaceAll("[0-9]", "");
    System.out.println(result);  // 출력: abcdef
  3. 여러 개의 공백을 하나로 줄이기:

    String str = "Hello    World   !";
    String result = str.replaceAll("\\s+", " ");
    System.out.println(result);  // 출력: Hello World !
    • 여기서 \\s+는 하나 이상의 공백 문자(스페이스, 탭 등)를 찾는 정규 표현식입니다.
  4. 특정 문자열을 다른 문자열로 교체하기:

    String str = "Hello World";
    String result = str.replaceAll("World", "Java");
    System.out.println(result);  // 출력: Hello Java

주의사항

  • 정규 표현식 사용: replaceAll()은 정규 표현식을 사용하므로, 특수 문자가 포함된 문자열을 교체할 때는 이 문자를 이스케이프(escape)해야 할 수 있습니다.
    • 예: . (마침표)는 정규 표현식에서 모든 문자를 의미하므로, 이를 문자 그대로 사용하려면 \\.으로 이스케이프해야 합니다.
String str = "Hello. World.";
String result = str.replaceAll("\\.", "");  // 마침표 제거
System.out.println(result);  // 출력: Hello World

replaceAll()replace()의 차이

  • replaceAll()은 정규 표현식을 사용하여 문자열을 교체합니다.
  • replace()는 정규 표현식을 사용하지 않으며, 단순히 지정된 문자열을 교체합니다.
String str = "apple apple apple";
String result1 = str.replaceAll("apple", "orange");  // 모든 "apple"을 "orange"로 교체
String result2 = str.replace("apple", "orange");     // 동일하게 모든 "apple"을 "orange"로 교체

replace()는 단순 문자열 교체에 사용할 수 있고, replaceAll()은 더 복잡한 패턴을 찾고 교체하는 데 유용합니다.

0개의 댓글