프로그래머스 - 신규 아이디 추천

박철현·2023년 9월 7일

프로그래머스

목록 보기
50/80

프로그래머스 - 신규 아이디 추천

정규표현식 활용하지 않은 버전

class Solution {
	public String solution(String new_id) {
		// 1단계
		String answer = "";
		new_id = new_id.toLowerCase();

		// 2단계
		for (int i = 0; i < new_id.length(); i++) {
			char ch = new_id.charAt(i);
			if (Character.isAlphabetic(ch) || Character.isDigit(ch) || ch == '-' || ch == '_' || ch == '.') {
				answer += ch;
			}
		}

		// 3단계
		while (answer.indexOf("..") != -1) {
			answer = answer.replace("..", ".");
		}

		// 4단계
		if (!answer.isEmpty() && answer.charAt(0) == '.') {
			answer = answer.substring(1);
		}
		if (!answer.isEmpty() && answer.charAt(answer.length() - 1) == '.') {
			answer = answer.substring(0, answer.length() - 1);
		}

		// 5단계
		if (answer.isEmpty()) {
			answer = "a";
		}

		// 6-1단계
		if (answer.length() >= 16) {
			answer = answer.substring(0, 15);
			// 6-2단계
			if (answer.charAt(answer.length() - 1) == '.') {
				answer = answer.substring(0, answer.length() - 1);
			}
		}

		// 7단계
		while (answer.length() < 3) {
			answer += answer.charAt(answer.length() - 1);
		}

		return answer;
	}
}
  • 각 단계별 구현 방법
    ex) 입력 예시 : "...!@BaT#*..y.abcdefghijklm"
단계내용활용메서드예상결과
1단계소문자 치환toLowerCase()...!@bat#*..y.abcdefghijklm
2단계소문자, 숫자, 빼기, 밑줄, 마침표isAlphabetic, isDisgit...bat..y.abcdefghijklm
3단계마침표 2번 이상while.bat.y.abcdefghijklm
4단계마침표 처음 또는 끝 제거charAtbat.y.abcdefghijklm
5단계빈 문자열이면 "a"대입isEmptybat.y.abcdefghijklm
6-1길이가 16자 이상subStringbat.y.abcdefghi
6-2마침표가 끝에 위치charAtbat.y.abcdefghi
7단계길이가 2자 이하whilebat.y.abcdefghi
  • Character.isAlphabetic : 유니코드 문자 범위 내 알파벳 문자 인식
    • 영어 뿐 아닌 다른 언어(한글 등)도 확인
  • Character.isDigit : 0-9 사이 숫자인지 확인
  • charAt 메서드 및 shbString 메서드의 경우 조건에 맞지 않으면 예외
    • 문자열 길이가 0인 경우
    • 문자열 길이 or 범위를 벗어난 인덱스에 접근

정규표현식 활용 버전

class Solution {
	public String solution(String new_id) {
		// 1단계
		String answer = "";
		new_id = new_id.toLowerCase();

		// 2단계
		answer = new_id.replaceAll("[^a-z0-9-_.]", "");

		// 3단계
		answer = answer.replaceAll("\\.+", ".");

		// 4단계
		answer = answer.replaceAll("^[.]|[.]$", "");

		// 5단계
		if (answer.isEmpty()) {
			answer = "a";
		}

		// 6-1단계
		if (answer.length() >= 16) {
			answer = answer.substring(0, 15);
			// 6-2단계
			answer = answer.replaceAll("[.]$", "");
		}

		// 7단계
		while (answer.length() < 3) {
			answer += answer.charAt(answer.length() - 1);
		}

		return answer;
	}
}
  • 각 단계별 구현 방법
    ex) 입력 예시 : "...!@BaT#*..y.abcdefghijklm"
단계내용활용메서드예상결과
1단계소문자 치환toLowerCase()...!@bat#*..y.abcdefghijklm
2단계소문자, 숫자, 빼기, 밑줄, 마침표[^a-z0-9\-_.]...bat..y.abcdefghijklm
3단계마침표 2번 이상\.+.bat.y.abcdefghijklm
4단계마침표 처음 또는 끝 제거^[.]1[.]$(1은 or의미,표 문법..)bat.y.abcdefghijklm
5단계빈 문자열이면 "a"대입isEmptybat.y.abcdefghijklm
6-1길이가 16자 이상subStringbat.y.abcdefghi
6-2마침표가 끝에 위치[.]$bat.y.abcdefghi
7단계길이가 2자 이하whilebat.y.abcdefghi
  • 정규표현식 규칙

    • [] 안에있는 문자면 이스케이프 문자 사용 안해도 됨

      문자의미문자로만 표현
      .(마침표)문자 하나\.
      -(하이픈)문자 범위\-
      *(별표)패턴 0회 이상 반복\*
      +(플러스)패턴 1회 이상 반복\+
      ?(물음표)패턴 0회 또는 1회\?
      '(', ')'그룹 또는 패턴 그룹화\( or \)
      '[', ']'문자 클래스 정의\[ or \]
      '{', '}'반복 횟수 지정\{ or \}
      \이스케이프 문자 자체\(역슬래시 2개)
  • 사용된 정규 표현식 관련

문자의미
[]or: 대괄호 안의 모든 문자
[^]not : 대괄호 안의 문자 외 모든 문자
^[]대괄호 안의 문자로 시작하는 문자열
[]$대괄호 안의 문자로 끝나는 문자열
+1개 이상의 문자
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글