✅ 1. 수열과 구간 쿼리 3

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
    
    var result = arr
    for i in 0..<queries.count{
        result.swapAt(queries[i][0], queries[i][1])
    }
    return result
}

반복문과 swapAt을 사용하여 풀어내었다.

swapAt 함수는 Array함수로 배열에 인덱스로 접근하여 두 원소의 값을 바꿔주는 함수이다.

 

✅ 2. 수열과 구간 쿼리 2

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
    //queries 는 순서대로 s, e , k 이다
    // s ... e 인 원소중에 k 보다 큰수를 찾는다. 그 중 제일 작은 수를 찾는다.
    var result : [Int] = []
    for querie in queries{
        var s = querie[0]
        var e = querie[1]
        var k = querie[2]
        
        var arrayInRange : [Int] = []
        
        for i in s...e{
            if(arr[i] > k){
                arrayInRange.append(arr[i])
            }
        }
        result.append(arrayInRange.min() ?? -1)
    }
    return result
}

굉장히 어려운 문제였다.... i가 인덱스를 뜻하는지 모르고 한참 해매다 풀게 되었다 ㅜㅜ

풀고 보니 단순한 문제였네..

 

🏆 모범 풀이

func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
    return queries.map { 
        let (s, e, k) = ($0[0], $0[1], $0[2])
        return Array(arr[s...e]).filter { $0 > k }.min() ?? -1
    }
}

모범 풀이에서는 mapfillter를 사용하여 정말 간단하게 끝났다. 아직까지 고차함수가 손에 익지 않아서 나에게는 어렵다..

 

✅ 3. 수열과 구간 쿼리 4

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
    var array = arr
    for querie in queries{
        var s = querie[0]
        var e = querie[1]
        var k = querie[2]
        for i in s...e{
            if(i % k == 0){
                array[i] += 1
            }
        }
    }
    return array
}

이전 문제와 비슷한 방식으로 풀어냈다. 다만 주의할 부분은 0은 모든 정수의 배수라는 점이었다!

 

🏆 모범 풀이

func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
    var arr = arr
    queries.forEach { 
        let (s, e, k) = ($0[0], $0[1], $0[2])
        (s...e).forEach { if $0 % k == 0 { arr[$0] += 1 } }
    }
    return arr
}

 

forEach를 사용하면 for문 보다 더 간결하게 요약이 가능한듯하니 다음에는 forEach문도 사용해 봐야겠다.

 

✅ 4. 배열 만들기 2

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

func solution(_ l:Int, _ r:Int) -> [Int] {
    let result = (l...r).filter{String($0).allSatisfy{$0 == "0" || $0 == "5"} }
    return result.isEmpty ? [-1] : result
}

filterallSatisfy를 사용하여 비교적 간단하게 풀어냈다!

allSatisfy는 배열의 모든 원소 중 조건문을 만족하는 원소만 배열로 반환하는 함수이다.

이런 비슷한 함수가 너무 많아서 헷갈리기 시작한다...

 

✅ 5. 카운트 업

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

 func solution(_ start_num:Int, _ end_num:Int) -> [Int] {
    var result : [Int] = []
    (start_num...end_num) .forEach{ index in
        result.append(index)
    }
    return result
}

쉬어가는 느낌의 문제여서 굉장히 쉽게 풀었지만 이것도 어렵게 푼 것이었다..

 

🏆 모범 풀이

func solution(_ start: Int, _ end: Int) -> [Int] {
    [Int](start...end)
}

연산한 줄로 끝 ^^... 함수의 연산이 한 번만 들어간 경우 return을 생략할 수 있는 거 같다??

 

✅ 6. 콜라츠 수열 만들기

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

func solution(_ n:Int) -> [Int] {
    var result : [Int] = []
    var value = n
    result.append(value)
    
    while(value != 1){
        if(value % 2 == 0){
            value /= 2
        } else{
            value = 3 * value + 1
        }
        result.append(value)
    }
    
    return result
}

while 반복문을 사용하여 정석적으로 풀어냈다.

 

🏆 모범 풀이

func solution(_ n: Int) -> [Int] {
    return sequence(first: n) { i in i == 1 ? nil : i % 2 == 0 ? i / 2 : 3 * i + 1 }.map { $0 }
}

sequence를 사용하여 더욱 간단하게 표현이 가능한 모양이다.

sequence 함수는 시작값과 조건 클로저를 기반으로 반복적인 값을 생성하는 함수이다.

특이한 점은 nil을 반환하면 반복문이 종료된다.

 

✅ 7. 배열 만들기 4

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

func solution(_ arr:[Int]) -> [Int] {
    // stk가 빈 배열인 경우 : arr[i]를 stk에 추가, i + 1 하기
    // stk가 빈 배열이 아니고, stk 마지막 원소가 arr[i]가 작으면 arr[i]를 뒤에. 추가하고 i + 1
    // stk가 빈 배열이 아니고, stk 마지막 원소가 arr[i]보다 크거나 같으먼 stk의 마지막 원소 제거
    var stk : [Int] = []
    var i = 0
    while(i < arr.count){
        if(stk.isEmpty){
            stk.append(arr[i])
            i += 1
        } else {
            if(stk.last! < arr[i]){
                stk.append(arr[i])
                i += 1
            } else if(stk.last! >= arr[i]){
                stk.removeLast()
            }
        }
    }
    
    return stk
}

의식의 흐름대로 작성하여 중복 코드가 많아졌다. 깔끔한 모범 풀이를 보자

 

🏆 모범 풀이

func solution(_ arr: [Int]) -> [Int] {
    var stack = [Int]()
    var i = 0

    while i < arr.count {
        if stack.isEmpty || stack.last! < arr[i] {
            stack.append(arr[i])
            i += 1
        } else if stack.last! >= arr[i] {
            stack.popLast()
        }
    }
    return stack
}

두 개의 조건부로 깔끔하게 처리된 코드

 

✅ 8. 간단한 논리 연산

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

func solution(_ x1:Bool, _ x2:Bool, _ x3:Bool, _ x4:Bool) -> Bool {
    (x1 || x2) && (x3 || x4)
}

문제 자체를 이해하지 못했는데 찾아보니

∨(논리합)은 OR 연산자를, ∧(논리곱)은 AND 연산자를 나타내는 것이었다. 간단하게 해결~

 

✅ 9. 주사위 게임 3

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

func solution(_ a:Int, _ b:Int, _ c:Int, _ d:Int) -> Int {
    var result = 0
    let arr = Array([a,b,c,d])
    var noneDuplication = Array(Set(arr))
    
    
    var (maxValue, maxTarget) = (0,0)
    for target in noneDuplication{
        let count = arr.filter{$0 == target}.count
        if(maxValue < count){
            maxTarget = target
            maxValue = count
        }
    }
    
        if(noneDuplication.count == 1){
        return 1111 * a
    }
    else if(noneDuplication.count == 2){
        if(maxValue == 3){
            let value = (10 *  noneDuplication.first(where: {$0 == maxTarget})! + noneDuplication.first(where: {$0 != maxTarget})!)
            return value * value
        }
        else{
            return (noneDuplication[0] + noneDuplication[1]) * abs(noneDuplication[0] - noneDuplication[1])
        }
    }
    else if(noneDuplication.count == 3){
        let index = noneDuplication.firstIndex(of: maxTarget)!
        noneDuplication.remove(at: index)
        return noneDuplication[0] * noneDuplication[1]
    }
    else{
        return Array([a,b,c,d]).min()!
    }
}

너무 어려워서 풀다 보니 하드코딩을 하게 되었다. 모범 풀이를 참고하자...

 

🏆 모범 풀이

func solution(_ a: Int, _ b: Int, _ c: Int, _ d: Int) -> Int {
    let dice = [a, b, c, d]
    let counts = Array(1...6).map { num in dice.filter { $0 == num }.count }

    if let p = counts.firstIndex(of: 4) {
        return 1111 * (p + 1)
    } else if let p = counts.firstIndex(of: 3), let q = counts.firstIndex(where: { $0 == 1 }) {
        return (10 * (p + 1) + (q + 1)) * (10 * (p + 1) + (q + 1))
    } else if let p = counts.firstIndex(of: 2), let q = counts.lastIndex(of: 2), p != q {
        return (p + q + 2) * abs(p - q)
    } else if let p = counts.firstIndex(of: 2), let q = counts.firstIndex(where: { $0 == 1 }), let r = counts.lastIndex(where: { $0 == 1 }), q != r {
        return (q + 1) * (r + 1)
    } else {
        return dice.min()!
    }
}

 

 

✅ 10. 글자 이어 붙여 문자열 만들기

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

 

프로그래머스

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

programmers.co.kr

 

🎃 나의 풀이

func solution(_ my_string:String, _ index_list:[Int]) -> String {
    var result = ""
    index_list.forEach{ i in
        let index = my_string.index(my_string.startIndex, offsetBy: i)
        result += String(my_string[index])
    }
    return result
}

문자열에 인덱스로 접근하는 법을 아는지 묻는 문제 같았다.

index함수를 사용하여 String.Index값을 사용해서 접근해야 한다.

 

🏆 모범 풀이

func solution(_ my_string:String, _ index_list:[Int]) -> String {
    let my_string = my_string.map { String($0) }
    return index_list.reduce("") { $0 + my_string[$1] }
}

map을 사용하여 문자열 배열을 만든 모습이다. 훨씬 간결하게 해결이 가능하다.