반응형
이번 문제는 배열의 각 값들을 이용한 나머지 값이 몇인지 찾아내는 것이 주 문제입니다.
그 외 제약조건으로는 주어진 배열(sys)안의 숫자들의 곱이 주어진 특정 숫자(n)보다 작을 경우와 주어진 배열(sys)의 각 값들 간에 서로소인지 여부를 확인하는 것입니다.
먼저 제가 구현한 코드를 한 번 보겠습니다.
1. Swift
1-1. 본인의 풀이
func fromNb2Str(_ n: Int, _ sys: [Int]) -> String {
// your code
let totalValue = sys.reduce(1, *)
if totalValue < n {
return "Not applicable"
}
for i in 0 ..< sys.count {
for j in i + 1 ..< sys.count {
if gcd(sys[i], sys[j]) > 1 { return "Not applicable" }
}
}
return sys.map({String(format: "-%d-", n % $0)}).joined(separator: "")
}
// 최대 공약수 찾는 함수
func gcd(_ v1: Int, _ v2: Int) -> Int {
if v1 < v2 {
return gcd(v2, v1)
} else if v2 == 0 {
return v1
} else {
return gcd(v2, v1 % v2)
}
}
특정 값(n)과 Int형 배열(sys)가 주어지는 문제입니다.
제 코드에서는 가장 먼저 배열 안의 각 수를 곱하였을 때 n보다 큰지 확인을 합니다.
// ...
let totalValue = sys.reduce(1, *)
if totalValue < n {
return "Not applicable"
}
// ...
그 다음은 최대공약수(GCD) 값이 1이 아닌 값이 있는지 확인합니다.
func fromNb2Str(_ n: Int, _ sys: [Int]) -> String {
// ...
for i in 0 ..< sys.count {
for j in i + 1 ..< sys.count {
if gcd(sys[i], sys[j]) > 1 { return "Not applicable" }
}
}
// ...
}
// 최대 공약수 찾는 함수
func gcd(_ v1: Int, _ v2: Int) -> Int {
if v1 < v2 {
// v1이 v2보다 작다면 일단 바꿔서 다시 호출(재귀)
return gcd(v2, v1)
} else if v2 == 0 {
// 이전에 나눈 값(v1)값을 반환해준다.(v1 < v2)
return v1
} else {
// v2가 0일 때 까지 나머지 값을 계산 하기 위해서 사용하는 부분.(v1 < v2)
return gcd(v2, v1 % v2)
}
}
여기까지 왔으면 모두 끝난 것입니다.
// ...
return sys.map({String(format: "-%d-", n % $0)}).joined(separator: "")
// ...
이 부분은 sys의 각 값을 이용해서 n을 나눈 나머지를 String으로 변환하고 각 String을 합치는 부분입니다.
추가로 테스트 코드는 제가 2가지를 더 추가했습니다.
import XCTest
class SolutionTest: XCTestCase {
static var allTests = [
("fromNb2Str", testExample),
]
func testing(_ nb: Int, _ sys: [Int], _ expected: String) {
XCTAssertEqual(fromNb2Str(nb, sys), expected, "should return \(expected)")
}
func testExample() {
testing(779, [8,7,5,3], "-3--2--4--2-")
testing(187, [8,7,5,3], "-3--5--2--1-")
testing(15, [8,6,5,3], "Not applicable")
testing(7, [2, 3], "Not applicable") // 추가
testing(7, [2, 8], "Not applicable") // 추가
}
}
XCTMain([
testCase(SolutionTest.allTests)
])
이번 문제는 오랜만에 풀면서 복기하기 좋은 문제였던 것 같습니다.
반응형
'Codewars(알고리즘) > 6Kyu' 카테고리의 다른 글
[Codewars] [6Kyu] Persistent Bugger. (0) | 2022.01.26 |
---|---|
[Codewars] [6Kyu] Give me a Diamond (0) | 2022.01.26 |
[Codewars] [6Kyu] Consecutive Strings (0) | 2021.03.05 |
[Codewars] [6Kyu] How Much? (0) | 2021.03.05 |
[Codewars] [6Kyu] Counting Duplicates (0) | 2021.03.04 |