코딩테스트

[Swift 알고리즘] 프로그래머스(Lv.1) - 신규 아이디 추천

유정주 2022. 2. 21. 21:53
반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 프로그래머스 - 신규 아이디 추천 문제를 풀었습니다.

 


목차


    Github

     

    GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

    스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

    github.com

     

    문제 링크

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

     

    코딩테스트 연습 - 신규 아이디 추천

    카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

    programmers.co.kr

     


    풀이

    문자열을 다루는 문제입니다.

    문제는 간단한 편으로 step 1 ~ step 7을 차근차근 해결하시면 됩니다.

     

    배운 점

    이번 문제를 풀면서 정규식에 대해 자세히 알 수 있었습니다.

    아직 복잡한 것은 능숙하게 사용하지 못하지만 어떤 의미인지, 어떤 식으로 써야 할지 감을 잡았습니다.

    문자열 문제가 자주 출시되어 정규식을 더 연습해야겠습니다.

     

    이번 문제의 step 2는 정규식을 이용한 방법과 isLetter, isNumber 등을 이용한 방법으로 나눠서 풀어보았습니다.

    Swift에서 문자열을 다루는 것은 아직 낯설다는 느낌이 드네요.

     

    또한 replacingOccurrences()에 대해서도 하나 알게 된 것이 있습니다.

    바로 단 한 번만 교체가 된다는 것입니다.

    따라서 이번 문제의 step 4에서 replacingOccurrences()를 쓰려면 반복문을 통해 ".."가 모두 사라질 때까지 반복해줘야 합니다.

     

    혹시 4, 14, 16, 17, 20, 21, 25에서 실패를 한다면 "a...a" 또는 "......a......a......a....."를 넣어서 테스트해보세요.

    위와 같은 이유로 제대로 변환이 되지 않을 것입니다.

     


    전체 코드

    import Foundation
    
    func solution(_ new_id:String) -> String {
        var result = ""
        
        //step 1
        let lowercase = new_id.lowercased()
        
        //step 2
    //    for letter in lowercase {
    //        if letter.isLetter || letter.isNumber || letter == "-" || letter == "_" || letter == "." {
    //            result.append(letter)
    //        }
    //    }
        result = lowercase.replacingOccurrences(of: "[^a-z0-9-_.]", with: "", options: .regularExpression)
        
        // step 3
        while result.contains("..") {
            result = result.replacingOccurrences(of: "..", with: ".")
        }
        
        // step 4
        result = result.trimmingCharacters(in: ["."])
        
        //step 5
        if result.isEmpty {
            result = "a"
        }
        
        //step 6
        if result.count >= 16 {
            result = String(result.prefix(15))
            
            while result.last == "." {
                result.removeLast()
            }
        }
        
        //step 7
        while result.count <= 2 {
            if let last = result.last {
                result.append(last)
            }
        }
        
        return result
    }
    
    let new_id = "...!@BaT#*..y.abcdefghijklm" //"a...a"//"......a......a......a....."
    print(solution(new_id))

    아직은 초보 개발자입니다.

    더 효율적인 코드 훈수 환영합니다!

    공감 댓글 부탁드립니다.

     

    반응형