프로그래머스- 38

김정현·2023년 5월 19일
0

프로그래머스

목록 보기
38/46

1.

옛날에 배웠던 유니코드가 떠올라서 인터넷에서 꾸역꾸역 검색해서 작성했는데..

func solution(_ s:String, _ n:Int) -> String {
    var S = Array(s) 
    var N = UInt32(n)
    for i in 0...S.count-1{
        if S[i] != " "{
    if S.indices.contains(i) {
        let unicodeScalar = UnicodeScalar(String(S[i]))!
        let shiftedScalar = UnicodeScalar(unicodeScalar.value + N)!
        S[i] = Character(shiftedScalar)
        }
        }
    }
    return String(S)
}

z 에서 a가 아니라 다른 수를 넘어가는 것 까지 처리하는게 너무 까다로워서 이 방법이 간단한 방법은 아닌것 같다하는 생각이 들었다. 여러가지 문제점이 상당히 많이 보여서 폐기했다..
도저히 답을 구할수없을거같아 답을 보았다.

func solution(_ s:String, _ n:Int) -> String {
    return s.utf8.map {
        var code = Int($0)
        switch code {
            case 65...90:
                code = (code + n - 65) % 26 + 65
            case 97...122:
                code = (code + n - 97) % 26 + 97
            default:
                break
        }
        return String(UnicodeScalar(code)!)
    }.joined()
}

유니코드를 활용했는데, 소문자일경우 대문자일경우 를 케이스로 나눴다. 그뒤에는 마치 공식처럼 대입한 느낌이다. 어려운 문제는 수학적으로도 좀 접근이 필요한것같다.
그래도 첫 접근이 나쁘지 않았다는 점에서 위안을 받았다.

2.

for구문으로 내부 함수를 돌면서 판단을 내리게끔 하면 될 것 같다.

func solution(_ s:String) -> Bool {
    var S = Array(s)
    for i in 0...S.count-1{
        S[i].isNumber
        if S[i].isNumber == false{
            return false
        }
    }
    return true
}

이렇게 했는데 정답이 틀린게 조금 있었다. 이유를 찾고 찾아 질문게시판에 가보니 문자열의 길이가 4혹은 6인것을 우리가 찾아서 걸러줘야했다.. 문제를 잘읽자..

func solution(_ s: String) -> Bool {
    let S = Array(s)
    if S.count == 4 || S.count == 6 {
    for i in 0...S.count-1 {
        if !S[i].isNumber {
            return false
        }
    }
    return true
    } else {
        return false
    }
}

그래도 이 과정에서 or 을 ||로 표현한다는 것을 알게 되었다.

func solution(_ s:String) -> Bool {
    return (Int(s) != nil && (s.count == 4 || s.count == 6)) ? true : false
}

다른사람은 이렇게 간단하게 만약 Int로 표현할수 없다면 nil로 반환한다는 것을 이용해서 했다. 참신했다.

(Level 2) 3.

우선 Seperated를 사용하여 공백별로 분리하여 배열을 형성한 뒤, for문을 사용하여 안을 순회하며 각 글자에 첫 글자를 대문자로 변형시켜야할것같다.

func solution(_ s:String) -> String {
    var S = s.components(separatedBy: " ")
    var result = ""
    for i in S {
        if let firstchar = i.first {
            result += String(firstchar).uppercased() + i.dropFirst().lowercased()
        }
        result += " "
    }
    result.removeLast()
    return result
}

중간에 if let으로 바인딩 해야한다는것을 알게되었고, 중간중간 빈칸을 넣거나 지우는 디테일도 많이 수정하였다. 그래도 다행인 점은 코딩자체에 오류는 발생하지 않아서 출력결과를 확인해가며 수정하는 것이 가능했다는 것이다.
다른사람의 풀이도 비슷비슷했다.

반드시 존재할 수 없고 그럼에도 존재한다는 가정을 하고싶다면 옵셔널 바인딩을 반드시 이용하도록하자 이것만 진작에 알았다면 더 빨리 해결할 수 있었을거 같다.

0개의 댓글