https://school.programmers.co.kr/learn/courses/30/lessons/72410
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
모두들 맛있는 떡국들 드시고들 오셨나요
전 이번 설날에 너무 많이 먹고 온건지 속이 더부룩...
설날 이후 처음으로 푸는 코테 문제입니다..!
카카오 블라인드 문젠데 전 이런 문제가 재밌더라고요
아무튼 문제를 요약하자면
사이트에서 회원가입할 때 아이디를 생성할 때 규칙이 있는데
사용자가 이 규칙에 맞지 않는 아이디를 입력하면
규칙에 맞는 아이디를 추천해주는 문제
테스트케이스 1)
"...!@BaT#*..y.abcdefghijklm" 을 입력받는다면
이런 과정을 통해 "bat.y.abcdefghi"라는 아이디를 추천받게 된다.
// 프로그래머스 신규 아이디 추천
// 아이디가 조건에 부합하지 않다면 비슷한 아이디 추천
// id는 3 ~ 15자
// 소문자, -, _, .(처음 끝 사용 불가능, 연속 사용 불가능)만 사용 가능
import java.util.*;
class Solution {
// 전역변수 StringBuilder를 이용해 문자열 변경
static StringBuilder sb;
public String solution(String new_id) {
// 1. id의 대문자를 모두 소문자로 치환
sb = new StringBuilder(new_id.toLowerCase());
f2();
f3();
f4();
f5();
// 6. 16자 이상이라면 첫 15자 이후 문자열 자르기. 제거 후 .가 끝이라면 제거
if (sb.length() > 15) {
sb.setLength(15);
f4();
}
// 7. 2자 이하라면 마지막 문자를 길이가 3이 될때까지 반복
if (sb.length() < 3) {
while (sb.length() < 3) {
sb.append(sb.charAt(sb.length() - 1));
}
}
return sb.toString();
}
// 2. 소문자, 숫자, -, _, .을 제회한 모든 문자 제거
public void f2() {
char[] f2_arr = sb.toString().toCharArray();
sb.setLength(0);
for (char c : f2_arr) {
if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == '-' || c == '.') {
sb.append(c);
}
}
}
// 3. '.'이 2번 이상 연속된 부분 . 하나로 치환
public void f3() {
for (int i = 1; i < sb.length(); i++) {
if (sb.charAt(i) == '.' && sb.charAt(i - 1) == '.') {
sb.deleteCharAt(i);
i--;
}
}
}
// 4. '.'가 처음이나 끝에 위치하면 제거
public void f4() {
// 처음
if (sb.charAt(0) == '.') {
sb.deleteCharAt(0);
}
// 끝
if (sb.length() != 0 && sb.charAt(sb.length() - 1) == '.') {
sb.deleteCharAt(sb.length() - 1);
}
}
// 5. 빈 문자열이라면 'a' 대입
public void f5() {
if (sb.length() == 0) {
sb.append("a");
}
}
}
문자열의 추가 제거를 편리하게 사용하기 위해 StringBuilder 클래스를 이용했다.
각 단계별로 메소드를 나눠서 했지만 안 나눴어도 될 것 같다.
필자는 코드의 가독성을 위해 나눔.(읽기 쉬운 코드가 최고)
1. toLowerCase() 함수를 이용해 대문자를 소문자로 변환
2. toString(), toCharArray() 함수를 이용해 StringBuilder를 문자열로 변환하고 char 배열로 전환해 조건에 부합하는지 비교했다.
3. StringBuilder의 deleteCharAt을 이용해 연속된 .이 있다면 해당 문자의 인덱스를 입력해 제거
4. 문자열의 처음, 마지막 인덱스의 . 제거(길이가 0이라면 마지막 .를 찾는 과정에서 에러 발생. 길이가 0이 아닐 때의 조건 추가)
5. 빈 문자열이라면 'a' 대입
6. StringBuilder의 setLength() 함수를 이용해 16자 이상의 문자열이라면 길이 조정
7. while문을 통해 길이가 2 이하라면 길이가 3이 될 때까지 마지막 문자 추가
이 과정을 통해 최종적으로 정상적인 아이디를 추천받게 된다
'프로그래머스' 카테고리의 다른 글
[프로그래머스] 타겟 넘버 (JAVA) (0) | 2025.02.17 |
---|---|
[프로그래머스] 가장 큰 수 (JAVA) (3) | 2025.02.08 |
[프로그래머스] 영어 끝말잇기 (JAVA) (1) | 2025.01.25 |
[프로그래머스] 구명보트 (JAVA) (3) | 2025.01.25 |
[프로그래머스] 이진 변환 반복하기 (JAVA) (3) | 2025.01.25 |