일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 티움투어
- 10813 자바
- 그리디
- 백준 10866 자바
- 백준 1764 자바
- 2164 자바
- 파이썬
- 자바
- IAM 사용자
- 코딩테스트
- 2798 자바
- 10807 자바
- 백준 2346 자바
- 2748 자바
- 데보션영 3기
- 1764 자바
- 자바 2346
- 2346 풍선 터뜨리기
- 자바 10866
- 백준
- 28278 스택 2
- 백준 28278 자바
- 자바 1003
- dfs
- IAM Identity Center
- 자바 2164
- 자바 28278
- 10810 자바
- BFS
- 1010 자바
- Today
- Total
자두의 데브로그
[자바] 프로그래머스 신규 아이디 추천 본문
https://school.programmers.co.kr/learn/courses/30/lessons/72410
7단계를 거쳐서 문자열을 바꾸면 되는 문제였는데 ... 처음 볼 때는 음 뭐 쉽네 ^^ 하고 시작했지만 결국 구글링 엔딩이 되어버렸다.
일단 내가 이 문제를 풀 때 몰랐던 사실
1. 정규표현식 ... 어떻게 표현하는지 모르겠음..
2. char이나 String을 각각 사용했을 때 어떤 함수나 기호를 사용할 수 있고, 또 없는지 모름
3. 라이브러리에 내장된 함수? 시의적절하게 쓸 줄 모름...
총체적 난국이라 이 문제를 내 힘으로 온전히 풀진 못했다. 그치만 2단계를 제외하고 3-7단계는 내 힘으로 풀어보려고 했다.
2~7단계에서 내가 마주했던 오류들은 아래와 같다.
1. String.charAt()을 사용하면 char가 되지만 String으로 쪼개지는 줄 알고 냅다 equals 함수 사용했다.
2. String이 >=, <= 등의 산술기호로 비교 가능한 줄 알았다.
3. char 배열로 받아서 하나씩 확인하는데 equals 함수 사용 가능한 줄 알았다.
4. "" 는 String이고, ''가 char인데 비교할 때 문자 선언은 char로 해두고 "."랑 비교했다.
5. String에 remove() 메서드가 없었나요...? 하하; replace() 함수를 사용해서 해당 위치에 대해서 빈칸을 만들어야 되는 걸 몰랐다.
6. replace로 도출된 결과 값은 다시 문자열에 저장해둬야한다.
가장 헷갈렸던 건 2, 3, 6단계 였는데 2단계는 위에서 언급한 것처럼 String이랑 char를 혼동해서 사용해서 오류가 많이 발생했고, 3단계의 경우에는 .이 "2번 이상 연속되면" 이었는데 2번만 연속된 걸 앞에서부터 한 번만 발견해서 .으로 치환하도록 수정해서 오류가 발생했었다. while문으로 .. 이 없을 때까지 돌게 하여 문제를 해결할 수 있었다. 6단계는 16자 이상인 경우에 대해서 첫 15개의 문자로 자르는 것까지는 했는데 .이 있는 경우에 대해서는 처리를 하지 않아서 틀렸었지만 이는 조건을 잘못봐서 생긴 문제로 바로 수정할 수 있었다.
다 해결하고 푼 문제는 아래와 같다.
import java.util.*;
class Solution {
public String solution(String new_id) {
String answer = "";
String step1 = "";
String step2 = "";
// 1단계
step1 = new_id.toLowerCase();
// 2단계
char[] step1_arr = step1.toCharArray();
for(char c : step1_arr){
if((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.'){
step2 += String.valueOf(c);
}
}
// 3단계
while (step2.contains("..")) {
step2 = step2.replace("..", ".");
}
String step4 = step2;
// 4단계
if(step4.length() > 0 && step4.charAt(0) == '.'){
step4 = step4.substring(1, step4.length());
}
if(step4.length() > 0 && step4.charAt(step4.length()-1) == '.'){
step4 = step4.substring(0, step4.length()-1);
}
// 5단계
if(step4.length() == 0){
step4 = "a";
}
// 6단계
if(step4.length() >= 16){
step4 = step4.substring(0, 15);
}
if(step4.charAt(step4.length() - 1) == '.'){
step4 = step4.substring(0, step4.length() - 1);
}
// 7단계
if(step4.length() <= 2){
String tmp = String.valueOf(step4.charAt(step4.length()-1));
while(step4.length() != 3){
step4 += tmp;
}
}
answer = step4;
return answer;
}
}
정규 표현식으로 매우매우*100 간단하게 풀 수 있는 방법이 있지만 내가 아는 방법과 메서드를 유연하게 사용하면서 풀 수 있는 방법이 내가 푼 방법 같아서 이 방법을 공유한다.
'코딩테스트 > Java' 카테고리의 다른 글
[자바] 프로그래머스 자연수 뒤집어 배열로 만들기 add() vs. append() (0) | 2024.09.27 |
---|---|
[자바] 프로그래머스 x만큼 간격이 있는 n개의 숫자 int vs. long (0) | 2024.09.27 |
[자바] 백준 3460번 이진수 (0) | 2024.09.23 |
[자바] 백준 1037번 약수 (7) | 2024.09.22 |
[자바] 프로그래머스 외계행성의 나이 (0) | 2024.08.30 |