오늘의 학습 키워드
</> 완전 탐색
공부한 내용 본인의 언어로 정리하기
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[5];
int count = 0;
int result = 0;
for(int i = 0; i < 5; i++){
arr[i] = sc.nextInt();
}
while(true){
//1부터 시작
result++;
count = 0;
for(int i = 0; i < 5; i++){
if(result >= arr[i] && result % arr[i] == 0){
count++;
}
}
if(count > 2){
break;
}
}
System.out.print(result);
}
}
오늘의 회고
오늘 문제는 완전탐색(Brute Force)문제이며 서로 다른 다섯 개의 자연수가 주어질 때, 적어도 배부분의 배수를 출력하는 프로그램을 작성하는 것이다.
여기서 번역을 개떡같이 해놓아서 처음에 무슨 말인가 싶었다. "적어도 대부분의 배수를 출력"이라는 말은 입력되는 수가 5이니 입력되는 예제의 3개 이상의 최소 공배수를 구하라는 말이다.
오늘도 백준 문제였기 때문에 예제 입력을 Scanner로 받아오도록 했다. 물론 BufferedReader도 있고 StringTokenizer도 있지만 그냥 Scanner로 쓰고 빨리 끝내고 싶었다.
주어지는 예제가 5개 이므로 입력값들을 저장해줄 배열 arr의 크기를 5로 제한해주고 몇개의 입력값이 나누어 떨어지는지 체크해 줄 변수 count와 결과값을 저장할 변수를 초기화 해주었다.
int[] arr = new int[5];
int count = 0;
int result = 0;
그리고 예제를 입력한 배열을 만들어준다.
for(int i = 0; i < 5; i++){
arr[i] = sc.nextInt();
}
이제 예제와 필요한 값들을 만드는 과정은 끝이 났다.
이제 핵심인 완전탐색으로 조건을 만족하는 값을 구해내어야한다. 몇에서 3개 이상이 나눠질지 모르기 때문에 3개 이상 나눠질때 까지 무한루프 시켜준다. 조건은 예제 5개의 값을 모두 비교를 해주는데 3개 이상 나눠지지 않으면 count를 0으로 초기화 해주면서 계속 반복해준다.
while(true){
result++;
count = 0;
for(int i = 0; i < 5; i++){
if(result >= arr[i] && result % arr[i] == 0){
count++;
}
}
if(count > 2){
break;
}
}
모든 과정이 끝났으므로 result를 출력해주면 성공이다.
System.out.print(result);
AI 코드리뷰
현재 코드의 장점
현재 코드의 단점
시간 복잡도
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[5];
int result = 1;
for (int i = 0; i < 5; i++) {
arr[i] = sc.nextInt();
}
// 오름차순 정렬
Arrays.sort(arr);
while (true) {
int count = 0;
for (int i = 0; i < 5; i++) {
if (result % arr[i] == 0) {
count++;
}
}
if (count >= 3) {
break;
}
result++;
}
System.out.print(result);
}
}
현재 코드의 장점
현재 코드의 단점
시간 복잡도
추가 개선 (심화)
문제를 근본적으로 해결하기 위해서는, 브루트 포스 방식에서 벗어나 수학적인 방법(최소공배수 계산 등)을 활용하는 것이 좋습니다. 하지만 이 경우 문제의 조건을 넘어서는 큰 변화가 필요할 수 있습니다.
내일 공부할 것 :
다른 방식으로도 풀어보고 복습하기
문제