📌 문제
프로그래머스 | 신규아이디 추천 | 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)
코테를 보다보면, 문자열 문제가 빈번하게 출제되는데 쉬운것 같으면서도 메소드에 대한 지식에 없으면 풀기가 난처하다 ㅠㅠ
쉬운 부분도 결코 놓치지 않고.. 꼭 맞아서 합격까지 !!! 🚀🚀🚀🚀⭐⭐⭐⭐⭐
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][JAVA] 전력망을 둘로 나누기 - DFS/BFS/완전탐색 (0) | 2024.11.21 |
---|---|
[프로그래머스][JAVA] 소수 찾기 - dfs (0) | 2024.11.20 |
[프로그래머스] 피로도-level2-dfs (1) | 2024.11.19 |