Codewars(알고리즘)/6Kyu

[Codewars] [6Kyu] How Much?

Dannian 2021. 3. 5. 11:43
반응형
 

Codewars: Achieve mastery through challenge

Codewars is where developers achieve code mastery through challenge. Train on kata in the dojo and reach your highest potential.

www.codewars.com

이번 문제는 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치고는 쉬운 편이었던 것 같습니다.

문제를 해석하는 능력이 중요했던 것 같네요.

반응형