본문 바로가기
Xcode/Swift - Algorithm

Swift ) 프로그래머스(Lv2) - [3차] n진수 게임 (String)

by 후르륵짭짭 2020. 9. 10.
728x90
반응형

programmers.co.kr/learn/courses/30/lessons/17687

 

코딩테스트 연습 - [3차] n진수 게임

N진수 게임 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0�

programmers.co.kr

안녕하세요 후르륵짭잡 입니다.

이 문제는 Swift의 String radix를 이용하면 쉽게 풀 수 있는 문제였습니다.

처음에는 문제가 이해 안됐으나, 계속 읽어보니 이해가 됐습니다.

 

** 저의 풀이 **

//0:20
func solution(_ n:Int, _ t:Int, _ m:Int, _ p:Int) -> String {
    
    var say = 0
    var isturn = 1
    var num = 0
    
    var answer : [String] = []
    while say < t {
        
        let number = String(num , radix: n)
        
        for element in number {
            
            if isturn == p && say < t{
                answer.append(String(element).uppercased())
                say += 1
            }
            
            if isturn == m {
                isturn = 0
            }
            
            isturn += 1
            
        }
        
        num += 1
        
    }
    
    return answer.joined()
}

저는 이 문제를 t 번 말하기 전까지 계속 숫자를 증가시켜주었습니다.

String(숫자, radix : 진법)을 해준다면 String형으로 진법이 나오게 됩니다. 

그리고 계속 돌려주고 최대 인원 숫자까지 돌면 초기화 해줍니다.

방법은 간단 합니다.

 

저 처럼 이렇게 String을 사용하지 않고

func toN(_ n:Int, _ base:Int) -> String{
    let data = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]
    var out = ""
    var res = n
    var rem = 0
    while res > 0 {
        rem = res%base
        res = res/base
        out = data[rem] + out
    }
    if n == 0{
        out = "0"
    }
    return out
}

이렇게 직접 진법을 구현하신 분도 계셨습니다.

예를들어 2진법을 구한다면

10을 2로 나눠주면 5가 되고 이 5를 다시 2로 나눠주면 1이 남으면서 2가 되고 2로 나누주면 1이 되고 1을 나눠주면 1이 남고 0이 됩니다.

그러면 1010 이렇게 나머지 부분만 추가해주면 2진법 완성!!

3진법 10진법 16진법도 마찮가지 입니다.

 

또 다른 방법으로는 

func solution2(_ n: Int, _ t: Int, _ m: Int, _ p: Int) -> String {
    let count = t*m
    var values: [String] = []
    var number = 0
    while values.count < count {
        values += String(number, radix: n).compactMap({ String($0).uppercased() })
        number += 1
    }
    return stride(from: p - 1, to: count, by: m).reduce("", { $0 + values[$1] })
}

이렇게 stride를 사용하신 분도 계셨습니다.

 

** 새롭게 알게 된 사실 **

developer.apple.com/documentation/swift/1641347-stride

 

Apple Developer Documentation

 

developer.apple.com

Stride는 반복된 작을 해주는 것 입니다.

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

//결과
10
8
6
4
2

위에서 처럼 반복된 작업을 from 부터 to 까지 -2칸씩 내려간다와 같이

일정한 반복작업을 수행 할 때 사용 됩니다.

하지만 결과값이 하나로 출력 되기 때문에 변수로 넣을 수 없다는 단점이 있습니다.

728x90
반응형

댓글