Coding Test

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 72410 : μ‹ κ·œ 아이디 μΆ”μ²œ - μžλ°” 풀이 및 μ˜€λ‹΅λ…ΈνŠΈ(ν…ŒμΌ€ 2 , 22 , 23 , 15 , 20 , 21 , 25)

ν”„λ‘œκ·Έλž˜λ¨Έ μ˜€μ›” 2023. 10. 4.

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

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

βœ”οΈλ¬Έμ œ μ„€λͺ…

μΉ΄μΉ΄μ˜€μ— μž…μ‚¬ν•œ μ‹ μž… κ°œλ°œμž λ„€μ˜€λŠ” "μΉ΄μΉ΄μ˜€κ³„μ •κ°œλ°œνŒ€"에 λ°°μΉ˜λ˜μ–΄, μΉ΄μΉ΄μ˜€ μ„œλΉ„μŠ€μ— κ°€μž…ν•˜λŠ” μœ μ €λ“€μ˜ μ•„이디λ₯Ό μƒμ„±ν•˜λŠ” μ—…무λ₯Ό λ‹΄λ‹Ήν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. "λ„€μ˜€"μ—κ²Œ μ£Όμ–΄μ§„ μ²« μ—…λ¬΄λŠ” μƒˆλ‘œ κ°€μž…ν•˜λŠ” μœ μ €λ“€μ΄ μΉ΄μΉ΄μ˜€ μ•„이디 κ·œμΉ™μ— λ§žμ§€ μ•ŠλŠ” μ•„이디λ₯Ό μž…λ ₯ν–ˆμ„ λ•Œ, μž…λ ₯된 μ•„이디와 μœ μ‚¬ν•˜λ©΄μ„œ κ·œμΉ™μ— λ§žλŠ” μ•„이디λ₯Ό μΆ”μ²œν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
λ‹€μŒμ€ μΉ΄μΉ΄μ˜€ μ•„μ΄λ””μ˜ κ·œμΉ™μž…λ‹ˆλ‹€.

μ•„μ΄λ””μ˜ κΈΈμ΄λŠ” 3자 μ΄μƒ 15자 μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
μ•„μ΄λ””λŠ” μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, μˆ«μž, λΉΌκΈ°(-), λ°‘쀄(_), λ§ˆμΉ¨ν‘œ(.) λ¬Έμžλ§Œ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
단, λ§ˆμΉ¨ν‘œ(.)λŠ” μ²˜μŒκ³Ό λμ— μ‚¬μš©ν•  μˆ˜ μ—†μœΌλ©° λ˜ν•œ μ—°μ†μœΌλ‘œ μ‚¬μš©ν•  μˆ˜ μ—†μŠ΅λ‹ˆλ‹€.
"λ„€μ˜€"λŠ” λ‹€μŒκ³Ό κ°™μ΄ 7λ‹¨κ³„μ˜ μˆœμ°¨μ μΈ μ²˜λ¦¬ κ³Όμ •μ„ ν†΅ν•΄ μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ μ•„이디가 μΉ΄μΉ΄μ˜€ μ•„이디 κ·œμΉ™μ— λ§žλŠ” μ§€ κ²€μ‚¬ν•˜κ³  κ·œμΉ™μ— λ§žμ§€ μ•Šμ€ κ²½μš° κ·œμΉ™μ— λ§žλŠ” μƒˆλ‘œμš΄ μ•„이디λ₯Ό μΆ”μ²œν•΄ μ£Όλ €κ³  ν•©λ‹ˆλ‹€.
μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ μ•„이디가 new_id λΌκ³  ν•œλ‹€λ©΄,

1단계 new_id의 λͺ¨λ“  λŒ€λ¬Έμžλ₯Ό λŒ€μ‘λ˜λŠ” μ†Œλ¬Έμžλ‘œ μΉ˜ν™˜ν•©λ‹ˆλ‹€.
2단계 new_idμ—μ„œ μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, μˆ«μž, λΉΌκΈ°(-), λ°‘쀄(_), λ§ˆμΉ¨ν‘œ(.)λ₯Ό μ œμ™Έν•œ λͺ¨λ“  λ¬Έμžλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
3단계 new_idμ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ 2번 μ΄μƒ μ—°μ†λœ λΆ€λΆ„을 ν•˜λ‚˜μ˜ λ§ˆμΉ¨ν‘œ(.)둜 μΉ˜ν™˜ν•©λ‹ˆλ‹€.
4단계 new_idμ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ μ²˜μŒμ΄λ‚˜ λμ— μœ„μΉ˜ν•œλ‹€λ©΄ μ œκ±°ν•©λ‹ˆλ‹€.
5단계 new_idκ°€ λΉˆ λ¬Έμžμ—΄μ΄λΌλ©΄, new_id에 "a"λ₯Ό λŒ€μž…ν•©λ‹ˆλ‹€.
6단계 new_id의 κΈΈμ΄κ°€ 16자 μ΄μƒμ΄λ©΄, new_id의 μ²« 15개의 λ¬Έμžλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ„ λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€.
     λ§Œμ•½ μ œκ±° ν›„ λ§ˆμΉ¨ν‘œ(.)κ°€ new_id의 λμ— μœ„μΉ˜ν•œλ‹€λ©΄ λμ— μœ„μΉ˜ν•œ λ§ˆμΉ¨ν‘œ(.) λ¬Έμžλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
7단계 new_id의 κΈΈμ΄κ°€ 2자 μ΄ν•˜λΌλ©΄, new_id의 λ§ˆμ§€λ§‰ λ¬Έμžλ₯Ό new_id의 κΈΈμ΄κ°€ 3이 λ  λ•ŒκΉŒμ§€ λ°˜λ³΅ν•΄μ„œ λμ— λΆ™μž…λ‹ˆλ‹€.


예λ₯Ό λ“€μ–΄, new_id κ°’이 "...!@BaT#*..y.abcdefghijklm" λΌλ©΄, μœ„ 7단계λ₯Ό κ±°μΉ˜κ³  λ‚˜λ©΄ new_idλŠ” μ•„λž˜μ™€ κ°™μ΄ λ³€κ²½λ©λ‹ˆλ‹€.

1단계 λŒ€λ¬Έμž 'B'와 'T'κ°€ μ†Œλ¬Έμž 'b'와 't'둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.
"...!@BaT#*..y.abcdefghijklm" → "...!@bat#*..y.abcdefghijklm"

2단계 '!', '@', '#', '*' λ¬Έμžκ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
"...!@bat#*..y.abcdefghijklm" → "...bat..y.abcdefghijklm"

3단계 '...'와 '..' κ°€ '.'둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.
"...bat..y.abcdefghijklm" → ".bat.y.abcdefghijklm"

4단계 μ•„μ΄λ””μ˜ μ²˜μŒμ— μœ„μΉ˜ν•œ '.'κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
".bat.y.abcdefghijklm" → "bat.y.abcdefghijklm"

5단계 μ•„이디가 λΉˆ λ¬Έμžμ—΄μ΄ μ•„λ‹ˆλ―€λ‘œ λ³€ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
"bat.y.abcdefghijklm" → "bat.y.abcdefghijklm"

6단계 μ•„μ΄λ””μ˜ κΈΈμ΄κ°€ 16자 μ΄μƒμ΄λ―€λ‘œ, μ²˜μŒ 15자λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ΄ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
"bat.y.abcdefghijklm" → "bat.y.abcdefghi"

7단계 μ•„μ΄λ””μ˜ κΈΈμ΄κ°€ 2자 μ΄ν•˜κ°€ μ•„λ‹ˆλ―€λ‘œ λ³€ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
"bat.y.abcdefghi" → "bat.y.abcdefghi"

λ”°λΌμ„œ μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ new_idκ°€ "...!@BaT#*..y.abcdefghijklm"일 λ•Œ, λ„€μ˜€μ˜ ν”„λ‘œκ·Έλž¨μ΄ μΆ”μ²œν•˜λŠ” μƒˆλ‘œμš΄ μ•„μ΄λ””λŠ” "bat.y.abcdefghi" μž…λ‹ˆλ‹€.

 

βœ”οΈ[문제]

μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ 아이디λ₯Ό λ‚˜νƒ€λ‚΄λŠ” new_idκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, "λ„€μ˜€"κ°€ μ„€κ³„ν•œ 7λ‹¨κ³„μ˜ 처리 과정을 거친 ν›„μ˜ μΆ”μ²œ 아이디λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

 

βœ”οΈ[μ œν•œμ‚¬ν•­]

new_idλŠ” κΈΈμ΄ 1 μ΄μƒ 1,000 μ΄ν•˜μΈ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
new_idλŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμž, μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, μˆ«μž, νŠΉμˆ˜λ¬Έμžλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
new_id에 λ‚˜νƒ€λ‚  μˆ˜ μžˆλŠ” νŠΉμˆ˜λ¬ΈμžλŠ” -_.~!@#$%^&*()=+[{]}:?,<>/ λ‘œ ν•œμ •λ©λ‹ˆλ‹€.

 

βœ”οΈ[μž…μΆœλ ₯ 예]

no new_id result
예1 "...!@BaT#*..y.abcdefghijklm" "bat.y.abcdefghi"
예2  "z-+.^." "z--"
예3 "=.=" "aaa"
예4 "123_.def" "123_.def"
예5  "abcdefghijklmn.p" "abcdefghijklmn"


μž…μΆœλ ₯ μ˜ˆμ— λŒ€ν•œ μ„€λͺ…
μž…μΆœλ ₯ μ˜ˆ #1
문제의 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆ #2
7단계λ₯Ό κ±°μΉ˜λŠ” λ™μ•ˆ new_idκ°€ λ³€ν™”ν•˜λŠ” κ³Όμ •μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

1단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
2단계 "z-+.^." → "z-.."
3단계 "z-.." → "z-."
4단계 "z-." → "z-"
5단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
6단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
7단계 "z-" → "z--"

μž…μΆœλ ₯ μ˜ˆ #3
7단계λ₯Ό κ±°μΉ˜λŠ” λ™μ•ˆ new_idκ°€ λ³€ν™”ν•˜λŠ” κ³Όμ •μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

1단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
2단계 "=.=" → "."
3단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
4단계 "." → "" (new_idκ°€ λΉˆ λ¬Έμžμ—΄μ΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.)
5단계 "" → "a"
6단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
7단계 "a" → "aaa"

μž…μΆœλ ₯ μ˜ˆ #4
1λ‹¨κ³„μ—μ„œ 7λ‹¨κ³„κΉŒμ§€ κ±°μΉ˜λŠ” λ™μ•ˆ new_id("123_.def")λŠ” λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ¦‰, new_idκ°€ μ²˜μŒλΆ€ν„° μΉ΄μΉ΄μ˜€μ˜ μ•„이디 κ·œμΉ™μ— λ§žμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆ #5
1단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
2단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
3단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
4단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
5단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
6단계 "abcdefghijklmn.p" → "abcdefghijklmn." → "abcdefghijklmn"
7단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.


 

πŸͺ„풀이 

일반적으둜 λ¬Έμžμ—΄μ„ κ°€κ³΅ν•˜λŠ” λŠ₯λ ₯을 ν…ŒμŠ€νŠΈν•˜λŠ” λ¬Έμ œμ΄λ‹€.

특히 μ •κ·œμ‹μ„ μ“Έ 수 μžˆλŠ”μ§€μ— λŒ€ν•œ ν…ŒμŠ€νŠΈ κ°™λ‹€.

λͺ‡λͺ‡ μ •κ·œμ‹μ€ μ•Œκ³  λͺ‡λͺ‡ μ •κ·œμ‹μ€ λͺ°λΌμ„œ 풀이 이후에 μ •κ·œμ‹μ— λŒ€ν•΄ 첨뢀해 λ‘μ—ˆλ‹€.

νŠΉνžˆλ‚˜ replaceAll()에 λŒ€ν•΄ μ’€ μ•Œμ•„μ•Ό ν’€ 수 μžˆλŠ” 문제라 μƒκ°ν•œλ‹€.

 

 

β—ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€  2 , 22 , 23 번 λŸ°νƒ€μž„μ—λŸ¬

 

βŒν‹€λ¦° 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static String solution(String new_id) {
    String answer = new_id.toLowerCase();
    StringBuilder sb = new StringBuilder();
    answer = answer.replaceAll("[^0-9a-z-_.]""")
        .replaceAll("\\.++"".");
    sb.append(answer);
    if (sb.charAt(0== '.') sb.deleteCharAt(0);
    if (sb.charAt(sb.length() - 1== '.') sb.deleteCharAt(sb.length() - 1);
    if (sb.length() == 0) sb.append('a');
    if (sb.length() >= 16) sb.delete(15, sb.length());
    if (sb.charAt(sb.length() - 1== '.') sb.deleteCharAt(sb.length() - 1);
    if (sb.length() <= 2) {
        char lastChar = sb.charAt(sb.length() - 1);
        for (int i = sb.length(); i < 3; i++) {
            sb.append(lastChar);
        }
    }
    return sb.toString();
}
cs

 

 

λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ‚˜λŠ” μ΄μœ λŠ” λ°”λ‘œ 7ν–‰ 8ν–‰ λ•Œλ¬Έμ΄λ‹€. 5ν–‰κΉŒμ§€μ˜ 가곡을 λ‹€ ν–ˆμ„ λ•Œ answerμ—λŠ” 아무 값도 μ—†λŠ” null값일 수 μžˆλŠ”λ°, 인덱슀λ₯Ό ν™•μΈν•œλ‹€κ³  ν•˜λ‹ˆκΉ λ°”λ‘œ λŸ°νƒ€μž„μ—λŸ¬κ°€ λ‚˜λŠ” 것이닀. 

 

β­• λ§žμ€ 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static String solution(String new_id) {
    String answer = new_id.toLowerCase();
    StringBuilder sb = new StringBuilder();
    answer = answer.replaceAll("[^0-9a-z-_.]""")
        .replaceAll("\\.++"".");
    sb.append(answer);
    if (sb.length() != 0){         
        if (sb.charAt(0== '.') sb.deleteCharAt(0);
    }
    if (sb.length() != 0){
        if (sb.charAt(sb.length() - 1== '.') sb.deleteCharAt(sb.length() - 1);
    }    
    if (sb.length() == 0) sb.append('a');
    if (sb.length() >= 16) sb.delete(15, sb.length());
    if (sb.charAt(sb.length() - 1== '.') sb.deleteCharAt(sb.length() - 1);
    if (sb.length() <= 2) {
        char lastChar = sb.charAt(sb.length() - 1);
        for (int i = sb.length(); i < 3; i++) {
            sb.append(lastChar);
        }
    }
    return sb.toString();
}
cs

 

λ”°λΌμ„œ μŠ€νŠΈλ§λΉŒλ”κ°€ 크기가 0이 μ•„λ‹λ•Œλ§Œ μ‹€μ‹œ ν•˜λ„λ‘ λ°”κΏ”μ£Όλ‹ˆ ν†΅κ³Όν•˜μ˜€λ‹€.

 

 

 

 

 

β—ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€  15 , 20 , 21 , 22 , 25 번 μ‹€νŒ¨

answer = answer.replaceAll("[^0-9a-z-_.]", "").replaceAll("\\.++", ".");

이것 λ˜ν•œ 성곡 ν–ˆμœΌλ‹ˆ 

 

answer = answer.replaceAll("[~!@#$%^&*()=+[{]}:?,<>/]", "").replaceAll("\\.++", ".");

이것 λ˜ν•œ λ‹Ήμ—°νžˆ 성곡할 것이라 μƒκ°ν•˜κ³  μ½”λ“œλ₯Ό λ°”κΏ”μ„œ ν’€μ–΄ λ³΄μ•˜λ‹€.

μ™œλƒν•˜λ©΄ λ¬Έμ œμ—μ„œ μ£Όμ–΄μ§€λŠ” νŠΉμˆ˜λ¬ΈμžλŠ” -_.~!@#$%^&*()=+[{]}:?,<>/ 으둜 μ œν•œ λ˜μ–΄ 있기 λ•Œλ¬Έμ΄λ‹€.

μ „μžμ˜ λ‘œμ§μ€ "[^]" μ¨μ„œ ^ 뒀에 μ˜€λŠ” λ¬Έμžλ“€μ„ "μ œμ™Έν•œ" λͺ¨λ“  λ¬Έμžλ“€μ„ μ§€μš°λŠ” 것이고,

ν›„μžμ˜ λ‘œμ§μ€ 주어진 특수 λ¬Έμžμ—μ„œ μ§€μš°λ©΄ μ•ˆλ˜λŠ” 특수문자 -_. λ₯Ό μ œμ™Έν•˜κ³  "[ ]" 이 λŒ€κ΄„ν˜Έ μ•ˆμ— μžˆλŠ” 애듀을 μ§€μ›ŒλΌ λΌλŠ” 뜻이기 λ•Œλ¬Έμ΄λ‹€. 

ν•˜μ§€λ§Œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ κ³³κ³³μ—μ„œ μ‹€νŒ¨ ν•˜μ˜€λ‹€.

 

βŒν‹€λ¦° 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static String solution(String new_id) {
    String answer = new_id.toLowerCase();
    StringBuilder sb = new StringBuilder();
    answer = answer.replaceAll("[~!@#$%^&*()=+[{]}:?,<>/]""")
        .replaceAll("\\.++"".");
    sb.append(answer);
    if (sb.length() != 0){         
        if (sb.charAt(0== '.') sb.deleteCharAt(0);
    }
    if (sb.length() != 0){
        if (sb.charAt(sb.length() - 1== '.') sb.deleteCharAt(sb.length() - 1);
    }    
    if (sb.length() == 0) sb.append('a');
    if (sb.length() >= 16) sb.delete(15, sb.length());
    if (sb.charAt(sb.length() - 1== '.') sb.deleteCharAt(sb.length() - 1);
    if (sb.length() <= 2) {
        char lastChar = sb.charAt(sb.length() - 1);
        for (int i = sb.length(); i < 3; i++) {
            sb.append(lastChar);
        }
    }
    return sb.toString();
}
cs

 

4ν–‰ λŒ€κ΄„ν˜Έ [ ] λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ‚˜λŠ” 것이닀.

 

λ‹€μŒμ€ 이 λ‘œμ§μ— λŒ€ν•œ μ˜ˆμ™Έ μΌ€μ΄μŠ€ 이닀.

 

"-.~!@#$%&*()=+[{]}:?,<>/.-"

 

이 주어지면 κΈ°λŒ€κ°’μ΄ -.- μ΄μ§€λ§Œ

μ €λŒ€λ‘œ ν’€λ©΄ -.[].- μ΄λ ‡κ²Œ λ‚˜μ˜¨λ‹€.

μ• μ΄ˆμ— μ •κ·œμ‹ ν‘œν˜„μ— λŒ€κ΄„ν˜Έ [] λ₯Ό μ“°κΈ° λ•Œλ¬Έμ— []λ₯Ό μ§€μš°μ§€λ₯Ό λͺ»ν•˜λŠ” 것이닀.

μ €λ ‡κ²Œ μ“°λ©΄ λ‹€μŒκ³Ό 같은 였λ₯˜κ°€ λ‚˜μ˜¨λ‹€.

"Redundant nested character class"λΌλŠ” 였λ₯˜ λ©”μ‹œμ§€λŠ” μ •κ·œ ν‘œν˜„μ‹μ— κ΄€λ ¨λœ λ©”μ‹œμ§€λ‘œ, μ •κ·œ ν‘œν˜„μ‹μ„ μž‘μ„±ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜ 쀑 ν•˜λ‚˜μ΄λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ—­μŠ¬λž˜μ‹œλ₯Ό μ¨μ„œ \\ μ΄μŠ€μΌ€μ΄ν”„ μ‹œμΌœμ€˜μ•Ό ν•œλ‹€.

 

 

β­•λ§žμ€ 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static String solution(String new_id) {
    String answer = new_id.toLowerCase();
    StringBuilder sb = new StringBuilder();
    answer = answer.replaceAll("[~!@#$%^&*()=+\\[{\\]}:?,<>/]""")
        .replaceAll("\\.++"".");
    sb.append(answer);
    if (sb.length() != 0){         
        if (sb.charAt(0== '.') sb.deleteCharAt(0);
    }
    if (sb.length() != 0){
        if (sb.charAt(sb.length() - 1== '.') sb.deleteCharAt(sb.length() - 1);
    }    
    if (sb.length() == 0) sb.append('a');
    if (sb.length() >= 16) sb.delete(15, sb.length());
    if (sb.charAt(sb.length() - 1== '.') sb.deleteCharAt(sb.length() - 1);
    if (sb.length() <= 2) {
        char lastChar = sb.charAt(sb.length() - 1);
        for (int i = sb.length(); i < 3; i++) {
            sb.append(lastChar);
        }
    }
    return sb.toString();
}
cs

 

 

πŸ’― μ •κ·œμ‹μ„ μ‚¬μš©ν•œ κΉ”λ”ν•œ 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static String solution(String new_id) {
    String answer = new_id.toLowerCase(); // 1단계
 
    answer = answer.replaceAll("[^-_.a-z0-9]"""); // 2단계
    answer = answer.replaceAll("[.]{2,}""."); // 3단계     
    answer = answer.replaceAll("^[.]|[.]$""");    // 4단계
    if (answer.equals("")) {    // 5단계
        answer += "a";
    }
 
    if (answer.length() >= 16) {     // 6단계
        answer = answer.substring(015);
        answer = answer.replaceAll("[.]$","");
    }
 
    if (answer.length() <= 2) {  // 7단계
        while (answer.length() < 3) {
            answer += answer.charAt(answer.length()-1);
        }
    }
    return answer;
}
cs

 

πŸ’‘λ¬Έμžμ—΄ μ •κ·œμ‹

  • .x: μž„μ˜μ˜λ¬Έμž + x
    ex) a.c : abc, a0c ,,
    ex) a..c : abbc, a00c ,,
  • x* : x의 0번 이상 반볡
  • x+ : x의 1번 이상 반볡
  • ^x : λ¬Έμžμ—΄μ΄ x둜 μ‹œμž‘
  • x$ : λ¬Έμžμ—΄μ΄ x둜 끝남
  • x? : xκ°€ μ‘΄μž¬ν• μˆ˜λ„, ν•˜μ§€ μ•Šμ„ μˆ˜λ„ 있음
    ex) ab?c : ac, abc λͺ¨λ‘ κ°€λŠ₯
  • x|y : x λ˜λŠ” y
    ex) (x|y)z : xy λ˜λŠ” yz λͺ¨λ‘ κ°€λŠ₯
  • x{n} : x의 n번 반볡
  • x{m,n} : x의 m번 이상 n번 μ΄ν•˜ 반볡
  • x{n,} : x의 n번 이상 반볡
  • [xy] : x λ˜λŠ” y ν•œ 문자
  • [x-z] : x~z λ²”μœ„ λ‚΄μ˜ ν•œ 문자
  • [^xy] : x λ˜λŠ” yλ₯Ό μ œμ™Έν•œ ν•œ 문자
    ex) [^yz] : a, b, c, ,,, w, x 쀑 ν•œ 문자λ₯Ό 의미

λŒ€ν‘œμ μœΌλ‘œ [0-9] λŒ€μ‹ μ— \dλ₯Ό, [a-zA-Z0-9_] λŒ€μ‹ μ— \wλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

^
λ¬Έμžμ—΄μ˜ μ‹œμž‘
$
λ¬Έμžμ—΄μ˜ μ’…λ£Œ
.
μž„μ˜μ˜ ν•œ 문자(ν•„μˆ˜μž…λ ₯, 문자의 μ’…λ₯˜ 가리지 μ•ŠμŒ) λ‹¨, \ λŠ” 넣을 수 μ—†μŒ
*
μ•ž λ¬Έμžκ°€ 없을 μˆ˜λ„ λ¬΄ν•œμ • λ§Žμ„ μˆ˜λ„ 있음
+
μ•ž λ¬Έμžκ°€ ν•˜λ‚˜ 이상
?
μ•ž λ¬Έμžκ°€ μ—†κ±°λ‚˜ ν•˜λ‚˜μžˆμŒ
[]
문자의 μ§‘ν•©μ΄λ‚˜ λ²”μœ„λ₯Ό λ‚˜νƒ€λ‚΄λ©° 두 문자 μ‚¬μ΄λŠ” - 기호둜 λ²”μœ„λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
{}
횟수 λ˜λŠ” λ²”μœ„λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
()
μ†Œκ΄„ν˜Έ μ•ˆμ˜ 문자λ₯Ό ν•˜λ‚˜μ˜ 문자둜 인식
|
νŒ¨ν„΄ μ•ˆμ—μ„œ or 연산을 μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©
\s
곡백 문자
\S
곡백 λ¬Έμžκ°€ μ•„λ‹Œ λ‚˜λ¨Έμ§€ 문자
\w
μ•ŒνŒŒλ²³μ΄λ‚˜ 숫자
\W
μ•ŒνŒŒλ²³μ΄λ‚˜ 숫자λ₯Ό μ œμ™Έν•œ 문자
\d
숫자 [0-9]와 동일
\D
숫자λ₯Ό μ œμ™Έν•œ λͺ¨λ“  문자
\
μ •κ·œν‘œν˜„μ‹ μ—­μŠ¬λž˜μ‹œ(\)λŠ” ν™•μž₯ 문자
μ—­μŠ¬λž˜μ‹œ λ‹€μŒμ— 일반 λ¬Έμžκ°€ 였면 특수문자둜 μ·¨κΈ‰ν•˜κ³ , μ—­μŠ¬λž˜μ‹œ λ‹€μŒμ— νŠΉμˆ˜λ¬Έμžκ°€ 였면 κ·Έ 문자 자체λ₯Ό 의미

 

[]
or : λŒ€κ΄„ν˜Έ μ•ˆμ˜ λͺ¨λ“  문자
[^]
not : λŒ€κ΄„ν˜Έ μ•ˆμ˜ 문자 μ™Έμ˜ λͺ¨λ“  문자
^[]
λŒ€κ΄„ν˜Έ μ•ˆμ˜ 문자둜 μ‹œμž‘ν•˜λŠ” λ¬Έμžμ—΄
[]$
λŒ€κ΄„ν˜Έ μ•ˆμ˜ 문자둜 λλ‚˜λŠ” λ¬Έμžμ—΄

ex)

숫자λ₯Ό μ œμ™Έν•œ λͺ¨λ“  문자 제거 : str.replaceAll("[^0-9]","");

숫자 제거 : str.replaceAll("[0-9]","");

λŒ“κΈ€