https://school.programmers.co.kr/learn/courses/30/lessons/72410
문제 접근
다른 문제들도 같은 방식으로 풀긴했지만 이 문제는 자체에서 단계별로 해결사항을 제시해줘서 푸는 맛이 있었다.
아이디 검사 7단계
1. 모든 대문자를 소문자로 → toLowerCase() 사용
2. 알파벳 소문자, 숫자, -, _, .을 제외한 다른 문자 전부 제거 → 문제에서 제시한 있을 수 있는 특수문자 배열을 따로 만들어서 반복문으로 해당 특수문자들 제거
3. .(마침표)가 2번 이상 연속되면 .을 1개로 치환 → replace()로 ..을 while문 내에서 ..이 없을 때 까지 .으로 변경
4 .(마침표)가 처음이나 끝에 있다면 제거 → replaceFirst()로 맨 앞 . 제거, subString()으로 0번 인덱스 부터 마지막 문자 앞 자리 까지 잘라서 맨 뒤 . 제거
5. 아이디가 빈 문자열이면 a 대입 → 빈 문자열이면 new_id에 a추가
6. 아이디 길이가 16자 이상이면 첫 15개 문자를 제외한 나머지 문자들을 모두 제거
→ 15개 문자로 남겼을 때 마지막이 .이라면 .도 제거
→ SubString으로 초과한 크기 잘라줌
7. 아이디 길이가 2자 이하라면 마지막 문자를 길이가 3될 때 까지 반복해서 붙임 → 마지막 문자를 String으로 문자열 치환해줘서 크기가 3이상 될 때 까지 더해줌
charAt()과 subString 쓸 때 charAt()은 0번 인덱스부터 시작, subString은 0번 인덱스부터 적은 갯수 까지 자르는 형태에다
length()는 문자가 1개면 길이가 1부터 시작이라 사용할 때 혼동온게 풀 때 제일 힘들었다.
class Solution {
public String solution(String new_id) {
String[] specialChar = {"~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "=",
"+", "[", "{", "]", "}", ":", "?", ",", "<", ">", "/"};
System.out.println("검사 전 : " +new_id);
// 1
new_id = new_id.toLowerCase();
System.out.println("1단계 검사 후 : "+ new_id);
// 2
for(int i=0; i<specialChar.length; i++) new_id = new_id.replace(specialChar[i], "");
System.out.println("2단계 검사 후 : " + new_id);
// 3 여기서 .을 1개로 줄여줘서 4단계에서 .을 여러 번 줄이는 일 없게
while(new_id.contains("..")) new_id = new_id.replace("..", ".");
System.out.println("3단계 검사 후 : "+ new_id);
// 4
// 첫, 끝 문자를 문자열로 치환?
while(new_id.length() != 0 && (new_id.charAt(0) == '.' || new_id.charAt(new_id.length()-1) == '.')) { // 문자열이 공백이면 charAt(0)이 없기에 오류떠서 길이 조건 넣어줌
if(new_id.charAt(0) == '.') new_id = new_id.replaceFirst(".", ""); // 맨 앞 . 짜르기
if(new_id.length() != 0 && new_id.charAt(new_id.length()-1) == '.') new_id = new_id.substring(0, new_id.length()-1); // 맨 뒤 . 짜르기
}
System.out.println("4단계 검사 후 : "+ new_id);
// 5
if(new_id.equals("")) new_id += "a";
System.out.println("5단계 검사 후 : "+ new_id);
// 6 크기 초과한 문자열을 잘라버리고 뒤에 .이 있다면 4단계에서 했던 검사 한 번 더
if(new_id.length() > 15) new_id = new_id.substring(0, 15);
if(new_id.charAt(new_id.length()-1) == '.') new_id = new_id.substring(0, new_id.length()-1);
System.out.println("6단계 검사 후 : "+ new_id);
// 7
while(new_id.length() < 3) {
String str = String.valueOf(new_id.charAt(new_id.length()-1));
new_id += str;
}
System.out.println("7단계 검사 후 : " + new_id);
return new_id;
}
}
다른 사람 풀이
풀이 방향은 전체적으로 비슷하며 replaceAll()을 사용하여 문자 바꾸는 걸 굉장히 손 쉽게 해결하였다.
replaceAll()은 replace와는 다르게 정규식을 사용한다고 한다.
[ 다른 분이 정리해놓은 replaceAll() 정규식 사용법 ]
class Solution {
public String solution(String new_id) {
String answer = "";
String temp = new_id.toLowerCase();
temp = temp.replaceAll("[^-_.a-z0-9]",""); // -_. a~z 0~9를 제외한 모든 문자를 ""으로
System.out.println(temp);
temp = temp.replaceAll("[.]{2,}","."); // .이 2개면 .으로??
temp = temp.replaceAll("^[.]|[.]$","");
System.out.println(temp.length());
if(temp.equals(""))
temp+="a";
if(temp.length() >=16){
temp = temp.substring(0,15);
temp=temp.replaceAll("^[.]|[.]$","");
}
if(temp.length()<=2)
while(temp.length()<3)
temp+=temp.charAt(temp.length()-1);
answer=temp;
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / 모의고사 / JAVA / 완전탐색] (1) | 2023.03.10 |
---|---|
[프로그래머스 / 키패드 누르기 / JAVA] (0) | 2023.03.08 |
[프로그래머스 / 바탕화면 정리 / JAVA] (0) | 2023.03.06 |
[프로그래머스 / 두 개 뽑아서 더하기 / JAVA] (0) | 2023.03.04 |
[프로그래머스 / 대충 만든 자판 / JAVA] (0) | 2023.03.01 |
댓글