본문 바로가기
알고리즘/프로그래머스

[프로그래머스 / 신규 아이디 추천 / JAVA / replaceAll()]

by KDW999 2023. 3. 7.

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

다른 문제들도 같은 방식으로 풀긴했지만 이 문제는 자체에서 단계별로 해결사항을 제시해줘서 푸는 맛이 있었다.

 

아이디 검사 7단계
1. 모든 대문자를 소문자로 → toLowerCase() 사용
2. 알파벳 소문자, 숫자, -, _, .을 제외한 다른 문자 전부 제거 → 문제에서 제시한 있을 수 있는 특수문자 배열을 따로 만들어서 반복문으로 해당 특수문자들 제거
3. .(마침표)가 2번 이상 연속되면 .을 1개로 치환 → replace()로 ..을 while문 내에서 ..이 없을 때 까지 .으로 변경
4 .(마침표)가 처음이나 끝에 있다면 제거 → replaceFirst()로 맨 앞 . 제거, subString()으로 0번 인덱스 부터 마지막 문자 앞 자리 까지 잘라서 맨 뒤 . 제거
5. 아이디가 빈 문자열이면 a 대입 → 빈 문자열이면 new_id에 a추가
6. 아이디 길이가 16자 이상이면 첫 15개 문자를 제외한 나머지 문자들을 모두 제거 
     → 15개 문자로 남겼을 때 마지막이 .이라면 .도 제거

→ SubString으로 초과한 크기 잘라줌

7. 아이디 길이가 2자 이하라면 마지막 문자를 길이가 3될 때 까지 반복해서 붙임 → 마지막 문자를 String으로 문자열 치환해줘서 크기가 3이상 될 때 까지 더해줌

 

charAt()과 subString 쓸 때 charAt()은 0번 인덱스부터 시작, subString은 0번 인덱스부터 적은 갯수 까지 자르는 형태에다

length()는 문자가 1개면 길이가 1부터 시작이라 사용할 때 혼동온게 풀 때 제일 힘들었다.

class Solution {
	 public String solution(String new_id) {
		 String[] specialChar = {"~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "=",
				                 "+", "[", "{", "]", "}", ":", "?", ",", "<", ">", "/"};
		 
		 System.out.println("검사 전 : " +new_id);
		 
		 // 1
		 new_id = new_id.toLowerCase();
		 System.out.println("1단계 검사 후 : "+ new_id);
		 
		 // 2
		 for(int i=0; i<specialChar.length; i++)  new_id = new_id.replace(specialChar[i], "");
         System.out.println("2단계 검사 후 : " + new_id);		
		
		 // 3 여기서 .을 1개로 줄여줘서 4단계에서 .을 여러 번 줄이는 일 없게
		 while(new_id.contains("..")) new_id = new_id.replace("..", ".");
		 System.out.println("3단계 검사 후 : "+ new_id);
		 
		 // 4
		 // 첫, 끝 문자를 문자열로 치환?
		 while(new_id.length() != 0 && (new_id.charAt(0) == '.' || new_id.charAt(new_id.length()-1) == '.')) { // 문자열이 공백이면 charAt(0)이 없기에 오류떠서 길이 조건 넣어줌
		 if(new_id.charAt(0) == '.') new_id = new_id.replaceFirst(".", ""); // 맨 앞 . 짜르기
		 if(new_id.length() != 0 && new_id.charAt(new_id.length()-1) == '.') new_id = new_id.substring(0, new_id.length()-1); // 맨 뒤 . 짜르기
		 }
		 System.out.println("4단계 검사 후 : "+ new_id);
	 
		 // 5
		 if(new_id.equals("")) new_id += "a";
		 System.out.println("5단계 검사 후 : "+ new_id);
		 
		 // 6 크기 초과한 문자열을 잘라버리고 뒤에 .이 있다면 4단계에서 했던 검사 한 번 더
		 if(new_id.length() > 15) new_id = new_id.substring(0, 15);
		 if(new_id.charAt(new_id.length()-1) == '.') new_id = new_id.substring(0, new_id.length()-1);
		 System.out.println("6단계 검사 후 : "+ new_id);
		 
		 // 7 
		 while(new_id.length() < 3) {
			 String str = String.valueOf(new_id.charAt(new_id.length()-1));
			 new_id += str;
		 }
		 System.out.println("7단계 검사 후 : " + new_id);	 
			 
	        return new_id;
	    }
}

 

다른 사람 풀이

풀이 방향은 전체적으로 비슷하며 replaceAll()을 사용하여 문자 바꾸는 걸 굉장히 손 쉽게 해결하였다.

replaceAll()은 replace와는 다르게 정규식을 사용한다고 한다.

 

[ 다른 분이 정리해놓은 replaceAll() 정규식 사용법 ]

https://earth-ing.tistory.com/entry/Java-replaceAll-%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90-%EC%A0%9C%EA%B1%B0-%EC%88%AB%EC%9E%90%EB%B9%BC%EA%B3%A0-%EB%AC%B8%EC%9E%90%EB%B9%BC%EA%B3%A0-%EC%B4%9D-%EC%A0%95%EB%A6%AC-1

 

[Java] replaceAll() 특수문자 제거, 숫자빼고, 문자빼고 총 정리

replaceAll은 쓸때마다 참 헷갈리는 것같다.. ​ 기본적으로 알아야할 것은 str.replaceAll("[{바꾸고싶은 문자의 정규식}]", "{치환할 문자}"); 이렇게 사용하는데 정규식이 아주 헷갈리고 쓰기 어려울 때

earth-ing.tistory.com

 

https://velog.io/@minji/Java-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9DString.replaceAll-%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%B9%98%ED%99%98

 

[Java] 정규표현식(String.replaceAll 메서드를 이용한 치환)

정규표현식이란 텍스트에서 원하는 조건과 일치하는 문자열을 찾아내거나, 원하는 조건과 텍스트가 일치하는지 참/거짓 여부를 판단하는 등의 상황에 사용된다. 예를 들어, 여러 사람의 집단중

velog.io

class Solution {
    public String solution(String new_id) {
        String answer = "";
        String temp = new_id.toLowerCase();

        temp = temp.replaceAll("[^-_.a-z0-9]",""); // -_. a~z 0~9를 제외한 모든 문자를 ""으로
        System.out.println(temp);
        temp = temp.replaceAll("[.]{2,}","."); // .이 2개면 .으로??
        temp = temp.replaceAll("^[.]|[.]$","");
        System.out.println(temp.length());
        if(temp.equals(""))
            temp+="a";
        if(temp.length() >=16){
            temp = temp.substring(0,15);
            temp=temp.replaceAll("^[.]|[.]$","");
        }
        if(temp.length()<=2)
            while(temp.length()<3)
                temp+=temp.charAt(temp.length()-1);

        answer=temp;
        return answer;
    }
}

댓글