Codewars(알고리즘)/6Kyu

[Codewars] [6Kyu] Moduli number system

Dannian 2022. 1. 26. 15:29
반응형
 

Codewars: Achieve mastery through coding challenge

Codewars is a coding practice site for all programmers where you can learn various programming languages. Join the community and improve your skills in many languages!

www.codewars.com

이번 문제는 배열의 각 값들을 이용한 나머지 값이 몇인지 찾아내는 것이 주 문제입니다.

그 외 제약조건으로는 주어진 배열(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)
])

이번 문제는 오랜만에 풀면서 복기하기 좋은 문제였던 것 같습니다.

반응형