프로그래머스 코딩테스트 연습 2021 KAKAO BLIND RECRUITMENT 신규 아이디 추천 [java, 정규식]

박한솔·2022년 9월 15일
0

오늘 풀은 문제는 "정규식"에 관한 부분이었다.

주요 사용된 메소드들은
String에 관련된 replace, replaceAll, charAt 이 있다.

오늘 문제는 정규식에 관한 부분이 대다수여서 크게 오래 걸리거나 하진 않았지만,
정규식은 머리에 외우고 다니지도 않고, 많이 써보지도 않아서인지 구글링을 좀 했다 ㅎ

	new_id = new_id.toLowerCase();

첫번째로 아이디 입력값에 만약 대문자가 있을 경우에 소문자로 치환해주는 toLowerCase 메소드를 사용해준다.

	new_id = new_id.replaceAll("[^a-z0-9-_.]", "");입력하세요

그 다음으론 replaceAll을 이용해, 해당 id 안에는 알파벳, 숫자, -, _, . 만 들어가야 함으로
정규식을 이용해서 그외의 문자열들을 공백으로 만들어준다.

여기서 문자열 치환 메소드는 보통 2개인데
replace 와 reaplceAll 이 있다.

이 두 메소드의 차이점은 매개변수에 있는데,

      String replace(CharSequnce target, CharSequence replacement)
      String replaceAll(String regex, String replacement)

replace 는 일반 문자열을 찾아서 치환해주고,
replaceAll 은 정규식형태의 String 값을 넣어준다.
(CharSequence 는 String을 포괄하는 인터페이스)

아무튼 다음 코드 설명으로 넘어가면

      while(new_id.contains("..")) {new_id = new_id.replace("..", ".");}

이번엔 굳이 replaceAll을 사용하진 않았다.
정규식을 안쓸거니깐!!

.. 을 . 으로 바꿔주는 형태인데,
... 인 경우는 한번밖에 치환을 안해줘서 남는 경우가 있으니
.. 이 없어질때 까지 반복문을 돌려주는 형태로 작성했다.

어.. 근데 이거 글쓰면서 생각난건데, CharSequence가 String을 상속하는 인터페이스라면, replace에서도 replaceAlㅣ에서 사용하는 정규식을 사용 할 수 있어야 하는거 아닌가?
하고 사용해 봤는데... 뭔가 제대로 되지 않는다.
내 생각이 틀린건가? 하고 생각이 들어서 찾아봤는데,
그게아니고 그냥 String 안에 있는 toString 메소드가 오버라이딩 되어있는 형태인것같다...

아 진짜 인터페이스는 아직도 잘 모르겠다 ㅎ 이해가 갈랑말랑...

아무튼 다음으로.

		new_id = new_id.replaceAll("^[.]*", "");
		new_id = new_id.replaceAll("[.]$", "");

아이디의 처음과 마지막에 . 이 들어가지 않도록 지워주는 작업이다.

흠.. 이것도 한줄로 바꾸는거 가능할거같은데, 조금 더 공부 해 봐야지.

		if("".equals(new_id)) new_id = "a";

만약에 아이디가 빈 문자열로 들어오게 되는경우엔, a 한글자를 할당해준다.

		if(new_id.length() > 15) new_id = new_id.substring(0, 15);

아이디가 15글자를 넘어 갈 경우엔 15자리 까지만 끊어준다.

		new_id = new_id.replaceAll("[.]$", "");

만약에 15자리 까지 끊어줬는데, . 이 마지막에 올 경우가 있을수도 있으니 한번 더 제거 해 준다.

		if(new_id.length() < 3) {
			char lastC = new_id.charAt(new_id.length()-1);
			while(new_id.length() < 3) {new_id = new_id + lastC;}
		}

그리고 마지막으로 3자리 이하 일 때
마지막 char를 사용해서 3자리가 될때 까지 id 에 추가 해 주도록 한다.

이렇게 하면 끝!

다른 분들의 문제 풀이도 한번 봤는데, 재사용성을 생각하고 푸신 분의 풀이를 보니
아.. 이게 자바의 장점인데도 난 왜 문제 푸는데 급급 할까 ㅎㅎ 란 생각이 들더라...

다음 부턴 재사용성도 한번 생각을 해보고 접근 하는게 좋을듯 하다.

예를들면, 위와같이 1~7 단계를 거쳐서 사용 되는 경우에는 각각 메소드들을 만들어 놓고 사용하는것이 유지보수 측면이나 가독성 면에서도 훨씬 좋아지는 느낌이 들었다.

아무튼 완성된 코드는 아래와 같다.

	public String solution(String new_id) {
		
		new_id = new_id.toLowerCase();
		new_id = new_id.replaceAll("[^a-z0-9-_.]", "");
		while(new_id.contains("..")) {new_id = new_id.replace("..", ".");}
		new_id = new_id.replaceAll("^[.]", "");
		new_id = new_id.replaceAll("[.]$", "");
		if("".equals(new_id)) new_id = "a";
		if(new_id.length() > 15) new_id = new_id.substring(0, 15);
		new_id = new_id.replaceAll("[.]$", "");
		if(new_id.length() < 3) {
			char lastC = new_id.charAt(new_id.length()-1);
			while(new_id.length() < 3) {new_id = new_id + lastC;}
		}
        
        
		String answer = new_id;
        return answer;
    }

https://github.com/dosirakHansol

0개의 댓글