티스토리 뷰

반응형

 

 

 

 

프로그래머스 카카오공채문제, 신규아이디 추천 문제 링크 ▼

 

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

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

programmers.co.kr

신규 아이디 추천 문제는 특정 ID 문자열이 주어졌을때 이를 몇단계의 문자열 규칙을 적용, 수정해서 추천할 신규 아이디 문자열을 반환하는 문자열 처리 문제입니다. 주어진 ID 문자열에 대해서 어떤 필터링 단계를 거치는지 보도록 하겠습니다. 

 

 

 

 

주어진 ID를 체크하는 과정은 위와 같이 총 1 ~ 7 단계입니다. 하나의 조건도 빠짐없이 꼼꼼히 읽고, 설명 그대로 구현해주면 되는 문제입니다.

 

위의 설명을 토대로 swift언어를 사용해서 문제를 풀어보도록 하겠습니다. 

 

 

 

 


프로그래머스 카카오공채문제, 신규아이디추천 swift 풀이
Character Extension 멤버변수 구현

solution 함수를 구현하기 전에, 몇개의 extension 변수, 메서드를 정의하겠습니다. 위의 isValid 변수는 Character 문자타입에서 접근 가능한 extension 변수입니다.

 

Character extension 내의 isValid는 2단계의 필터조건을 확인해서 그 결과를 반환해줍니다. 2단계 조건에 따라 알파벳 소문자 / 숫자 / "-", "_", "."일 경우에는 유효하므로 true, 그 외에는 false를 반환해서 유효하지 않은 문자는 제거해주도록 할 수 있습니다. 

 

 

 


String Extension 메서드 구현

String extension도 하나 추가해줍니다. "." dot이 연속으로 있는 경우, "." 하나만 적용하도록 하는 중복 필터링 메서드입니다.

본 메서드는 String 타입을 통해 접근하는데, String 타입 원본 자체가 변경되는 메서드로 함수 선언 시에 mutating func 키워드를 붙여줍니다.

 

이제 solution 함수를 채워보도록 하겠습니다.

 

 

 


카카오 신규 아이디 규칙 1 ~ 3단계

27행) 1, 2단계의 필터링 과정을 모두 거친 후 idString에 저장하고 있습니다.

- 1단계 : lowercased() 메서드를 통해서 모두 소문자로 변경시켜 주었구요.

- 2단계 : filter { $0.isValid } 를 통해 유효하지 않은 문자가 제거 된 문자열을 반환해서 idString에 저장했습니다. 

 

28행) 3단계의 연속 "." 필터링 과정입니다.

- 3단계 : 앞서 String extension에서 구현한 mutating메서드를 통해서 중복 dot을 필터링한 문자열을 원본 문자열, idString에 갱신해줍니다. 

 

 

 

 


카카오 신규 아이디 규칙 4단계

30 ~ 36행) 4단계의 필터링 단계입니다.

- 4단계 : 양 끝에 "."이 있다면 지워주는데요. "."을 지웠는데 또 끝에 "."이 있다면 계속 지워줍니다. 먼저 좌측 -> 우측 순으로 지워봤습니다. String 또한 일반 배열과 같이 removeFirst, removeLast 사용이 가능합니다. 다만 removeFirst()는 시간복잡도가 O(N)이라는 점 인지하고 문제 푸시면 더 좋을 것 같습니다. 

 

 

 


카카오 신규 아이디 규칙 5 ~ 6단계

38 ~ 40행) 5단계 필터링 단계입니다. 

- 5단계 : idString이 비어있다면, "a"를 넣어줍니다.

String의 isEmpty 시간복잡도는 상수시간 복잡도 입니다.

 

42 ~ 47행) 6단계 필터링 단계입니다.

- 6단계 : idString길이가 16 이상 일 경우, 앞부터 15자리를 잘라 줍니다. 이후 만약 끝에 "."이 있으면 "."이 아닐때까지 끝을 제거해줍니다.

Array의 count 시간복잡도가 상수시간인 반면, String의 count시간 복잡도는 O(N)입니다.

 

 

 


카카오 신규 아이디 규칙 7단계

드디어 마지막 7단계 필터링 과정입니다. 

- 7단계 : idString의 길이가 2 이하면 현재 문자열의 마지막 문자를 길이가 3이 될때까지 끝에 계속 붙여줍니다. 

 

 

이렇게 1 ~ 7 단계의 과정을 거쳐서 추천할 신규아이디를 생성할 수 있었습니다.

지금까지 카카오공채 1단계 난이도문제, 신규 아이디 추천 문제를 풀어봤습니다. 작성한 swift 코드를 작성한 뒤 제출 결과는 아래와 같습니다.

 

✓ id문자열을 String타입 그대로 처리한 위의 코드와 달리 id 문자열을 Array로 변환해서 푼 전체코드도 추가로 공유드립니다.

 

 

 


 

 

 

 

 


신규 아이디 추천 swift언어 풀이 전체 코드

import Foundation

extension Character {
    var isValid: Bool {
        let asciiVal = self.asciiValue!
        if asciiVal >= 97 && asciiVal <= 122
        || asciiVal >= 48 && asciiVal <= 57
        || self == "-" || self == "_" || self == "." { return true }
        return false
    }
}

extension Array where Element == Character {
    mutating func removeRepeatingDot() {
        var newArray: [Character] = []
        var isPrevDot: Bool = false
        self.forEach { char in
            if isPrevDot && char == "." { return }
            else { newArray.append(char) }
            isPrevDot = char == "." ? true : false
        }
        self = newArray
    }
}

func solution(_ new_id: String) -> String {
    var first = new_id.lowercased()
    var idArray = Array(first).filter { $0.isValid }
    idArray.removeRepeatingDot()

    while !idArray.isEmpty && idArray.first! == "." {
        idArray.removeFirst()
    }

    while !idArray.isEmpty && idArray.last! == "." {
        idArray.removeLast()
    }

    if idArray.isEmpty {
        idArray = ["a"]
    }

    if idArray.count >= 16 {
        idArray = Array(idArray[..<15])
        while idArray.last! == "." {
            idArray.removeLast()
        }
    }

    if idArray.count <= 2 {
        let lastChar = idArray.last!
        while idArray.count < 3 {
            idArray.append(lastChar)
        }
    }

    return String(idArray)
}

 

 

 

 

 
반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함