nueijeel

[백준][Kotlin] 1476 - 날짜 계산 본문

코딩테스트/백준

[백준][Kotlin] 1476 - 날짜 계산

nueijeel 2024. 3. 12. 01:28

 

📍 문제

준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다.
지구를 나타내는 수를 E, 태양을 나타내는 수를 S, 달을 나타내는 수를 M이라고 했을 때, 이 세 수는 서로 다른 범위를 가진다. (1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19)
우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다. 1년이 지날 때마다, 세 수는 모두 1씩 증가한다. 만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다.
예를 들어, 15년은 15 15 15로 나타낼 수 있다. 하지만, 1년이 지나서 16년이 되면 16 16 16이 아니라 1 16 16이 된다. 이유는 1 ≤ E ≤ 15 라서 범위를 넘어가기 때문이다.
E, S, M이 주어졌고, 1년이 준규가 사는 나라에서 1 1 1일때, 준규가 사는 나라에서 E S M이 우리가 알고 있는 연도로 몇 년인지 구하는 프로그램을 작성하시오.

 

 

✔️ 아이디어

 

연도를 나타내는 각 값 E, S, M의 범위가 다르다는 점을 이용해 해결하는 아이디어가 떠올랐다.

 

문제에서 주어진 예시인 16년의 경우 지구, 태양, 달 값이 각각 1 16 16이 되는데

E의 범위 최댓값인 15로 16을 나눈 나머지인 1이 E의 값이 되기 때문에 

연도 시작값을 1로 두고 지구, 태양, 달의 범위 최댓값으로 나눈 나머지가 주어진 지구, 태양, 달 값과 일치할 때 까지 증가시켜 연도를 찾고자 했다.

 

 

✅ 작성한 코드

 

fun main() {
    val br = System.`in`.bufferedReader()
    val (E, S, M) = br.readLine().split(" ").map() { it.toInt() }
    var cnt = 1
    
    while (true) {
        val e = if (E == 15) 0 else E
        val s = if (S == 28) 0 else S
        val m = if (M == 19) 0 else M
        if (cnt % 15 == e && cnt % 28 == s && cnt % 19 == m) {
            print(cnt)
            break
        }
        cnt++
    }
}

 

연도 값을 cnt 변수로 선언, 1로 초기화해주고

while문 내부에서 조건을 만족하기 전까지 cnt를 계속 증가시켜준다.

 

지구, 태양, 달의 범위 최댓값으로 cnt를 나눈 나머지가 주어진 입력값과 같을 경우에 while문을 탈출하고 값을 출력하려고 했다.

 

그런데 E, S, M 값이 딱 범위의 최댓값일 때 나머지를 구하면 0이 나오기 때문에 각 값의 범위를 벗어나게 된다..!

 

그래서 주어진 지구, 태양, 달 값이 범위의 최댓값일 경우 0을, 그렇지 않으면 각 값을 그대로 가져오도록 변수 e, s, m을 선언하고 조건문 비교연산자의 오른쪽 피연산자로 지정해줬다.

 

 

 

 

 

 

 

 

 

 

 

 

728x90