-
반응형
안녕하세요, 하루플 입니다.
프로그래머스로 신규 아이디 추천 문제를 풀어보았는데요, 간단한 문제임에도 조금 헷갈릴 수 있는 부분이 있었습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersclass 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; } } 먼저 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
반응형'개발 > 코딩테스트' 카테고리의 다른 글
[백준/JAVA] 4344번 평균은 넘겠지 문제 풀이 (0) 2021.10.01 [JAVA/백준] 10871번 X보다 작은 수 문제 풀이 (0) 2021.10.01 [백준/10869번] 사칙연산 (0) 2021.08.26 [JAVA/백준] 1002번 문제 해설 및 답안 (0) 2021.07.28 [JAVA/백준] 1000번 문제 해설 및 답안 (0) 2021.07.27 댓글