백준, 프로그래머스

[프로그래머스] swift 코딩 기초 트레이닝(0레벨) 5회차

퐁스팡스 2024. 5. 27. 22:16

 

✅1. 9로 나눈 나머지

https://school.programmers.co.kr/learn/courses/30/lessons/181914

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ number:String) -> Int {
    var result = 0
    result = number.reduce(0) {$0 + Int(String($1))! }  
    return result % 9
}

reduce사용해서 간단하게 해결하기! 문자열의 요소를 int로 변환하여 모두 더해준 뒤 9로 나누기

 

✅2. 문자열 여러 번 뒤집기

https://school.programmers.co.kr/learn/courses/30/lessons/181913

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ my_string:String, _ queries:[[Int]]) -> String {
    var arr = my_string.map {String($0)}
    queries.forEach { query in
        var reverseArr = Array(arr[query[0]...query[1]].reversed())
        arr.replaceSubrange(query[0]...query[1], with: reverseArr)
    }
    return arr.joined()
}

 

forEach, reversed, replaceSubrange를 조합하여 풀었다.

reversed와 reverse의 차이점을 몰랐는데 확인을 해보니

reversed : 원본을 변경하지 않고 반전된 컬렉션을 반환함

reverse : 원본을 변경하고 컬렉션을 반환하지 않음

 

🏆 모범 풀이

func solution(_ my_string:String, _ queries:[[Int]]) -> String {
    var myString = my_string.map { String($0) }
    queries.forEach { q in
        myString[q[0]...q[1]].reverse()
    }
    return myString.joined()
}

reverse만 사용하여 더욱 간결하게 풀 수 있는 문제였다.

 

✅3. 배열 만들기 5

https://school.programmers.co.kr/learn/courses/30/lessons/181912

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ intStrs:[String], _ k:Int, _ s:Int, _ l:Int) -> [Int] {
    var result : [Int] = []
    
    intStrs.forEach { intStr in
        var arr = intStr.map{ String($0)}
        let value = Int(arr[s..<s+l].joined())!
        
        if( value > k){
            result.append(value)
        }
    }
    return result
}

문자열을 문자열 배열로 [String] 변환하여 풀었다.

 

🏆 모범 풀이

func solution(_ intStrs:[String], _ k:Int, _ s:Int, _ l:Int) -> [Int] {
    return intStrs.map {
        let startIdx = $0.index($0.startIndex, offsetBy: s)
        let endIdx = $0.index(startIdx, offsetBy: l)
        return Int(String($0[startIdx..<endIdx]))!
    }.filter { $0 > k }
}

String.index를 구해서 index를 활용한 이 방법이 정석인 거 같다!

 

✅ 4. 부분 문자열 이어 붙여 문자열 만들기

https://school.programmers.co.kr/learn/courses/30/lessons/181911

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ my_strings:[String], _ parts:[[Int]]) -> String {
    return zip(my_strings, parts).reduce("") { result, tuple in
        let (str, part) = tuple
        var arr = str.map {String($0)}
        return result + arr[part[0]...part[1]].joined()
    }
}

비슷한 문제를 이전에는 for문을 이용하여 풀었기 때문에 이번에는 zip과 reduce를 사용하여 풀어보았다.

이제는 원하는 값이 단일 변수면 reduce, 배열이면 map을 자동적으로 떠올리는 수준이 되었다.

 

✅ 5. 문자열의 뒤에 n글자

https://school.programmers.co.kr/learn/courses/30/lessons/181910

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ my_string:String, _ n:Int) -> String {
    let startIndex = my_string.index(my_string.endIndex, offsetBy: -n)
    return String(my_string[startIndex..<my_string.endIndex])
}

index 함수를 사용하여 마지막 인덱스에서 -n까지 떨어진 범위에 char를 가져와 String으로 변환하여 반환해 주었다.

여기서 주의할 점은 endIndex를 사용할 때인데,

이유를 알 수 없지만, endIndex는 문자열의 마지막 index + 1 값을 받아온다.

 

✅ 6. 접미사 배열

https://school.programmers.co.kr/learn/courses/30/lessons/181909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ my_string:String) -> [String] {
    var arr : [String] = []
    for i in 1...my_string.count{
        let startIndex = my_string.index(my_string.endIndex, offsetBy: -i)
        arr.append(String(my_string[startIndex..<my_string.endIndex]))
    }
    arr.sort()
    return arr
}

for문과 index 함수를 사용하여 맨 끝에서 -i만큼 떨어짐 단어들을 배열로 담아 해결하였다.

 

🏆 모범 풀이

func solution(_ myString: String) -> [String] { myString.indices.map { String(myString[$0...]) }.sorted() }

생각보다 더 쉬운 문제였는데 indices를 통해 배열의 모든 유효한 인덱스를 가져와서 i...(마지막) 범위의 값을 가져오면 더욱 깔끔하게 해결이 되는 문제였다..!

 

✅ 7. 접미사인지 확인하기

https://school.programmers.co.kr/learn/courses/30/lessons/181908

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ my_string:String, _ is_suffix:String) -> Int {
    var suffixArr : [String] = []
    suffixArr = my_string.indices.map{String(my_string[$0...])}
    return suffixArr.contains(is_suffix) ? 1 : 0
}

indicesmap을 사용하여 모든 접미사를 배열로 담은 다음 contains를 사용하여 요소가 존재하는지 판단하여 풀어냈다.

하지만 모범 풀이를 보니 모든 접미사를 굳이 구할 필요가 없었다.

 

🏆 모범 풀이

func solution(_ myString: String, _ isSuffix: String) -> Int { myString.hasSuffix(isSuffix) ? 1 : 0 }

hasSuffix라는 문자열에 접미사가 존재하는지 판단해 주는 함수가 이미 있었다. ㅎ

 

func solution(_ my_string:String, _ is_suffix:String) -> Int {
    return my_string.suffix(is_suffix.count) == is_suffix ? 1 : 0
}

또한, 모든 접미사를 알아내지 않더라도

주어진 문자열의 카운트를 suffix함수에 인자로 넣었을 때도 접미사인지 판단할 수 있었다.

 

✅ 8. 문자열의 앞의 n 글자

https://school.programmers.co.kr/learn/courses/30/lessons/181907

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ my_string:String, _ n:Int) -> String {
    let index = my_string.index(my_string.startIndex, offsetBy: n)
    return my_string.substring(to: index)
}

index함수를 사용하여 n에 해당하는 String.Index 값을 구하고 substring으로 범위 내의 문자열을 받아와서 해결해였다.

 

🏆 모범 풀이

func solution(_ my_string:String, _ n:Int) -> String {
    return String(my_string.prefix(n))
}

모범 풀이를 보니 prefix라는 시작지점부터 n인덱스까지 문자열을 가져오는 함수가 있었다.ㅋㅋ

(prefix라는 단어 자체가 접두사라는 뜻)

 

✅ 9. 접두사인지 확인하기

https://school.programmers.co.kr/learn/courses/30/lessons/181906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ my_string:String, _ is_prefix:String) -> Int {
    return my_string.hasPrefix(is_prefix) ? 1 : 0
}

접두사인지 확인하는 함수인 prefix를 사용하여 해결!

 

✅ 10. 문자열 뒤집기

https://school.programmers.co.kr/learn/courses/30/lessons/181905

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🎃 나의 풀이

func solution(_ my_string:String, _ s:Int, _ e:Int) -> String {
    var str = my_string
    let startIndex = my_string.index(my_string.startIndex, offsetBy: s)
    let endIndex = my_string.index(my_string.startIndex, offsetBy: e)
    str.replaceSubrange(startIndex...endIndex, with: my_string[startIndex...endIndex].reversed())
    return str
}

reversed 함수와 replaceSubrange함수를 사용하여 비교적 쉽게 풀 수 있었다.