Hello Ocean! 🌼

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/C++] μ‹ κ·œ 아이디 μΆ”μ²œ λ³Έλ¬Έ

Algorithm

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/C++] μ‹ κ·œ 아이디 μΆ”μ²œ

bba_dda 2021. 2. 8. 11:44
λ°˜μ‘ν˜•

문제 μ„€λͺ…

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

  • μ•„μ΄λ””μ˜ κΈΈμ΄λŠ” 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κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, λ„€μ˜€κ°€ μ„€κ³„ν•œ 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

new_id = "...!@BaT#*..y.abcdefghijklm" μΌ λ•Œ, μœ„μ˜ 단계λ₯Ό μ μš©ν•˜λ©΄

1단계  "...!@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단계  λ³€ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

6단계  "bat.y.abcdefghijklm"  "bat.y.abcdefghi"

7단계  "bat.y.abcdefghi"  "bat.y.abcdefghi"

 

μž…μΆœλ ₯ 예 #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
new_idκ°€ μ²˜μŒλΆ€ν„° 카카였의 아이디 κ·œμΉ™μ— λ§žμŠ΅λ‹ˆλ‹€.

 

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

풀이

이 λ¬Έμ œλŠ” νŠΉλ³„ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄λ‚˜, μ‹œκ°„λ³΅μž‘λ„λ₯Ό 쀄이기 μœ„ν•œ 큰 λ…Έλ ₯ 없이

μ •λ§λ‘œ λ¬Έμ œκ°€ μ‹œν‚€λŠ”λŒ€λ‘œ 주어진 7단계λ₯Ό μˆ˜ν–‰ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€. 

 

ν•˜λ‚˜ λ‹€λ₯Έμ μ€, 

4λ‹¨κ³„κΉŒμ§€ 거친 후에 new_id = "" (빈 λ¬Έμžμ—΄)일 λ•Œ, 

5단계 (빈 λ¬Έμžμ—΄μ„ a둜 λ°”κΎΈκΈ°) -> 7단계 (2κΈ€μž μ΄ν•˜μ΄λ©΄ λ§ˆμ§€λ§‰λ¬Έμž λ°˜λ³΅ν•΄μ„œ 3κΈ€μž λ§Œλ“€κΈ°) 

μ΄λ ‡κ²Œ 두 단계λ₯Ό κ±°μ³μ„œ  returnλ˜μ–΄μ•Ό ν•˜λŠ”λ°, 5λ‹¨κ³„μ—μ„œ 두 단계λ₯Ό ν•œ λ²ˆμ— ν•΄μ„œ 

빈 λ¬Έμžμ—΄μΌ 경우 "aaa"λ₯Ό returnν•˜κ²Œ ν–ˆλ‹€. 

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool isValidChar(char c){
    bool flag = false;
    if (c>='a' && c<='z')
        flag = true;
    if (c>='0' && c<='9')
        flag = true;
    if (c == '-' || c == '_' || c =='.')
        flag = true;
    return flag;
}
string solution(string new_id) {
    // 1 단계 : λŒ€ -> μ†Œλ¬Έμž 
    transform(new_id.begin(), new_id.end(), new_id.begin(), ::tolower);
    
    vector<char> valid_set = {'-','_','.'};
    string temp="";
    int dot_start;
    // 2 단계 : μ†Œλ¬Έμž, 숫자, -, _, . μ œμ™Έν•œ λͺ¨λ“  문자 제거 
    for (int i=0; i<new_id.size();i++){
        if (isValidChar(new_id[i])){
            // 3 단계 : . μ—¬λŸ¬κ°œ -> . ν•œκ°œ 
            if (temp.back()=='.' && new_id[i]=='.')
                continue;
            temp.push_back(new_id[i]);    
        }      
    }
    // 4 단계 : λ§¨μ•ž , 맨끝 . 제거
    if (temp.front()=='.')
        temp = temp.substr(1,temp.size()-1);
    if (temp.back()=='.')
        temp.pop_back();
   
    // 5 단계 : 빈 λ¬Έμžμ—΄μ΄λ©΄ "a"둜 λ°”κΎΈκΈ° + 7단계 적용
    if (temp.empty())
        temp = "aaa";
    
    // 6 단계 : 16κΈ€μž 이상이면 
    if (temp.size() >= 16)
        temp = temp.substr(0,15);
    if (temp.back()=='.')
        temp.pop_back();
    
    // 7 단계 : 2κΈ€μž μ΄ν•˜μ΄λ©΄
    if (temp.size() <= 2){
        for (int i=0;i<=3-temp.size();i++){
            temp.push_back(temp.back());
        }
            
    }
    string answer = "";
    return temp;
}

κ²°κ³Ό

λ°˜μ‘ν˜•