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 |
29 | 30 | 31 |
Tags
- Swift 문법
- global soop
- ObservedObject
- 데이터베이스 공부
- Apple Developer Academy @ POSTECH
- OS
- 제앱소
- 운영체제
- apple developer academy 후기
- 소프트웨어분석및설계
- 애플 디벨로퍼 아카데미 21주차 회고
- sqoop
- 애플 디벨로퍼 아카데미 후기
- Swift 기능
- useReducer
- Swift 디자인패턴
- iOS 개발 오류
- ObservableObject
- 치지직
- 앱 비교 프로젝트
- StateObject
- 애플 디벨로퍼 아카데미
- react
- 네이버 부스트캠프
- 숭실대
- SWIFT
- 데이터베이스
- swift문법
- 네이버 치지직
- 애플 아카데미 후기
Archives
- Today
- Total
사과하는 제라스
[백준 BOJ 1978번] 소수 찾기 본문
목차
728x90
반응형
출처 : https://www.acmicpc.net/problem/1978
1. 문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
2. 입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
4
1 3 5 7
3. 출력
주어진 수들 중 소수의 개수를 출력한다.
3
4. 풀이
이 문제의 가장 핵심은 소수를 찾는 것이다. 이를 찾는 방법 2가지를 찾아보았다.
1. 배수를 활용한 정답지 만들기
이 방법은 범위 내의 숫자들 중 미리 소수를 찾아내고 이들 인덱스의 Boolean 배열의 값은 True, 소수가 아닌 index는 False로 둔 다음에 주어지는 숫자들에 대해 T/F 검사만 진행하여 소수 판별을 하는 것이다.
2. 약수를 활용하여 걸러내기
일단 위 방법과 달리 소수인지 여부를 아예 모르고 있는 상태에서 주어지는 임의의 숫자 A에 대해서 2부터 A-1까지 나눠보는 방식이다. 만약 나누어 떨어지는 숫자가 있다면 A는 그 숫자의 배수이므로 소수가 아니게 되는 것이다.
5. 소스코드
1. 배수를 활용한 정답지 만들기
import java.io.*;
import java.util.*;
class Main{
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); //N은 받아올 숫자 개수
int [] nums = Arrays.stream((br.readLine().split(" "))).mapToInt(Integer::parseInt).toArray(); //받아온 숫자들에 대한 배열 nums
Boolean [] tf = new Boolean[1001]; //true false 구분할 boolean형 배열
for(int i=0; i<1000; i++) tf[i] = true; //tf배열 true로 초기화
for(int i=2; i<=500; i++){ // i의 배수들은 모두 false화
for(int j=2; j<=500; j++){ //i에 대한 배수 정의를 위한 for문
if(i*j>1000) break;
tf[i*j] = false; //i*j는 소수가 아니므로 인덱스가 i*j-1인 tf는 false값 넣어줌.
}
}
tf[1] = false;
int count = 0;
for(int i=0; i<N; i++){
if(tf[nums[i]] == true) count += 1;
}
System.out.println(count);
}
}
2. 약수를 활용하여 걸러내기
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int [] nums = Arrays.stream((br.readLine().split(" "))).mapToInt(Integer::parseInt).toArray();
int count = 0;
for(int i=0; i<N; i++){
count += 1; //
if(nums[i]==1) count -=1;
else{
for(int j=2; j<nums[i]; j++){ //주어진 수보다 작은 수들 중 1을 제외하고 나눠떨어지는 경우가 하나라도 존재하면 소수가 아니다.
if(nums[i]%j==0) {count -=1; break;}
}
}
}
sb.append(count);
System.out.println(sb);
}
}
6. 배운 것
int [] nums = Arrays.stream((br.readLine().split(" "))).mapToInt(Integer::parseInt).toArray();
라는 식을 활용한다면 띄어쓰기를 적용하여 한 줄에 입력한 데이터들을 String형 배열에 넣고 그걸 다시 int형 배열로 옮기는 수고를 줄일 수 있다.
728x90
반응형
'JAVA 백준 알고리즘 문제풀이 > 기본 수학' 카테고리의 다른 글
[백준 BOJ 1929번] 소수 구하기 (0) | 2021.10.20 |
---|---|
[백준 BOJ 1712번] 손익분기점 (0) | 2021.10.15 |