이번 문제는 m에서 n 사이의 값에서 9개의 c(cars)와 7개의 b(boats)를 갖고 있을 때 총 갖고 있던 값(M)과 b와 c의 각각의 값(B, C)을 구해서 반환하는 문제입니다.
1. Swift
1-1. 본인의 풀이
먼저 예제에 따라 값을 확인해 보겠습니다.
m과 n이 각각 1, 100이기 때문에 1~100 사이의 값을 이용하게 됩니다.
그리고 그 값들 중에서 B와 C의 값을 구하고 총 M을 계산합니다.
주어진 제약 사항에서 M을 갖고 있을 때 9개의 c를 사면 C값은 모르지만, M - 9 * C = 1이 되고, 7개의 b를 사면 B는 알 수 없지만 M - 7 * B = 2가 됩니다.
위의 값에 의해서 (9 * C) - (7 * B) = 1이라는 값이 도출됩니다.
그럼 B와 C는 각각 어떻게 구해야 할까요?
마찬가지로 위에서 구한 대로 B = (M - 2) / 7, C = (M - 1) / 9가 됩니다.
이렇게 도출된 값을 통해서 m 부터 n 값 중에서 세 값을 모두 충족하는 결과를 찾으면 됩니다.
func howMuch(_ m: Int, _ n: Int) -> [(String, String, String)] {
var returnArray : [(String, String, String)] = []
for x in m > n ? n ... m : m ... n {
let b = (x - 2) / 7
let c = (x - 1) / 9
if (9 * c) - (7 * b) == 1 && x - (7 * b) == 2 && x - (9 * c) == 1 {
returnArray.append(("M: \(x)", "B: \(b)", "C: \(c)"))
}
}
return returnArray
}
제가 풀이 한 것 중에서 (9 * c) - (7 * b) == 1부분은 사실상 필요가 없는 부분이지만... 도출된 공식들 모두 넣는다는 생각으로 넣어둔 것입니다.
1-2. Best Solution
func howMuch(_ m: Int, _ n: Int) -> [(String, String, String)] {
// your code
let value = min(m, n)...max(m, n)
return value.filter { $0 % 9 == 1 && $0 % 7 == 2 }.map { ("M: \($0)", "B: \($0 / 7)", "C: \($0 / 9)") }
}
lamlv라는 유저의 답안입니다.
m과 n중 작은 값 부터 큰 값 까지의 배열을 만들고, 그 배열 중에서 9로 나눴을 때 나머지가 1, 7로 나눴을 때 나머지가 2인 값들을 필터링 한 후 그 값들에 대해서 map을 이용해서 String 배열로 만들어 값을 반환하는 방식입니다.
저보다 훨씬 간결하고 명확한 답안이네요.
이번 문제는 6Kyu치고는 쉬운 편이었던 것 같습니다.
문제를 해석하는 능력이 중요했던 것 같네요.
'Codewars(알고리즘) > 6Kyu' 카테고리의 다른 글
[Codewars] [6Kyu] Moduli number system (0) | 2022.01.26 |
---|---|
[Codewars] [6Kyu] Consecutive Strings (0) | 2021.03.05 |
[Codewars] [6Kyu] Counting Duplicates (0) | 2021.03.04 |
[Codewars] [6kyu] Braking well (0) | 2021.03.03 |
[Codewars] [6kyu] Street Fighter 2 - Character Selection (0) | 2021.01.26 |