Source Code : https://github.com/JangAJang/Algorithm/blob/main/프로그래머스_Lv1/신규%20아이디%20추천/src/Solution.java
다른 코딩공부나 시험기간이 겹쳐 알고리즘을 열심히 보진 못했지만, 그래도 푸는데 3일이나 걸렸다(말도안되는 이유때문에)
일단 7개의 과정을 거쳐야 한다.
1. 대문자는 전부 소문자로 바꾸어준다.
2. 소문자, 숫자, - , _ , . 를 제외하곤 전부 지워준다.
3. 점이 여러개 있을 경우 점 하나로 바꾸어준다.
4. 처음과 마지막이 점일 경우, 지워준다.
5. 문자열이 비어있을 경우, "a"를 넣어준다.
6. 문자열의 길이가 15를 넘으면 15까지 잘라주고, 마지막이 점이면 점도 지워준다.
7. 길이가 3 이하라면 3까지 늘려준다.
이를 시퀀스별로 나누어 코딩을 했는데, 논리상으로는 이상이 없다고 판단했다.
하지만 계속해서 15, 20, 21번이 에러가 발생했다. 왜 그런가 이유를 생각해보았는데, 정말 답을 모르겠던 상태였다.
(그래도 다른 사람의 코드는 보지 않았다. 마지막 자존심이었달까...)
프로그래머스는 문제를 풀 때 마다 모은 점수로 다른 사람의 코드를 볼 수 있는데, 점수를 쌓는 기분이 들어
쓰기 아깝다는 생각이 들었다.
결국, 모든 아스키 코드표와 다른 것들을 비교하다가, 진짜 말도 안되는 실수를 했다.
(c - 'a' >=0 && c - 'a' <=26 )
여기서 a부터 z는 26개이고, 이를 주소화 시키면 <= 25로 써야하는데, 이거 하나가 문제였다. 진짜 이거 하나 바꾸니까 되더라...
일단 시퀀스 별로 설명을 하자면
1.
id.toLowerCase();
이거말고 할게 없었다.
2.
private String doSequence2(String id){
String result = "";
for(int i=0; i<id.length(); i++){
result = checkWord(result, id.charAt(i));
}
return result;
}
private String checkWord(String result, char c){
if(c - 'a' >=0 && c - 'a' <=25 ) return result.concat(Character.toString(c));
if(c - '0' >=0 && c - '0' <= 9) return result.concat(Character.toString(c));
if(c == '-' || c == '_' || c == '.') return result.concat(Character.toString(c));
return result;
}
문자열을 입력받아, 이를 자리마다 확인하며 뺄건 빼고, 필요한 문자만 추가시키는 방식으로 진행했다.
3.
private String doSequence3(String id){
String result = "";
for(int i=0; i<id.length(); i++){
result = putCharacterIfNotPoints(result, id.charAt(i));
}
return result;
}
private String putCharacterIfNotPoints(String result, char next){
if(result.isEmpty()) return result.concat(Character.toString(next));
if(result.charAt(result.length()-1) == '.' && next == '.') return result;
return result.concat(Character.toString(next));
}
점을 하나 찍고, 그 다음에 넣어야 할 문자도 점이면 넣지않고 리턴하는 식으로 문자열을 수정했다.
4.
private String doSequence4(String seq3){
if(seq3.length() == 0) return seq3;
if(seq3.charAt(0) == '.') return doSequence4(deleteFirstPoint(seq3));
if(seq3.charAt(seq3.length()-1) == '.') return doSequence4(deleteLastPoint(seq3));
return seq3;
}
private String deleteFirstPoint(String seq3){
return seq3.substring(1);
}
private String deleteLastPoint(String seq3){
return seq3.substring(0, seq3.length()-1);
}
길이가 0이면 charAt가 되지 않아서 바로 리턴해주는 식으로 진행했다.
5.
private String doSequence5(String seq4){
if(seq4.length() == 0) return "a";
return seq4;
}
길이를 보고 0이면 "a"를 리턴했다.
6.
private String doSequence6(String seq5){
if(seq5.length() > 15) seq5 = seq5.substring(0, 15);
if(seq5.charAt(seq5.length()-1) == '.') return doSequence6(deleteLastPoint(seq5));
return seq5;
}
어순을 보고 판단부터했다. 말 그대로 length가 15를 넘으면 15까지 잘라주고, 그 다음에 점을 지웠다.
7.
private String doSequence7(String seq6){
if(seq6.length() < 3) return duplicateLastLetter(seq6);
return seq6;
}
private String duplicateLastLetter(String seq6){
while(seq6.length() < 3){
seq6 = seq6.concat(Character.toString(seq6.charAt(seq6.length()-1)));
}
return seq6;
}
길이가 3보다 작으면 3까지 마지막 문자를 반복시켰다.
써놓고 보니, 필요한 게 무엇인지 느껴졌다.
람다, 스트림, 그리고 final int를 이용해 상수 명명하는 것도 조금씩 지켜야 겠다는 생각이 든다.
이 문제를 나중에 누군가 깃허브에서 볼 때, 그 코드의 상수가 왜 이런지를 모른다면, 이해하기 어려울 수 있다는 생각이 든다.
'개발공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] PCCP 2번. 석유시추 (2) | 2024.03.06 |
---|---|
[프로그래머스] lv.2 전력망을 둘로 나누기 (0) | 2023.02.10 |
[프로그래머스] 코딩테스트 Lv.1 완주하지 못한 선수 (0) | 2022.10.28 |
[프로그래머스] 코딩테스트 Lv.1 키패드 누르기 (0) | 2022.10.25 |
[프로그래머스] 코딩테스트 Lv.1 완주하지 못한 선수 (0) | 2022.10.21 |