신규 아이디 추천(프로그래머스 Lv1)
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Solution
{
public String solution(String new_id)
{
//1단계
String reg1 = "[A-Z]+";
//StringBuffer new_id1 = new StringBuffer();
//new_id1.append(new_id);
//위에 2줄이 아래코드 대신
String new_id1 = new_id;
//페턴 객체에 정규식을 넣어 컴파일 한다.
Pattern pat = Pattern.compile(reg1);
//패턴 객체의 matcher함수에 인수로 new_id1을 넣고
//실행한 결과를 Matcher객체에 넣는다.
Matcher match = pat.matcher(new_id1);
while(match.find())
//match.find()
//=>match되는 값이 있으면 true, 그렇지 않으면 false를 반환한다.
// 반복하다보면 언젠가 false가 나온다.
{
int start = match.start(); //일치부분 시작 인덱스
int end = match.end(); //일치부분 끝의 다음 인덱스
//예시
//정규식 = "a*b";
//인덱스 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//문자열 a a b f o o a b f o o a a b f o o
// ------- ---- ---------
//start의 값들 => 0,6,11
//end의 값달 => 3,8,14
//시작 인덱스, 끝인덱스, 삽입할 문자열
//소문자로 구성된 새로은 문자열 만들기
//match.group() => 매치와 일치하는 문자열을 반환한다.
new_id1 = new_id1.substring(0, start) + match.group().toLowerCase()
+new_id1.substring(end);
//마지막에+new_id1.substring(end, new_id1.length());라 해도 된다.
//이때 new_id1.length()-1로 하면 마지막 인덱스를 빼먹으니 주의해야한다.
}
//2단계
//알파벳 소문자, 숫자, 빼기(-), 밑줄(_),
//마침표(.)를 제외한 모든 문자를 제거.
//replace안에 정규식 쓸때 "\"를 나타내기 위해선 "\\"로 해야한다.
//(단 compile안하고 정규식 사용시 상관없다.)
//예시
//function checkEngNum(str)
//{
// const regExp = /[a-zA-Z0-9]/g;
// if(regExp.test(str))
// {
// return true;
// }
// else
// {
// return false;
// }
//}
/*
정규 표현식에서 백슬러시(\)는 확장 문자로,
다음에 일반 문자가 오면 특수문자로 취급하고,
백슬러시 다음에 특수문자가 오면 그 문자 자체를 의미
예시) \\- => "-"자체를 의미
*/
new_id1 = new_id1.replaceAll("[^a-z\\d\\-_.]*", "");
//3단계
//"."가 2개이상 연속되면 하나의 "."로 바꾼다.
new_id1 = new_id1.replaceAll("\\.{2,}", ".");
//4단계
//"."으로 시작하거나 끝나는지 판단.
//"^문자1" => 문자열의 시작이 문자1인것을 의미
//"문자2$" => 문자열의 끝이 문자2인것을 의미
//new_id1.replace("^(\\.)", "");
//new_id1.replace("(\\.)$", "");
new_id1 = new_id1.replaceAll("^[.]|[.]$", "");
//5단계
//new_id가 빈 문자열인지 판단하고, 비어있다면 new_id에 "a"를 대입
//주의!!
//"=="는 객체가 같은지를 비교하지만 객체가 갖고 있는 문자열을 비교하지는 않는다.
//즉 객체의 hascode(주소)가 같은것인가 비교하지, 서로 다른 객체의 내용물이
//같은가 비교하는 것이 아니다.
//따라서 객체의 내용물이 같은가 판단하고 싶다면 반드시 equals를 써줘야 한다.
if(new_id1.equals(""))
{
new_id1 = "a";
}
//6단계
//new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거.
//만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거.
if(new_id1.length() >= 16)
{
//앞의 15개의 문자열 축출
String new_id2 = new_id1.substring(0,15);
//new_id1에서 15번째 문자열이 "."가 확인위해 아레처럼 코딩
//같은 문자열끼리 비교해야 한다.!!!!
//charAt()으로 얻은 값을 넣은 값은 문자열이 아닌 문자다.
//따라서 문자열인 "."과 비교할 수 가 없다.
//=> substring()을 통해 문자열을 얻어와 비교해야 한다.
String comp1 = new_id1.substring(14,15);
System.out.println(comp1);
String comp2 = ".";
//주의!!!!!!!!!
//"=="는 객체가 같은지를 비교하지만 객체가 갖고 있는 문자열을 비교하지는 않는다.
//즉 객체의 hascode(주소)가 같은것인가 비교하지, 서로 다른 객체의 내용물이
//같은가 비교하는 것이 아니다.
//따라서 객체의 내용물이 같은가 판단하고 싶다면 반드시 equals를 써줘야 한다.
//참고 a.compareTo(b)
//=>어떤 문자가 사전적인 순서로 앞에 있는지도 리턴
// ex) 음수(a가 b보다 앞서있다), 0(a가 b와 같다), 양수(a가 b보다 뒤에 있다.)
if(comp1.equals(comp2))
{
new_id1 = new_id1.substring(0,14);
}
else
{
new_id1 = new_id2;
}
}
//7단계
//new_id의 길이가 2자 이하라면, new_id의 마지막 문자를
//new_id의 길이가 3이 될 때까지 반복해서 끝에 붙인다.
if(new_id1.length() <= 2)
{
char last = new_id1.charAt(new_id1.length()-1);
//int i=new_id1.length()에서 -1하지 않도록 한다.
for(int i=new_id1.length(); i<=2; i++)
{
new_id1 += last;
}
}
String answer = new_id1;
return answer;
}
}
실행결과
댓글남기기