Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- FND
- stop watch
- ATMEGA128A
- Pspice
- structural modeling
- KEYPAD
- D Flip Flop
- ring counter
- hc-sr04
- BASYS3
- gpio
- prescaling
- half adder
- Recursion
- Algorithm
- vivado
- behavioral modeling
- pwm
- i2c 통신
- atmega 128a
- Edge Detector
- LED
- soc 설계
- test bench
- dataflow modeling
- uart 통신
- Linked List
- DHT11
- verilog
- java
Archives
- Today
- Total
거북이처럼 천천히
알고리즘 (6월 19일) 본문
1. 문제 (최대 소수값을 찾기)
2. 생각
- 배열의 사이즈를 입력과 배열의 원소들을 입력받아 변수와 배열에 각각 저장한다.
- for문을 이용하여 시작점(i)을 정의하고, 끝점(j)을 정의한다.
- 이전까지의 값에 10을 곱한 뒤, 새로운 원소를 더해가며 원소들을 합한다.
(▶ sum = sum*10 + storage[j] ) - 2부터 sum까지 for문과 나머지연산자를 이용하여 해당 숫자(sum)이 소수인지 판단
( 소수가 아니면 isPrim = true, 소수이면 isPrim = false ) - 만약, 해당 숫자(sum)이 소수인 동시에 max보다 크면 max값을 해당숫자로 대체한다.
- 결과 출력
3. 풀이 및 코드 분석
import java.util.Scanner;
public class programming {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 사이즈 입력
System.out.print("배열의 사이즈 입력:");
int size = scan.nextInt();
int[] storage = new int[size];
// 원소 입력
System.out.print("원소 입력:");
for(int i=0; i<size; i++)
storage[i] = scan.nextInt();
scan.close();
int max = 0;
for(int i=0; i<size; i++) {
int sum = 0;
for(int j=i; j<size; j++) {
sum = sum*10 + storage[j];
boolean isPrim = true;
for(int l=2; l*l<=sum&&isPrim; l++)
if(sum%l==0)
isPrim = false;
if(sum>max&&isPrim&&sum!=1)
max=sum;
}
}
if(max==0)
System.out.println("최대 소수값은 존재하지 않습니다.");
else
System.out.println("1개 이상의 연속된 정수값들을 합하여 얻을 수 있는 최대 소수값:"+max);
}
}
4. 메모
- 위 문제에는 한 가지 오류와 한 가지 한계점이 존재한다.
- 오류는 1을 소수로 인식한다는 점이다. 왜냐하면 소수 판별과정에서 sum = 1인 경우, l이 2부터 시작하는데, 당연하게도 2는 1보다 크기 때문에 소수 판별하는 for문이 동작하지 않기 때문이다. 따라서 sum=1은 isPrim=true 상태를 유지하면서 max값보다 큰지 판별하게 되어 1을 소수로 인식한다.
- 위 오류를 방지하기 위해서 sum = 1이 아닌 경우에만 max 값보다 큰지 판별하도록 설계
- 한계점은 int 자료형의 정수 표현 범위이다. int 자료형은 4바이트이기 때문에 -2^31 ~ 2^31까지만 표현이 가능하다. 따라서 int 자료형의 점수 표현 범위를 넘게 되면 더 이상 의미없는 숫자가 들어가기 때문에 한계점이라고 할 수 있다.
- 물론 long 자료형을 통해 범위를 넓힐 수는 있지만, long 자료형의 범위을 넘는 숫자가 들어오면 또 한 번 한계점에 도달하기 때문에 해결책이라고 보기 어렵다.
'Algorithm > 알고리즘 문제 풀이' 카테고리의 다른 글
알고리즘 (6월 29일) (0) | 2022.06.30 |
---|---|
알고리즘 (6월 22일) (0) | 2022.06.23 |
알고리즘 (6월 16일) (0) | 2022.06.16 |
알고리즘 (6월 15일) (0) | 2022.06.15 |
알고리즘 (6월 13일) - (3) (0) | 2022.06.13 |