투케이2K

61. (TWOK/ALGORITHM) [Java] 신규 아이디 추천 - regExp 정규식 , 삼항식 , substring , charAt 본문

투케이2K 알고리즘

61. (TWOK/ALGORITHM) [Java] 신규 아이디 추천 - regExp 정규식 , 삼항식 , substring , charAt

투케이2K 2022. 9. 6. 08:23

[환경 설정 및 설명]

언 어 : Java

설 명 : 신규 아이디 추천 - regExp 정규식 , 삼항식 , substring , charAt

 

[소스 코드]

	// TODO [solution 메소드 정의 실시]
	public String solution(String new_id) {

		/**
		 * //-------------------------------
		 * [신규 아이디 추천]
		 * //-------------------------------
		 * 1. 설명 : 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다
		 * //-------------------------------
		 * 2. 규칙 :
		 *    - 아이디의 길이는 3자 이상 15자 이하여야 합니다
		 *    - 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다
		 *    - 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다
		 * //-------------------------------
		 * 3. 단계 :
		 *    - 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다
		 *      (...!@BaT#*..y.abcdefghijklm  >>  ...!@bat#*..y.abcdefghijklm)
		 *
		 *    - 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다
		 *      (...!@bat#*..y.abcdefghijklm  >>  ...bat..y.abcdefghijklm)
		 *
		 *    - 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다
		 *      (...bat..y.abcdefghijklm  >>  .bat.y.abcdefghijklm)
		 *
		 *    - 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다
		 *      (.bat.y.abcdefghijklm  >>  bat.y.abcdefghijklm)
		 *
		 *    - 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다
		 *      (bat.y.abcdefghijklm  >>  bat.y.abcdefghijklm)
		 *
		 *    - 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
		 *           만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다
		 *      (bat.y.abcdefghijklm  >>  bat.y.abcdefghi)
		 *
		 *    - 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
		 *      (bat.y.abcdefghi  >>  bat.y.abcdefghi)
		 * //-------------------------------
		 * 4. 입출력 예시 :
		 *    - (...!@BaT#*..y.abcdefghijklm  >> bat.y.abcdefghi)
		 *
		 *    - (z-+.^.  >> z--)
		 *
		 *    - (=.=  >> aaa)
		 * //-------------------------------
		 * 5. 참고 사이트 :
		 *
		 *    https://school.programmers.co.kr/learn/courses/30/lessons/72410?language=java
		 * //-------------------------------
		 * */

		try {
			// [1] : 모든 대문자를 대응되는 소문자로 치환
			String lowerStr = new_id.toLowerCase();
			Log.d("---","---");
			Log.w("//===========//","================================================");
			Log.d("","\n"+"[solution() 메소드 : 1 단계 로직]");
			Log.d("","\n"+"[lowerStr : "+String.valueOf(lowerStr)+"]");
			Log.w("//===========//","================================================");
			Log.d("---","---");


			// [2] : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
			String rexExp = "[^a-z0-9\\-\\_\\.]";
			String removeData = "";
			for (int i=0; i<lowerStr.length(); i++){
				if (String.valueOf(lowerStr.charAt(i)).matches(rexExp)){
					continue;
				}
				else {
					removeData = removeData + String.valueOf(lowerStr.charAt(i));
				}
			}
			Log.d("---","---");
			Log.w("//===========//","================================================");
			Log.d("","\n"+"[solution() 메소드 : 2 단계 로직]");
			Log.d("","\n"+"[removeData : "+String.valueOf(removeData)+"]");
			Log.w("//===========//","================================================");
			Log.d("---","---");


			// [3] : 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
			String changeDot = removeData.replaceAll("\\.+", ".");
			Log.d("---","---");
			Log.w("//===========//","================================================");
			Log.d("","\n"+"[solution() 메소드 : 3 단계 로직]");
			Log.d("","\n"+"[changeDot : "+String.valueOf(changeDot)+"]");
			Log.w("//===========//","================================================");
			Log.d("---","---");


			// [4] : 마침표(.)가 처음이나 끝에 위치한다면 제거
			if (changeDot.startsWith(".")) changeDot = changeDot.substring(1, changeDot.length());
			if (changeDot.endsWith(".")) changeDot = changeDot.substring(0, changeDot.length()-1);
			Log.d("---","---");
			Log.w("//===========//","================================================");
			Log.d("","\n"+"[solution() 메소드 : 4 단계 로직]");
			Log.d("","\n"+"[changeDot : "+String.valueOf(changeDot)+"]");
			Log.w("//===========//","================================================");
			Log.d("---","---");


			// [5] : new_id가 전체 값이 빈 문자열이라면, new_id에 "a"를 대입
			String a_String = (changeDot.length() <= 0 || changeDot == null || changeDot.isEmpty() == true) ? "a" : changeDot;
			Log.d("---","---");
			Log.w("//===========//","================================================");
			Log.d("","\n"+"[solution() 메소드 : 5 단계 로직]");
			Log.d("","\n"+"[a_String : "+String.valueOf(a_String)+"]");
			Log.w("//===========//","================================================");
			Log.d("---","---");


			// [6] : new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거 / 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
			String leng_check = a_String;
			if (leng_check.length() >= 16){
				leng_check = leng_check.substring(0, 15);
			}
			leng_check = (leng_check.endsWith(".") == true) ? leng_check.substring(0, leng_check.length()-1) : leng_check;
			Log.d("---","---");
			Log.w("//===========//","================================================");
			Log.d("","\n"+"[solution() 메소드 : 6 단계 로직]");
			Log.d("","\n"+"[leng_check : "+String.valueOf(leng_check)+"]");
			Log.w("//===========//","================================================");
			Log.d("---","---");


			// [7] : new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다
			if (leng_check.length() <= 2){
				String charData = String.valueOf(leng_check.charAt(leng_check.length()-1));

				for (int i=leng_check.length(); i<3; ++i){
					leng_check = leng_check + charData;
				}
			}
			Log.d("---","---");
			Log.w("//===========//","================================================");
			Log.d("","\n"+"[solution() 메소드 : 7 단계 로직]");
			Log.d("","\n"+"[leng_check : "+String.valueOf(leng_check)+"]");
			Log.w("//===========//","================================================");
			Log.d("---","---");
		}
		catch (Exception e){
			e.printStackTrace();
		}

		return null;
	}
 

[결과 출력]


 

반응형
Comments