지구정복

[수학] 백준 - 카잉 달력 본문

데이터 엔지니어링 정복/Algorithm

[수학] 백준 - 카잉 달력

eeaarrtthh 2021. 8. 26. 20:37
728x90
반응형

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

 

6064번: 카잉 달력

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

www.acmicpc.net

 

-문제해설

 

처음에는 단순히 반복문 돌리면서 변수 a, b 선언하고 1씩증가하다가 a, b가 x, y와 같아지면 정답을 출력하는 식으로 짰는데 시간초과가 나왔다.

 

그래서 일일이 일단 다 써보니 규칙을 알아냈다.

예를 들어 5 6 1 4를 구한다고 해보자.

1 - 1, 1 여기

2 - 2, 2

3 - 3, 3

4 - 4, 4

5 - 5, 5

6 - 1, 6 여기

7 - 2, 1

8 - 3, 2

9 - 4, 3

10 - 5, 4

11 - 1, 5 여기

12 - 2, 6

13 - 3, 1

14 - 4, 2

15 - 5, 3

16 - 1, 4 여기

 

즉 x값에 +X가 되는 곳의 y값을 비교해주면 되는 것이다.

 

첫 번째 1, 1 에서는 x는 1이지만 y는 4가 아니므로 기각

두 번째 1, 6 에서는 x는 1이지만 y는 4가 아니므로 기각

.

.

.

마지막 1, 4에서 x는 1이고 y는 4이므로 조건에 성립된다.

따라서 16을 출력하면 된다.

 

이를 코드로 나타내면 

for( int j=x; j<(X*Y); j += X ) {

    if( j % Y == y )

}

이다.

 

하지만 이때 조심해야할 점이 만약 y가 Y랑 같은 경우이면 j%Y를 할경우 0이나오게 되므로 이 경우만 따로 코딩해야된다. 자세한 코드는 아래를 참조

 

 

 

-자바

package math;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class BJ6064 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int t = Integer.parseInt( br.readLine() );
		StringTokenizer st;
		
		int X=0, Y=0, x=0, y=0;
		for( int i=0; i<t; i++ ) {
			st = new StringTokenizer( br.readLine() );
			X = Integer.parseInt( st.nextToken() );
			Y = Integer.parseInt( st.nextToken() );
			x = Integer.parseInt( st.nextToken() );
			y = Integer.parseInt( st.nextToken() );
			boolean ok = false;
			boolean wh = false;
			if( Y == y ) wh = true;
			
			for( int j=x; j<(X*Y); j += X ) {
				if( wh ) {
					if( j%Y == y || j%Y == 0 ) {
						System.out.println( j );
						ok = true;
						break;
					}
				} else {
					if( j%Y == y ) {
						System.out.println( j );
						ok = true;
						break;
					}
				}
				
			}
			if( !ok ) System.out.println( -1 );
			
			
		}
	}
}

 

-파이썬

from sys import stdin
input = stdin.readline
for _ in range( int(input()) ):
    X, Y, x, y = map( int, input().split() )
    f = 1
    a = 0
    if Y == y: a=1
    while( x <= X*Y ):
        if a == 0:
            if( x%Y == y ):
                print( x )
                f = 0
                break
        else: 
            if( x%Y == y or x%Y == 0 ):
                print( x )
                f = 0
                break
        x += X
    if f: print( -1 )
728x90
반응형
Comments