programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
개인적으로 이건 인형뽑기보다는 조금 더 수월했다.
다만, 다른 사람들의 풀이를 보니 이상한 알 수 없는 문자들이 많이 나오더라.
정규표현식이라고 하는데 조만간 이것도 머리속에 집어넣어야겠다.
하지만 그것보다 백준과 프로그래머스를 풀면서 점점 드는 생각은
자바, 자스, 파이썬 같은 것들도 결국 프로그래밍 "언어" 이고 이 언어를 "작문"을 어떻게 할 것이냐가 핵심이다.
라는 것이다.
논리적인 사고 방식으로 지속적인 생각을 하는게 중요할 것 같다고 느꼈다. (물론 아직 갈길이 너무 멀다 ㅠ)
어쨌든 나의 코드를 이렇다
public static String solution(String new_id) {
String answer = "";
String temp = "";
// 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
for (int i = 0; i < new_id.length(); i++) {
if ((65 <= new_id.charAt(i)) && (new_id.charAt(i) <= 90)) {
answer += Character.toLowerCase(new_id.charAt(i));
} else {
answer += new_id.charAt(i);
}
}
System.out.println("1단계 : " + answer);
// 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
for (int i = 0; i < answer.length(); i++) {
switch (answer.charAt(i)) {
case 'a':
temp += 'a';
break;
case 'b':
temp += 'b';
break;
case 'c':
temp += 'c';
break;
case 'd':
temp += 'd';
break;
case 'e':
temp += 'e';
break;
case 'f':
temp += 'f';
break;
case 'g':
temp += 'g';
break;
case 'h':
temp += 'h';
break;
case 'i':
temp += 'i';
break;
case 'j':
temp += 'j';
break;
case 'k':
temp += 'k';
break;
case 'l':
temp += 'l';
break;
case 'm':
temp += 'm';
break;
case 'n':
temp += 'n';
break;
case 'o':
temp += 'o';
break;
case 'p':
temp += 'p';
break;
case 'q':
temp += 'q';
break;
case 'r':
temp += 'r';
break;
case 's':
temp += 's';
break;
case 't':
temp += 't';
break;
case 'u':
temp += 'u';
break;
case 'v':
temp += 'v';
break;
case 'w':
temp += 'w';
break;
case 'x':
temp += 'x';
break;
case 'y':
temp += 'y';
break;
case 'z':
temp += 'z';
break;
case '-':
temp += '-';
break;
case '_':
temp += '_';
break;
case '.':
temp += '.';
break;
case '0':
temp += '0';
break;
case '1':
temp += '1';
break;
case '2':
temp += '2';
break;
case '3':
temp += '3';
break;
case '4':
temp += '4';
break;
case '5':
temp += '5';
break;
case '6':
temp += '6';
break;
case '7':
temp += '7';
break;
case '8':
temp += '8';
break;
case '9':
temp += '9';
break;
default:
break;
}
}
answer = temp;
temp = "";
System.out.println("2단계 : " + answer);
// 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
for (int i = 0; i < answer.length(); i++) {
if (i >= 1 && answer.charAt(i) == '.' && answer.charAt(i-1) == '.') {
continue;
} else {
temp += answer.charAt(i);
}
}
answer = temp;
temp = "";
System.out.println("3단계 : " + answer);
// 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
for (int i = 0; i < answer.length(); i++) {
if (i == 0 && answer.charAt(i) == '.') {
continue;
} else if (i == answer.length()-1 && answer.charAt(answer.length()-1) == '.') {
continue;
} else {
temp += answer.charAt(i);
}
}
answer = temp;
temp = "";
System.out.println("4단계 : " + answer);
// 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
if (answer == null || answer == "") {
answer = "a";
}
System.out.println("5단계 : " + answer);
// 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
if (answer.length() > 15) {
for (int i = 0; i < 15; i++) {
temp += answer.charAt(i);
}
answer = temp;
temp = "";
System.out.println("6단계 : " + answer);
}
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
if (answer.charAt(answer.length()-1) == '.') {
for (int i = 0; i < answer.length()-1; i++) {
temp += answer.charAt(i);
}
answer = temp;
temp = "";
System.out.println("6단계 : " + answer);
}
// 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
if (answer.length() == 2) {
temp += answer.charAt(0);
temp += answer.charAt(1);
temp += answer.charAt(1);
answer = temp;
temp = "";
System.out.println("7단계 : " + answer);
} else if (answer.length() == 1) {
temp += answer.charAt(0);
temp += answer.charAt(0);
temp += answer.charAt(0);
answer = temp;
temp = "";
System.out.println("7단계 : " + answer);
}
return answer;
}
평균 처리 시간이 20.00ms 정도 되는 것 같다. 크레인에 비하면 너무 오래걸리는 ㅠㅠ
0.02초라는 게 맞는 걸까? 안심해도 되는 걸까??
우선은 실행이 가능하다는 점에서 만족을 해야할 것 같다.
추후에 숙달되면 처리속도를 줄이는 방법을 고민해봐야 할 듯
계속 answer에 초기화해주는 것도 문제일지도?? 잘 모르겠다 ㅠ 혹시나 지나가는 고수 있으시면 댓글좀.
그래도 어찌어찌 성공이다!
[깃허브]
https://github.com/RUCKUSJERRY/practiceOfJava/blob/main/Prs_Pratice/src/com/level01/newId.java
RUCKUSJERRY/practiceOfJava
Contribute to RUCKUSJERRY/practiceOfJava development by creating an account on GitHub.
github.com
'문제풀이 > 프로그래머스' 카테고리의 다른 글
체육복 / 프로그래머스 연습문제 / programmers / level1 / Java (0) | 2021.05.02 |
---|---|
K번째수 / 프로그래머스 연습문제 / programmers / level1 / Java (0) | 2021.05.01 |
모의고사 / 프로그래머스 연습문제 / programmers / level1 / java (0) | 2021.04.29 |
완주하지 못한 선수 / 프로그래머스 연습문제 / programmer / level1 / java (0) | 2021.04.28 |
크레인 인형뽑기 게임 / 프로그래머스 연습문제 / programmers / Level 1 / 스택이 뭔지도 모르고 풀어 버린... (0) | 2021.04.27 |