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

영점·2022년 4월 24일
0

프로그래머스

목록 보기
1/1

역시 경험을 해보는게 최고인 것 같습니다,..🥲
여태까지 연습문제 lv1을 풀다가 처음으로 카카오 lv1 문제를 풀어보았습니다.
확실히 문제도 뭔가 다르긴 하더라고요.. 대신 lv1이라 그런가 지문이 직설적인? 느낌이 강했습니다.

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

문제를 읽어보니 요점은 이 부분인 것 같았습니다.

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이 될 때까지 반복해서 끝에 붙입니다.

저같은 경우, 각 단계별로 코드를 작성하였습니다.
정답을 맞추고 보니 단계별로 하신분들도 있고, 합칠 수 있는 부분은 합치신분도 계시더라고요.

import Foundation

func solution(_ new_id:String) -> String {
    
    var own = new_id
    
    own = own.lowercased()

    own = own.filter{ $0.isLetter || $0.isNumber || $0 == "-" || $0 == "_" || $0 == "."}
    
    while own.contains("..") {
        own = own.replacingOccurrences(of: "..", with: ".")
    }
    
    if own.hasPrefix(".") {
        own.removeFirst()
    }
    
    if own.hasSuffix(".") {
        own.removeLast()
    }
    
    if own.isEmpty {
        own = "a"
    }
  
    if own.count >= 16 {
        let ranges = own.index(own.startIndex, offsetBy: 15)..<own.endIndex
        own.removeSubrange(ranges)
        
        if own.hasSuffix(".") {
            own.removeLast()
        }
    }
    
    if own.count <= 2 {
        while own.count != 3 {
            own += String(own.last!)
        }
    }
    
    return own
}

작성하기 전에 new_id 값을 받는 변수를 하나 만들어주었습니다. ( own )
1단계는 lowercased()를 이용하여 대문자를 모두 소문자로 만들었습니다.

own = own.lowercased()

2단계는 처음에 생각했을때 filter로 거르면 되겠다!라고 생각은 했는데 이후에 작성을 어떻게 해야할지 감이 안잡혀서 컴포넌트, 정규식등 별의별 친구를 다찾아본 것 같네요..😅
해당부분은 구글링의 힘을 빌려서 작성할 수 있었습니다.

https://jercy.tistory.com/10

own = own.filter{ $0.isLetter || $0.isNumber || $0 == "-" || $0 == "_" || $0 == "."}

3단계는 ..인 부분을 어떻게 솎아내는지와 어떻게 치환하는지 문제였습니다.
검색해보니 contains()를 이용하여 솎아내고 replacingOccurrences를 이용하여 ..을 .으로 변경할 수 있다고 하여 사용하였습니다. ( 확실히 코드가 짧네요 😀 )

https://ios-development.tistory.com/373

while own.contains("..") {
        own = own.replacingOccurrences(of: "..", with: ".")
}

4단계는 contains()를 찾다가 발견하였는데, hasPrefix, hasSuffix를 이용하여 간편하게
처음과 끝에 있는 .을 제거할 수 있어보여 사용하였습니다. 😀

https://velog.io/@un1945/Swift-hasPrefix-hasSuffix-contains

if own.hasPrefix(".") {
    own.removeFirst()
}
    
if own.hasSuffix(".") {
	own.removeLast()
}

5단계는 간단하게 isEmpty로 문자열이 비었는지 판단하고 비었으면 a를 넣게끔 하였습니다.

if own.isEmpty {
    own = "a"
}

6단계는 count로 문자갯수를 판단하였고 "첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다." 이 문구가 감이 안잡혔는데 검색하여 해당자료를 토대로 작성하였습니다.
index의 처음부분부터 15번째까지 살리고 나머지부분을 removeSubrange로 제거하였습니다.

https://jinnify.tistory.com/52

if own.count >= 16 {
    let ranges = own.index(own.startIndex, offsetBy: 15)..<own.endIndex
    own.removeSubrange(ranges)
        
    if own.hasSuffix(".") {
        own.removeLast()
    }
}

7단계는 지문 그대로.. 작성하였습니다. 😀

if own.count <= 2 {
    while own.count != 3 {
        own += String(own.last!)
    }
}
profile
일단 배운내용은 적어두기

0개의 댓글