λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm

[Programmers] nμ§„μˆ˜ κ²Œμž„

문제 πŸ‘‰ https://programmers.co.kr/learn/courses/30/lessons/17687

 

문제 μ„€λͺ…

νŠœλΈŒκ°€ Nμ§„μˆ˜ κ²Œμž„μ„ ν•˜λŠ”λ° 튜브 μˆœμ„œμ— 말해야 ν•˜λŠ” μˆ«μžλ“€μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

κ²Œμž„ κ·œμΉ™μ€ λ¬Έμ œμ— μžμ„Ένžˆ λ‚˜μ™€μžˆμŠ΅λ‹ˆλ‹€. 

문제 풀이

λͺ¨λ“  숫자 결과값을 가진 string 배열을 κ΅¬ν•˜κ³  κ·Έ μ€‘μ—μ„œ 튜브의 차둀에 말할 μˆ«μžλ“€μ„ 뽑아야 ν•©λ‹ˆλ‹€. 

이 문제λ₯Ό ν’€κΈ° μœ„ν•΄μ„œ 두가지λ₯Ό μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€!!

 

1. Nμ§„μˆ˜ λ³€ν™˜ 방법

2. forλ¬Έ 돌기 → +1이 μ•„λ‹ˆλΌ +n만큼 λŒμ•„μ•Ό ν•©λ‹ˆλ‹€. (튜브의 μˆœμ„œλŠ” +μ‚¬λžŒμˆ˜λ§ŒνΌ λŒμ•„μ˜€κΈ° λ•Œλ¬Έ)

 

1λ²ˆμ€ swift의 radix λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€. (항상 κ΅¬ν˜„ν–ˆμ—ˆλŠ”λ° 였늘 처음 μ•” γ…Žγ…Ž,,)

λ³€ν™˜ν•  μˆ˜μ™€ 진 수λ₯Ό μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.

uppercaseλŠ” optional νŒŒλΌλ―Έν„°μΈλ° 11μ§„μˆ˜μ΄μƒλΆ€ν„° μ•ŒνŒŒλ²³μœΌλ‘œ ν‘œν˜„λ˜λŠ” μˆ«μžλ“€μ˜ λŒ€μ†Œλ¬Έμžλ₯Ό κ²°μ •ν•©λ‹ˆλ‹€. 

let target: Int = 3
let n: Int = 2

let result = String(target, radix: n, uppercase: true)
print(result)

// 11

 

2번 방법은 κ°„λ‹¨ν•˜κ²Œ μƒκ°ν•˜λ©΄ for문을 돌며 λ‚˜λ¨Έμ§€ 연산을 μ΄μš©ν•΄μ„œ ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€. 

n, n+2, n+4, n+6 일 경우

2둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ‘œ νŒλ‹¨ν•˜μ—¬ μˆ«μžλ“€μ„ 뽑을 수 μžˆμŠ΅λ‹ˆλ‹€.

// 문제의 풀이 μ•„λ‹˜!!

for (i,num) in totalNumber.enumerated() {
    if i % 2 == 1 {
        result.append(num)
        if result.count == t {
            break
        }
    }
}

 μ €λŠ” 이 풀이방법을 μ‚¬μš©ν–ˆμ§€λ§Œ λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이λ₯Ό 보고 strideλΌλŠ” λ©”μ†Œλ“œλ₯Ό μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€!!

stride

stride(from: A, to: B, by: C) 라고 ν•˜λ©΄ 

AλΆ€ν„° BκΉŒμ§€ C만큼 λ”ν•˜λ©΄μ„œ κ°ˆκ±°μ•Ό! λΌλŠ” λœ»μž…λ‹ˆλ‹€. 

이 λ•Œ BλŠ” ν¬ν•¨ν•˜μ§€ μ•Šκ³  B-1 κΉŒμ§€ ν¬ν•¨ν•©λ‹ˆλ‹€.

for i in stride(from: 0, to: 10, by: 2) {
    print(i)
}

// 0 
// 2
// 4
// 6
// 8

μ½”λ“œ

λ‚˜λ¨Έμ§€ 연산을 μ΄μš©ν•œ forλ¬Έ

func changeRadix(_ n: Int, _ target: Int) -> String {
    return String(target, radix: n, uppercase: true)
}
func solution(_ n:Int, _ t:Int, _ m:Int, _ p:Int) -> String {
    let total: Int = t * m
    var totalNumber: String = ""
    var result: String = ""
    for i in 0..<total {
        totalNumber.append(changeRadix(n, i))
    }
    for (i,num) in totalNumber.enumerated() {
        if i % m == (p-1) {
            result.append(num)
            if result.count == t {
                break
            }
        }
    }
    
    return result
}

stride 연산을 μ΄μš©ν•œ forλ¬Έ

func changeRadix(_ n: Int, _ target: Int) -> String {
    return String(target, radix: n, uppercase: true)
}
func solution(_ n:Int, _ t:Int, _ m:Int, _ p:Int) -> String {
    let total: Int = t * m
    var totalNumber: String = ""
    var result: String = ""
    for i in 0..<total {
        totalNumber.append(changeRadix(n, i))
    }
    for i in stride(from: (p-1), to: (p-1) + m * t, by: m) {
        let index = totalNumber.index(totalNumber.startIndex, offsetBy: i)
        result.append(totalNumber[index])
        print(i)
    }
    
    return result
}