문제주소 :www.acmicpc.net/problem/2981
2981번: 검문
트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 시간
www.acmicpc.net
<문제 설명>
문제
트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다.
상근이는 시간을 때우기 위해서 수학 게임을 하기로 했다.
먼저 근처에 보이는 숫자 N개를 종이에 적는다. 그 다음, 종이에 적은 수를 M으로 나누었을 때, 나머지가 모두 같게 되는 M을 모두 찾으려고 한다. M은 1보다 커야 한다.
N개의 수가 주어졌을 때, 가능한 M을 모두 찾는 프로그램을 작성하시오.
입력
첫째 줄에 종이에 적은 수의 개수 N이 주어진다. (2 ≤ N ≤ 100)
다음 줄부터 N개 줄에는 종이에 적은 수가 하나씩 주어진다. 이 수는 모두 1보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. 같은 수가 두 번 이상 주어지지 않는다.
항상 M이 하나 이상 존재하는 경우만 입력으로 주어진다.
출력
첫째 줄에 가능한 M을 공백으로 구분하여 모두 출력한다. 이때, M은 증가하는 순서이어야 한다.
예제 입력 1
3
6
34
38
예제 출력 1
2 4
<풀이법>
▒ 한줄 개념: 정수론 ▒
[c++] 백준 2981 - 검문
0. [c++] 백준 2981 - 검문 https://www.acmicpc.net/problem/2981 1. 풀이 1) 무식하게 풀기 처음에는 직접 모든 수를 나누는 과정을 통해서 정답을 구하려고 생각을 하였다. 무작정 모든 과정을 반복하는 것.
kyunstudio.tistory.com
위의 링크를 참고하여 풀었습니다.
정답률이 보여주듯, 꽤나 난이도가 높았습니다.
수학적인 감각이 1도 없는 사람으로써.. 풀고나서도 개운하게 이해된 느낌이 아닌 문제입니다...
나중에 다시 도전해봐야할 것 같습니다.
<코드(Java)>
package Baekjoon;
import java.util.Arrays;
import java.util.Scanner;
public class _2981_Check {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int size = sc.nextInt();
int arr[] = new int[size];
int difs[] = new int[size-1];
arr[0] = sc.nextInt();
for(int i = 1; i < size; i++){
arr[i] = sc.nextInt();
difs[i-1] = Math.abs(arr[i] - arr[i-1]);
}
Arrays.sort(difs);
for(int i = 2; i < difs[0]+1 ; i++){
boolean check = true;
for(int df: difs){
if(df % i != 0){
check = false;
break;
}
}
if(check)
System.out.print(i+" ");
}
}
}
더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest
'Baekjoon' 카테고리의 다른 글
[백준3036] 링 / Java (0) | 2021.02.17 |
---|---|
[백준2609] 최대공약수와 최소공배수 / Java (0) | 2021.02.17 |
[백준11653] 소인수분해 / Java (0) | 2021.02.17 |
[백준1037] 약수 / Java (0) | 2021.02.17 |
[백준5086] 배수와 약수 / Java (0) | 2021.02.17 |