일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- db
- 프로젝트 여러 개
- SQL
- Stream
- MySQL
- javascript error
- Java
- DART
- 봤어요처리
- Mac
- Spring
- JavaScript
- tecoble
- 코어자바스크립트
- oracle
- eqauls-hashcode
- REST
- class-transformer
- flutter mac 설치
- node.js
- @RequestBody
- 인텔리제이
- svn
- ojdbc6
- 프로그래머스
- datagrip 한글깨짐
- maven
- TypeScript
- Aspect
- InteliJ
- Today
- Total
개발자가 되고 싶은 개발자
[Algorithm] 신규 아이디 추천 본문
문제
목표
- 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천
규칙
- 아이디의 길이는 3자 이상 15자 이하여야 합니다.
- 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
- 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.
조건
- 네오가 설계한 7단계의 순차적인 처리 과정을 거쳐야 함
- 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
- 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
- 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
- 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
- 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
- 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
- 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
제한사항
- new_id는 길이 1 이상 1,000 이하인 문자열입니다.
- new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
- new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.
코드
class Solution {
public String solution(String new_id) {
String answer = "";
// 1단계
new_id = new_id.toLowerCase();
// 2단계
for(int i = 0; i < new_id.length(); i++) {
char ch = new_id.charAt(i);
if(ch >= 'a' && ch <= 'z')
answer += String.valueOf(ch);
else if (ch >= '0' && ch <= '9')
answer += String.valueOf(ch);
else if (ch == '-' || ch == '_' || ch == '.')
answer += String.valueOf(ch);
}
String dot = ".";
// 3단계
for(int i = 0; i < answer.length(); i++) {
if(answer.charAt(i) == '.') {
int j = i + 1;
while(j != answer.length() && answer.charAt(j) == '.'){
dot += '.';
j++;
}
if(dot.length() > 1) {
answer = answer.replace(dot, ".");
dot = ".";
}
}
}
// 4단계
if(answer.startsWith(".") )
answer = answer.substring(1, answer.length());
else if(answer.endsWith("."))
answer = answer.substring(0, answer.length()-1);
// 5단계
if(answer.length() == 0)
answer += 'a';
// 6단계
if(answer.length() != 0 && answer.length() > 15)
answer = answer.substring(0, 15);
if(answer.endsWith("."))
answer = answer.substring(0, answer.length()-1);
// 7단계
if(answer.length() <= 2) {
char ch = answer.charAt(answer.length()-1);
int length = answer.length();
if(length == 2)
answer += ch;
else if (length == 1)
answer = answer + ch + ch;
}
return answer;
}
}
풀이
- 각 절차별로 기능을 작성하였다.
- 1단계: toLowerCase( )를 이용하여 소문자로 치환.
- 2단계: new_id를 한 자씩 확인하여 주어진 조건에 맞는 값만 answer변수에 추가한다.
- 3단계: 마찬가지로 한 자씩 확인하여 dot 변수에 연속하는 '.' 값을 저장해주고, 해당값을 '.'으로바꿔준다.
- 4단계: startsWith( )와 endsWith( ) 메소드를 사용하여 값을 잘라주어 answer변수에 대입한다.
- 5단계: 비어있는 문자열이라면 'a'값을 추가
- 6단계: 15자 이상이라면 잘라줌
- 7단계: 2자 이하라면 마지막 문자를 3자까지 추가해준다.
회고
- 여러 케이스를 생각하지 못해서 엄청 디버깅 하면서 풀었다. 실제 테스트였다면 시간을 엄청 허비했을 것이다.
- 물론 비효율적인 방법이라는 것은 알았지만, 문자열 다루는데 익숙하지 않은 것 같아 순차적으로 다뤄보았다. (startsWith( ), endsWith( ) 이 두 메서드는 이번에 풀면서 알았다.)
- 비효율적인 방법이라는 것을 알았어도 이것말고는 못풀었을 것이다. (정규식을 거의 안써봤기 때문에...)
- 해서 아래 정규식을 사용한 풀이를 추가해두고 정규식을 따로 포스팅하려 한다.
정규식을 이용한 풀이(출처: 하단 링크)
public String solution(String new_id) {
String id = new_id.toLowerCase(); // 소문자로
id = id.replaceAll("[^-_.a-z0-9]", ""); //-_. 영문자 숫자만 남김
id = id.replaceAll("[.]{2,}", "."); // .2개 이상 .으로
id = id.replaceAll("^[.]|[.]$", ""); // 처음과 끝 . 제거
if(id.equals("")) // 빈 문자열이라면 a 추가
id += "a";
if(id.length() >= 16){ // 16자 이상이면 15자로
id = id.substring(0, 15);
id = id.replaceAll("^[.]|[.]$", ""); // 끝 . 제거
}
if(id.length() <= 2) // 2자 이하라면 3자까지 마지막 문자추가
while(id.length() < 3)
id += id.charAt(id.length() - 1);
return id;
}
'Dev > Algorithm' 카테고리의 다른 글
[Algorithm] 유형 목록 (0) | 2022.06.11 |
---|---|
[Algorithm] 프로그래머스 레벨2 124나라의 숫자 (0) | 2022.01.06 |
[Algorithm] Euclidean Algorithm (0) | 2021.11.07 |
[Algorithm] Greedy Algorithm (0) | 2021.11.02 |
[Algorithm] 프로그래머스- 로또의 최고 순위와 최저 순위 (0) | 2021.10.05 |