티스토리 뷰

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

 

6064번: 카잉 달력

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

www.acmicpc.net

 

문제 분석을 하자면 현재 달력의 각 자리수는 m,n 까지 해마다 1씩 증가하다 1로 돌아가는 방식으로 진행이 되고

임의의 자리수가 주어졌을때 몇번째 해인지 구하면 되는 문제이다.

 

이 문제를 풀때의 아이디어는 m,n의 최소공배수가 곧 달력이 초기화 되는 한 사이클이라는 점이다.

 

그리고 임의로 주어진 수를 시작점으로 두고 각각 m,n을 더하기를 반복해

임의의 수 a, b가 같아지는 시점이 구하려는 답이된다.

 

이때 한 사이클이 지나도록 같아지는 시점이 없다는 잘못된 데이터가 주어진 경우이므로  -1을 출력해주면 된다.

 

그럼 먼저 유클리드 호제법을 사용한 최대공약수를 구하는 메소드를 만들어 최소공배수를 구해 한 사이클을 구해주겠다.

 

	static int gcd(int a, int b) {
		if(b == 0) return a;
		return gcd(b, a%b);
	}

 

 

유클리드 호제법은 아래 포스팅에서 다뤄두었다.

 

https://0bliviat3.tistory.com/33

 

유클리드 호제법(JAVA)

최대공약수를 구할 때 사용되는 알고리즘으로 이를 활용한 알고리즘 문제들이 정말 많기 때문에 한번 정리하고 넘어가려 한다. 먼저 참조 문서를 보고 오겠다. 공부할땐 위키백과만한게 없다. h

0bliviat3.tistory.com

 

 

다음으로는 유클리드 호제법으로 구한 한 사이클내에서 답을 낼때는 리턴

아닌경우 -1을 리턴해주는 메소드를 만들어준다.

단 이때 a와 b가 같은경우는 min(m,n) 이하인 첫 순회의 경우만 해당되므로 바로 리턴해주도록 한다.

 

	static int getYear(int m, int n, int a, int b) {
		if(a == b) return a;
		int max = (m*n)/gcd(m,n);
		int now = Math.min(a, b);
		while(now <= max) {
			if(a < b) {
				a+=m;
			}else {
				b+=n;
			}
			if(a == b) return a;
			now = Math.min(a, b);
		}
		return -1;
	}

 

 

이제 정확한 답을 내는지 확인해보면 생각한대로 답을 내는것을 확인할수 있다.

 

 

 

아래는 코드의 전문이다.

 

package boj3;

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

public class Boj6604 {
	
	static int gcd(int a, int b) {
		if(b == 0) return a;
		return gcd(b, a%b);
	}
	
	static int getYear(int m, int n, int a, int b) {
		if(a == b) return a;
		int max = (m*n)/gcd(m,n);
		int now = Math.min(a, b);
		while(now <= max) {
			if(a < b) {
				a+=m;
			}else {
				b+=n;
			}
			if(a == b) return a;
			now = Math.min(a, b);
		}
		return -1;
	}

	public static void main(String[] args) throws IOException{
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;
		
		int t = Integer.parseInt(in.readLine());
		
		int[] data = new int[4];
		
		while(t-- > 0) {
			st = new StringTokenizer(in.readLine()," ");
			for(int i = 0; i < 4; i++) {
				data[i] = Integer.parseInt(st.nextToken());
			}
			sb.append(getYear(data[0],data[1],data[2],data[3])).append('\n');
		}
		
		in.close();
		
		System.out.print(sb);
	}
	
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함