[JAVA][정올 1901] 소수 구하기
- 알고리즘
- 2021. 1. 13.
SHORTCUT
반응형
사이트명 | 정올 |
문제 링크 | jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1174&sca=2040 |
주요 알고리즘 | #수학 |
사용 언어 | Java 자바 |
설명이 장황합니다.. 도움되는 것만 파악하세요 :-) |
1. 문제
2. 입력 / 출력
3. 풀이
3-1. 생각 노트
일단 하나씩 줄어드는 거 먼저 확인.
그 때의 카운트를 체크하여, 올라가는 거를 다시 확인.
두 경우의 카운트를 비교하여 출력값 결정.
3-2. 변수명
type | 변수명 | 설명 |
int | cnt | 내려가면서 체크할 때의 카운트 |
cnt2 | 올라가면서 체크할 때의 카운트 |
3-3. 코드 보기
/**************************************************************
Problem: 1901
Language: Java
Result: Success
Time:789 ms
Memory:20096 kb
****************************************************************/
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // 처리해야 할 수의 개수 (100 이하 정수)
int[] answer = new int[2];
for (int tc = 0; tc < N; tc++) {
int num = sc.nextInt();
// 자신부터 내려가며 체크
int cnt = 0;
here1: for (int g = num; g > 1; g--) {
cnt++;
// 소수 판별 -> 통과? 정답
for (int p = 2; p < g; p++) {
if (g % p == 0) {
continue here1;
}
}
answer[0] = g;
break;
}
// 소수가 없을 경우, cnt 를 최대값으로 설정하여 오름체크 아웃을 거름
if (answer[0] == 0) {
cnt = Integer.MAX_VALUE;
}
//자신부터 올라가며 체크
int cnt2 = 0;
here2: for (int k = num; num <= 1000000; k++) {
cnt2++;
// 앞서 찾은 카운트보다 더 커진 경우 -> 작은 쪽의 소수를 출력
if (cnt2 > cnt) {
System.out.println(answer[0]);
break;
}
// 소수 판별 -> 통과? 정답
for (int p = 2; p < k; p++) {
if (k % p == 0) {
continue here2;
}
}
answer[1] = k;
// 같은 카운트 일 경우
if (cnt2 == cnt) {
if(answer[0] == answer[1]){ // 답이 같으면, 하나만 (num 자체가 소수)
System.out.println(answer[0]);
}else { // 정답 정렬해서 출력
Arrays.sort(answer);
System.out.println(answer[0] + " " + answer[1]);
}
// 그 외 경우, 오름체크에서 찾은 소수가 정답
}else {
System.out.println(answer[1]);
}
break;
}
}
}
}
3-4. 마무리
되게 간단한 문제인데, 의외로 예외 상황에 대한 생각이 잘 안섰다..
정올이 어떤 테케에서 틀렸는지를 알려줘서 망정이지, 안그랬으면 헤맸을것같다..
멀었다 멀었어.
다음번엔 소수 판별하는 메소드를 만들어서 코드 가독성 좀 높여야겠다.
반응형