Swift ) 프로그래머스(Lv2) - [3차] n진수 게임 (String)
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칸씩 내려간다와 같이
일정한 반복작업을 수행 할 때 사용 됩니다.
하지만 결과값이 하나로 출력 되기 때문에 변수로 넣을 수 없다는 단점이 있습니다.