[프로그래머스 LV1] 신규 아이디 추천

Junyoung Park·2022년 8월 15일
0

코딩테스트

목록 보기
564/631
post-thumbnail

1. 문제 설명

신규 아이디 추천

2. 문제 분석

문자열을 조건에 따라 필터링하는 게 문제 풀이의 관건. 다소 까다로운 스위프트 문자열은 인덱스를 통해 접근하는데, 나 같은 경우 문자열 배열로 전환해서 대부분 해결한다. 물론 캐릭터 자체가 시간적인 측면에서 보다 효율적이긴 한데, 시간 초과가 나지 않는다면 처음에 시도한 문자열 배열로 접근하고 있다.

3. 나의 풀이

import Foundation

func solution(_ new_id:String) -> String {
    let newId = makeNewId(new_id)
    return newId
}

func makeNewId(_ id: String) -> String {
    var id = id.lowercased()
    var tmp = ""
    for letter in id {
        if letter.isLetter || letter.isNumber || letter == "-" || letter == "_" || letter == "." {
            tmp += String(letter)
        }
    }
    id = tmp
    var idArray = Array(id).map{String($0)}
    var tmpIdx = -2
    var dotIndices = [Int]()
    for idx in 0..<idArray.count {
        let letter = idArray[idx]
        if letter == "." {
            if idx - tmpIdx == 1 {
                dotIndices.append(idx)
            }
            tmpIdx = idx
        }
    }
    tmpIdx = 0
    for idx in dotIndices {
        idArray.remove(at: idx - tmpIdx)
        tmpIdx += 1
    }
    if let first = idArray.first, first == "." {
        idArray.removeFirst()
    }
    if let last = idArray.last, last == "." {
        idArray.removeLast()
    }
    if idArray.isEmpty {
        idArray.append("a")
    }
    if idArray.count >= 16 {
        idArray = Array(idArray[0..<15])
    }
    if let last = idArray.last, last == "." {
        idArray.removeLast()
    }
    if idArray.count <= 2 {
        let lastString = idArray.last!
        while idArray.count != 3 {
            idArray.append(lastString)
        }
    }
    let newId = idArray.joined()
    return newId
}
profile
JUST DO IT

0개의 댓글