728x90
programmers.co.kr/learn/courses/30/lessons/72410?language=java
N사 면접에서 떨어지고 나서, 다시 초심으로 돌아가 기초부터 꼼꼼하게 다지기로 마음먹었다. 떨어진 아쉬움도 컸지만, 부족한 부분을 다듬고 채워야 할 부분을 알게된 소중한 시간이였다. 앞으로 인턴 및 정규직 시험도 몇개 남았는데, 급하게 욕심내기보단, 여유를 가지고 차근차근 밟아나가자!
이 문제는 전혀 까다롭지 않는 문제지만, 정규표현식을 연습하기 좋은 문제인것 같다.
1. 정규표현식을 사용하지 않는 풀이
class Solution {
public String solution(String new_id) {
String answer = "";
String rs1 = stepOne(new_id);
String rs2 = stepTwo(rs1);
System.out.println(rs2);
String rs3 = stepThr(rs2);
System.out.println(rs3);
String rs4 = stepFou(rs3);
System.out.println(rs4);
String rs5 = stepFiv(rs4);
System.out.println(rs5);
String rs6 = stepSix(rs5);
System.out.println(rs6);
String rs7 = stepSev(rs6);
System.out.println(rs7);
return rs7;
}
// 1단계
private String stepOne(String id){
return id.toLowerCase();
}
// 2단계
private String stepTwo(String id){
StringBuilder sb = new StringBuilder();
char c;
for(int i=0; i<id.length(); i++){
c = id.charAt(i);
if( c == '-' || c == '_' || c =='.'
|| (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ){
sb.append(c);
}
}
return sb.toString();
}
// 3단계
private String stepThr(String id){
StringBuilder sb = new StringBuilder();
sb.append(id.charAt(0));
char c;
for(int i=1; i<id.length(); i++){
c = id.charAt(i);
if(id.charAt(i-1)=='.' && id.charAt(i)=='.') continue;
sb.append(c);
}
return sb.toString();
}
// 4단계
private String stepFou(String id){
String res = id;
if(id.charAt(0)=='.'){
res = res.substring(1,id.length());
}
if(id.charAt(id.length()-1)=='.'){
res = res.substring(0,id.length()-1);
}
return res;
}
// 5단계
private String stepFiv(String id){
if(id.length()==0){
id += "a";
}
return id;
}
// 6단계
private String stepSix(String id){
String res = id;
if(res.length()>=16){
res = res.substring(0,15);
}
if(res.charAt(res.length()-1)=='.'){
res = res.substring(0,res.length()-1);
}
return res;
}
// 7단계
private String stepSev(String id){
String res = id;
while(res.length()<=2){
res += id.charAt(id.length()-1);
}
return res;
}
}
2. 정규표현식을 사용한 풀이
class Solution {
public static String solution(String new_id) {
String answer = "";
String rs1 = stepOne(new_id);
String rs2 = stepTwo(rs1);
String rs3 = stepThr(rs2);
String rs4 = stepFou(rs3);
String rs5 = stepFiv(rs4);
String rs6 = stepSix(rs5);
String rs7 = stepSev(rs6);
return rs7;
}
// 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
private static String stepOne(String id){
return id.toLowerCase();
}
// 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
private static String stepTwo(String id){
// [^문자]형태 -> 문자를 제외한 모든 문자
// -_.a-z0-9를 제외한 문자 전부 제거
return id.replaceAll("[^-_.a-z0-9]","");
}
// 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
private static String stepThr(String id){
// .은 어떤 문자 1개
// [.]은 정확히 .문자 자체를 의미( 그냥 .는 어떤 임의의 문자)
// {2,} -> 2회 이상 반복
// => 정확히 .문자가 2회이상 반복이면 .으로 치환
return id.replaceAll("[.]{2,}",".");
}
// 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
private static String stepFou(String id) {
// ^문자 형태 -> 문자로 시작하는지
// 문자$ 형태 -> 문자로 종료하는지
// '.'으로 시작하거나 '.'로 끝나는 경우
return id.replaceAll("^[.]|[.]$","");
}
// 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
private static String stepFiv(String id){
return (id.length()==0) ? (id+"a") : id ;
}
// 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
private static String stepSix(String id){
if (id.length() >= 16) id=id.substring(0,15);
return id.replaceAll("^[.]|[.]$","");
}
// 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
private static String stepSev(String id){
while(id.length()<=2){ id += id.charAt(id.length()-1); }
return id;
}
}
3. 2번 풀이 그대로간략화시킨 경우
class Solution {
public static String solution(String new_id) {
String res = new_id.toLowerCase();
res = res.replaceAll("[^-_.a-z0-9]","");
res = res.replaceAll("[.]{2,}",".");
res = res.replaceAll("^[.]|[.]$","");
res = (res.length()==0) ? (res+"a") : res;
if (res.length() >= 16) res=res.substring(0,15);
res = res.replaceAll("^[.]|[.]$","");
while(res.length()<=2){ res += res.charAt(res.length()-1); }
return res;
}
}
4. python으로 푼 풀이
import re
def solution(new_id):
st = new_id.lower()
st = re.sub('[^-_.a-z0-9]', '', st)
st = re.sub('[.]{2,}', '.', st)
st = re.sub('^[.]|[.]$', '', st)
st = 'a' if len(st) == 0 else st[:15]
st = re.sub('^[.]|[.]$', '', st)
st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
return st
728x90
'[Algorithms] > [Problems]' 카테고리의 다른 글
BOJ. 21610번. 마법사 상어와 비바라기 (0) | 2021.06.05 |
---|---|
BOJ. 2042번. 구간합 구하기 (0) | 2021.05.16 |
BOJ. 1194번. 달이 차오른다 가자 (0) | 2021.04.21 |
SWEA. 5607. 조합(페르마의 소정리) (0) | 2021.04.20 |
BOJ. 16562번. 친구비 (0) | 2021.04.17 |