반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

[swift][백준 알고리즘] 6064 카잉 달력 본문

오뚝이 개발자/알고리즘

[swift][백준 알고리즘] 6064 카잉 달력

rriver2 2022. 4. 20. 12:08
반응형

문제:    

https://www.acmicpc.net/problem/6064

 

6064번: 카잉 달력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 한 줄로 구성된다.

www.acmicpc.net

풀이방법:    

M N x y
10 12 3 9

문제를 식으로 정리하면

M, x : ( k-x ) % M = 0

N, y : ( k-y ) % N= 0

를 만족하는 k의 값을 구하는 문제이다.

 

( k-x ) % M = 0을 만족하는 첫번째 식인 

k = x일 때부터 k = x + M , k = x + 2M, ...이렇게 k에 M을 증가시키며 계산을 한다. 

그리고 만약 이 k가 ( k-y ) % N == 0 식을 만족한다면 k를 반환한다.

 

마지막으로 k가 x와 y의 최소공배수를 초과할 시에는 -1 반환한다.

(최소공배수이기 전의 과정이 반복됨)

 

작성한 코드는 다음과 같다.

import Foundation

// 반복 횟수 T
let T = Int(readLine()!)!

// 최대 공약수 (최소공배수를 구하기 위해)
func GCD(_ A : Int,_ B : Int)->Int{
    if(A % B == 0){
        return B
    }else{
        return GCD(B,A%B)
    }
}

// 최소공배수
func LCM(_ A : Int,_ B : Int)->Int{
    return A * B / GCD(A, B)
}

// k 값 구하는 함수
func result( _ N : Int, _ M : Int, _ x: Int, _ y : Int)->Int{
    var k = x
    // k가 M과 N의 최소공배수 이하일 때까지 반복
    while(k <= LCM(M,N)){
    	// k가 "(k-y) % N == 0" 조건에 해당하면 k 반환
        if((k-y)%N == 0){
            return k
        }
        // k는 처음 x 값에서 M을 더해나감
        k += M
    }
    // k가 M과 N의 최소공배수를 넘어섰을 때 -1 반환
    return -1
}

for _ in 0..<T {
    let inputArray = readLine()!.split(separator: " ")
    let M : Int = Int(inputArray[0])!
    let N : Int = Int(inputArray[1])!
    let x : Int = Int(inputArray[2])!
    let y : Int = Int(inputArray[3])!
   print(result(N,M,x,y))
}

 

성공한 사진!    

 

반응형
Comments