본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 72410번: 신규 아이디 [Java]

문제: https://school.programmers.co.kr/learn/courses/30/lessons/72410

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 코드

class Solution {
    public String solution(String new_id) {
        String answer = new_id.toLowerCase().replaceAll("[^a-z|0-9|\\-|_|.]", "").replaceAll("[.]+", ".").replaceAll("^[.]|[.]$", "");
		if(answer.isBlank())
			answer = "a";
		if(answer.length() >= 16)
			answer = answer.substring(0, 15).replaceAll("^[.]|[.]$", "");
		if(answer.length() <= 2)
			answer += String.valueOf(answer.charAt(answer.length() - 1)).repeat(3 - answer.length());
        return answer;
    }
}

2. 설명

문제는 정규식을 활용하여 해결하였습니다.

new_id.toLowerCase().replaceAll("[^a-z|0-9|\\-|_|.]", "")

new_id의 문자열을 소문자로 변환하고 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)가 아닌 문자들은 공백으로 바꿔줍니다.

replaceAll("[.]+", ".")

그 상태에서 마침표(.)가 1개 이상인 문자열 부분을 마침표 1개로 바꿉니다.

replaceAll("^[.]|[.]$", "")

마침표가 문자열의 시작과 끝에 있다면 공백으로 바꾸어줍니다.

if(answer.isBlank())
    answer = "a";

만약 공백이라면 a로 초기화해 줍니다.

if(answer.length() >= 16)
    answer = answer.substring(0, 15).replaceAll("^[.]|[.]$", "");

16글자 이상이라면 15글자까지로 자르고 마침표가 시작과 끝에 있으면 공백으로 바꾸어줍니다.

if(answer.length() <= 2)
    answer += String.valueOf(answer.charAt(answer.length() - 1)).repeat(3 - answer.length());

문자열의 길이가 2 이하라면 문자열의 마지막글자가 3글자가 되도록 이어줍니다.

3. 정리

  1. 정규식을 이용하면 쉽게 해결할 수 있다.
  2. 빼기의 경우 정규식에서 범위를 지정할 때 사용하기에 \를 붙여줘야 하는데 자바의 경우 \\로 붙여줘야 한다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges