알고리즘/프로그래머스

[프로그래머스][JAVA] 신규아이디 추천 - 문자열

이-프 2024. 11. 29. 14:58

📌 문제

프로그래머스 | 신규아이디 추천 | level1 | 문자열

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

📌 문제 탐색하기

  • 규칙에 맞지 않는 아이디 입력시, 규칙에 맞는 아이디를 추천
    • 3~15 자 아이디
    • 소문자, 숫자, - , _, . 만 사용 가능
      • .는 처음과 끝에 사용 x
      • 연속 x (.. x)

 

📌 코드 설계하기

  • 단계별로 수행하기! 
  • Key Point는 최대한 깔끔하게 코드 설계해서 문자열 정리하는 것

 

📌 시도 회차 진행 방향

1회차

  • 3단계, 4단계, 6단계에서 틀림
    • 3단계 | ..이 2개 이상 나타날 때니까, 2개만 나타나도 해당 (.indexOf())
    • 4단계 | 맨 앞에 . 이나, 맨 뒤의 .이나 둘 다 똑같이 if문으로 진행해야함(if else로 진행 xxx)
    • 6단계 | str.substring(a,b) = a이상, b미만

 

2회차 (정답)

import java.util.*;
import java.io.*;

class Solution {
    public String solution(String new_id) {
        String answer = "";
        
        //1단계 : new_id의 모든 대문자를 대응되는 소문자로 치환
        new_id = new_id.toLowerCase();
        
        //2단계 : new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
        for (int i = 0; i < new_id.length(); i++) {
            char ch = new_id.charAt(i);
            if (Character.isAlphabetic(ch) || 
                Character.isDigit(ch) || 
                ch == '-' || ch == '_' || ch == '.')
                answer += ch;
        }
        
        //3단계 : new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
        while (answer.indexOf("..") != -1)
            answer = answer.replace("..", ".");
        
        //4단계 : new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
        if(!answer.isEmpty() && answer.charAt(0) == '.'){
            answer = answer.substring(1);
        } 
        if (!answer.isEmpty() && answer.charAt(answer.length()-1) == '.'){
            answer = answer.substring(0, answer.length()-1);
        }
        
        
        
        //5단계 : new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
        if(answer.isEmpty()){
            answer += "a";
        }
        
        //6단계 : new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
                 //만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.

        if(answer.length() > 15){
            answer = answer.substring(0, 15);
            if(answer.charAt(answer.length()-1) == '.'){
                answer = answer.substring(0, answer.length()-1);
            }
        }
        
        
        //7단계 : new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.         
        while(answer.length() < 3){
            char last = answer.charAt(answer.length()-1);
            answer += String.valueOf(last);
        }

        return answer;
    }
}

 

 

📌 문자열 문제에서 암기하면 좋을 메소드 정리

(1) 소문자 <-> 대문자
String tmp = "apPLe";
tmp.toUpperCase //APPLE
tmp.toLowerCase //apple


(2) .indexOf() 
특정 '문자'나, '문자열'이 앞에서부터 처음 발견되는 인덱스를 반환
만약, 찾지 못한다면 '-1' 반환
String tmp = "apPLe";
tmp.indexOf("a") //0
tmp.indexOf("pP") //1
tmp.indexOf("A") //-1


(3) .substring(int startIdx) .substring(int startIdx, int endIdx)
startIdx 이상 또는 startIdx 이상 endIdx 미만으로 특정 부분을 잘라냄
String tmp = "apPLe";
tmp.substring(2) // PLe
tmp.substring(1,3) //pP

(4) .isEmpty()
문자열이 빈 문자열일 경우에 true를 반환하는 함수
tmp = "";
tmp.isEmpty() //true
tmp2 = "apple"
tmp.isEmpty() //false


(5) .replace(CharSequence target, CharSequence replacement)
target부분을 replacement로 대치
String tmp = "apppple"
tmp.replace("pppp", "PP") //aPPle
-> 만약에 tmp.replace("pp", "PP") 로 하면, aPPpple가 된다 (replace는 첫 번째 매칭만!)
-> 그러므로, 만약 pppp를 다 바꾸고 싶으면 tmp.replaceAll("pp", "PP"); replaceAll로 해야함 (aPPPPPPPPle)

 

코테를 보다보면, 문자열 문제가 빈번하게 출제되는데 쉬운것 같으면서도 메소드에 대한 지식에 없으면 풀기가 난처하다 ㅠㅠ 
쉬운 부분도 결코 놓치지 않고.. 꼭 맞아서 합격까지 !!! 🚀🚀🚀🚀⭐⭐⭐⭐⭐