https://www.acmicpc.net/problem/1476
사고방식
문제를 요약하자면 이렇다.
준규가 사는 나라의 연도는 E, S, M로 표현하며 각각의 값들은 1부터 시작하여 커지고, 15, 28, 19를 넘어가면 다시 1로 돌아간다. 입력값으로 주어지는 E, S, M을 통해 출력값을 찾는 문제이다.
천천히 생각해보면 최소공배수, 나머지와 관련된 쉬운 문제이다.
+ 문제에 나와있는 예시처럼 15년의 경우, 15,15,15이지만 16년의 경우, 1,16,16이다. 문제에 나와있는 것처럼 E의 범위가 15까지인데 16은 15를 넘어가므로 1로 바뀌는 것이며 한 번 더 생각해보면 1은 16년을 15로 나눈 나머지임을 알 수 있다.
+ 예를 하나 더 들자면, 만약 연도가 15*28인 420이라면 E, S 값은 각각 15, 28일 것이다. M 값은 420/19의 나머지 값인 2일 것이다. 따라서 15,28,2이다.
즉, E, S, M 각 숫자들은 해당 연도를 15, 28, 19로 나눈 나머지 값이며 나머지가 0일 때는 각각 15, 28, 19로 표시된다.
해당 연도를 찾기 위해서는 브루트 포스를 이용하면 된다. 즉, 연도를 year로 선언하고 0부터 1씩 더해가며 적절한 연도를 찾으면 된다. (0부터 1,2,34,5,6,7... 하면서 맞는 것 찾을 때까지 그냥 다 해보면 된다는 소리이다...!)
이를 이용하여 코드를 짜보자.
- Scanner을 이용하여 입력값 A, B, C를 받는다.
- int year = 0으로 연도를 선언하고, year++를 통해서 year 값을 1씩 더해가며 year 값을 15, 28, 19로 나눈 나머지 값이 각각 A, B, C를 만족하는 year을 찾는다.
- 적절한 year을 찾으면 break를 통해서 while 문을 빠져나오고, year 값을 println 한다.
결론
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
int C = sc.nextInt();
// 순서대로 A,B,C로 입력받는다.
// 처음 문제를 풀었을 때 A,B,C가 익숙해서 이렇게 써뒀는데 E,S,M으로 받으면 더 좋지 않았을까? 하는 생각이 든다. 물론 문제에 큰 영향은 없다.
int year = 0; //연도를 year=0으로 선언하고,
while(true){
year++; //year을 1씩 더해가면서 0,1,2,3... 해가면서 적절한 year을 찾는다.
if((year-A)%15==0 && (year-B)%28==0 && (year-C)%19==0){
//year-A, year-B, year-C 값이 각각 15,28,19로 나누었을 때 0을 만족한다는 것은
//year 값을 15,28,19로 나누었을 때 나머지 값이 각각 A,B,C인 것과 같은 의미이다.
break;
}
}
System.out.println(year);
}
}
'개발공부 > 알고리즘' 카테고리의 다른 글
백준 15649번 - N과 M (1) [브루트 포스/자바 JAVA] (0) | 2024.09.06 |
---|---|
백준 9095번 - 1, 2, 3 더하기 [브루트 포스/자바 JAVA] (0) | 2024.09.05 |
백준 1748번 - 수 이어 쓰기 1 [브루트 포스/자바 JAVA] (0) | 2024.09.04 |
백준 2309번 - 일곱 난쟁이 [브루트 포스/자바 JAVA] (0) | 2024.08.31 |
백준 9093번 - 단어 뒤집기 [자료구조 1/자바 JAVA] (0) | 2024.08.30 |