백준을 풀 때는 거의 풀어본 적이 없는데 프로그래머스에서는 진법에 관련된 문제가 많이 나오는 것 같습니다. 0 ~ ?까지의 숫자를 n진수로 바꾸고 나열해야 합니다. 매번 튜브가 말할 때마다 숫자를 구하기 보다는 미리 구해놓는 편이 코드도 짧고 간단합니다. m명의 멤버가 t번 말할 분량의 문자열이 필요하므로 m * t의 길이 이상 구해놓으면 됩니다. 그리고 나서 그 문자열의 p 번째부터 시작해서 m씩 건너뛰면서 길이가 t인 문자열을 리턴하면 됩니다.
func solution(_ n:Int, _ t:Int, _ m:Int, _ p:Int) -> String {
// 필요한 길이만큼 미리 n진수를 나열한 String을 구하고 시작
var fullRadix = [String]()
var i = 0
// m명의 멤버가 t번 말하는 동안 필요하므로 길이가 t * m 이상이 될 때까지 i를 늘려가며 구한다.
while fullRadix.count < t * m {
fullRadix.append(contentsOf: String(i, radix: n).map { String($0) })
i += 1
}
// 튜브가 말할 숫자
var ans = ""
// index는 0부터 시작하므로 순서에서 -1
var p = p - 1
// t개 만큼 튜브가 말할 문자를 ans에 더한다.
for _ in 0..<t {
ans += fullRadix[p].uppercased()
p += m
}
return ans
}