2022. 1. 23. 10:15ㆍ프로그래머스
문제 링크입니다.
https://programmers.co.kr/learn/courses/30/lessons/72410
String 문자열을 1~7단계에 따라 순차적으로 변환하는 문제입니다. 자바로 진행하였습니다.
각 n단계가 끝날 때마나 temp(n) 변수에 정답을 넣었습니다. 즉 1단계가 끝나면 temp1에, 2단계가 끝나면 temp2에 넣는 식으로...
효율적인 방법은 아니지만. temp를 보고 몇 단계를 마친 후인지를 분명하게 알 수 있어 그렇게 했습니다.
1단계 : 영어 대문자 -> 소문자로 치환
String temp = new_id.toLowerCase(); // 1단계
String toLowerCase() : 대문자를 모두 소문자로 치환할 수 있습니다.
String toUpeerCase() : 반대로 대문자로 변환해주는 함수입니다.
2단계 : 알파벳 소문자, 숫자, '-', '_' , '.' 를 제외한 모든 문자 제거
// 2단계
for(int i = 0; i<temp.length();i++){
char ch = temp.charAt(i);
if((ch >= '0' && ch<='9') || (ch >= 'a' && ch<='z') || ch == '-' || ch=='_'|| ch=='.'){
temp2 += ch;
}
}
temp.charAt(i) 로 하나씩 문자 ch를 받아옵니다.
이때 생각해야 될 중요한 부분은 알파벳 소문자든, 숫자이던 간에 모두 문자로 인식한다는 점입니다.
따라서 숫자도 ch로 읽어올 때 '0' ~ '9' 로 인식하게 됩니다. 따라서 ch의 범위를 위와 같이 설정할 수 있습니다.
3단계 : 2개 이상의 마침표를 하나의 마침표로 통일
// 3단계
int idx = 0;
for(int i=0; i<temp2.length();i++){
if(temp2.charAt(i) == '.') {
int j = i+1;
String dot = ".";
while(j != temp2.length() && temp2.charAt(j) == '.') {
dot += ".";
j++;
}
if(dot.length() > 1)
temp2 = temp2.replace(dot, ".");
}
}temp3 = temp2;
String replace(CharSequnce target, CharSequence replacement)
Replace 함수는 자신이 바꾸고싶은 문자로 문자열을 치환시켜주는 기능을 합니다.
temp2의 모든 문자를 돌면서 마침표가 2개 이상인 경우, 마침표가 아닌 부분이 나올 때까지 String dot에 그 부분을 저장합니다.
temp2의 dot 부분을 마침표 하나로 바꿉니다.
4단계 : 마침표(.)가 처음이나 끝부분에 있다면 제거합니다.
// 4단계
if(temp3.startsWith(".")){
temp3 = temp3.substring(1,temp3.length());
}if(temp3.endsWith(".")) {
temp3 = temp3.substring(0, temp3.length()-1);
}
temp4 = temp3;
temp3에 첫 부분과 끝 부분을 검사해 마침표(.)가 있다면, substring함수로 문자열을 다시 만들어줍니다.
substring() 함수가 정의되어 있는 부분을 살펴보면.
String substring(int beginIndex, int endIndex)
Params:
beginIndex – the beginning index, inclusive.
endIndex – the ending index, exclusive.
첫 번째 인자는 포함, 두 번째 인자는 포함하지 않습니다.
그러니 시작하는 인덱스값은 똑같이, 끝부분 인덱스는 의도하는 값 + 1 로 적어주면 되겠습니다.
5단계 : 빈 문자열이라면, "a" 대입
// 5단계
if(temp4.length() == 0)
temp5 = "a";
else temp5 = temp4;
temp4가 비었다면 "a"를 넣어줍니다.
6단계 : 길이가 16자 이상이라면, 앞의 15개만을 남겨두고, 끝에 "."이 있다면 제거합니다.
// 6단계
if(temp5.length() >= 16){
temp5 = temp5.substring(0,15);
}
if(temp5.endsWith("."))
temp5 = temp5.substring(0,temp5.length() - 1);
temp6 = temp5;
4단계의 substring 함수를 사용.
16 이상인 경우 0 ~ 14 까지의 인덱스를 합해 temp5를 갱신하고, 끝에 마침표(.)가 있다면 이 역시 제거해줍니다.
7단계 : 길이가 2 이하라면 길이가 3이 될 때까지 마지막 문자를 뒤에 붙여줍니다.
// 7단계
if(temp6.length() <= 2){
while(temp6.length()<3){
temp6 += temp6.charAt(temp6.length()-1);
}
}temp7 = temp6;
전체 소스코드
public String solution(String new_id) {
String answer = "";
String temp = new_id.toLowerCase(); // 1단계
String temp2="", temp3="", temp4="", temp5="", temp6="", temp7 = "";
// 2단계
for(int i = 0; i<temp.length();i++){
char ch = temp.charAt(i);
if((ch >= '0' && ch<='9') || (ch >= 'a' && ch<='z') || ch == '-' || ch=='_'|| ch=='.'){
temp2 += ch;
}
}
// 3단계
int idx = 0;
for(int i=0; i<temp2.length();i++){
if(temp2.charAt(i) == '.') {
int j = i+1;
String dot = ".";
while(j != temp2.length() && temp2.charAt(j) == '.') {
dot += ".";
j++;
}
if(dot.length() > 1)
temp2 = temp2.replace(dot, ".");
}
}temp3 = temp2;
// 4단계
if(temp3.startsWith(".")){
temp3 = temp3.substring(1,temp3.length());
}if(temp3.endsWith(".")) {
temp3 = temp3.substring(0, temp3.length()-1);
}
temp4 = temp3;
// 5단계
if(temp4.length() == 0)
temp5 = "a";
else temp5 = temp4;
// 6단계
if(temp5.length() >= 16){
temp5 = temp5.substring(0,15);
}
if(temp5.endsWith("."))
temp5 = temp5.substring(0,temp5.length() - 1);
temp6 = temp5;
// 7단계
if(temp6.length() <= 2){
while(temp6.length()<3){
temp6 += temp6.charAt(temp6.length()-1);
}
}temp7 = temp6;
return temp7;
}
'프로그래머스' 카테고리의 다른 글
Programmers [소수 만들기] - 12977 (0) | 2022.01.27 |
---|---|
Programmers [없는 숫자 더하기] - 86051, [음 양 더하기] - 76501 (0) | 2022.01.27 |
Programmers [크레인 인형 뽑기 게임] - 64061 (0) | 2022.01.25 |
프로그래머스 [키패드 누르기] - 67256 (0) | 2022.01.24 |
Programmers [로또의 최고 순위와 최저 순위] - 77484 (0) | 2022.01.22 |