본문 바로가기
👋국비 후기 모음👋 (이력도 확인 가능!)
개발/자바

자바 반복문 예제들 (최소공배수, 최대공약수, 1~n 사이의 소수 구하기)

by 킴뎁 2021. 1. 14.
728x90
반응형

[내 소개..?? 겸 국비 일주일 후기]


최소공배수

Q. 두 수를 입력받아 최소공배수를 구해보자.

접근법

  1. 두 수를 입력받는다.
  2. 둘 중 큰 수를 찾는다.
  3. 큰 수를 시작값으로 1씩 증가시키며 무한 반복한다.(int i). 최소공배수는 큰 수보다 작을 수 없기 때문
  4. i를 두 수로 각각 나눠 나머지가 0일 때까지 반복한다. (&&연산자 사용)
  5. 최소공배수 발견. (출력 후 break;로 프로그램 중단)
import java.util.Scanner;

public class 최소공배수 {
	public static void main(String[] args) {
		
        //1. 두 수를 입력받는다.
		Scanner sc = new Scanner(System.in);
		System.out.print("num1: ");
		int num1 = sc.nextInt();
		System.out.print("num2: ");
		int num2 = sc.nextInt();
		
		int max; //둘 중 큰 수 변수 선언
		int resMin=0; //최소공배수 변수 선언
		
        // 둘 중에 큰 수 찾기
		if(num1>=num2) {
			max = num1;
		} else {
			max = num2;
		}
		
		for(int i=max; i>=max; i++) { //큰 수를 시작값으로 1씩 증가하는 무한반복
			if(i%num1==0 && i%num2==0) { //두 수를 각각 i로 나눈 나머지가 0일때까지 반복
				resMin = i;	// if의 조건식이 성립하는 조건이 곧 최소공배수
				break;		// 프로그램 종료.
			}
		}
		System.out.println(num1 + "," + num2 + "의 최소공배수: " + resMin);
        -----------------------------------
        결과값
        num1: 18
        num2: 24
        18,24의 최소공배수: 72

최대공약수

Q. 두 수를 입력받아 최대공약수를 구해보자.

접근법 - 최소공배수와 비슷하게 접근해보자.

  1. 두 수를 입력받는다.
  2. 둘 중 작은 수를 찾는다.
  3. 시작값을 1로 작은 수까지 반복한다. (int i) 최대공약수는 작은 수보다 클 수 없기 때문
  4. 두 수를 i로 각각 나눈다.
  5. i를 최대공약수 변수값에 계속 저장한다.(반복이 끝날 때까지)
import java.util.Scanner;

public class 최대공약수 {
	public static void main(String[] args) {
		
       		// 두 수를 입력받는다.
		Scanner sc = new Scanner(System.in);
		System.out.print("num1: ");
		int num1 = sc.nextInt();
		System.out.print("num2: ");
		int num2 = sc.nextInt();
		
		int min; //둘 중 작은 수 변수 선언
		int resMax = 0; //최대공약수 변수 선언
		
       		 // 둘 중에 작은 수 찾기
		if(num1<=num2) {
			min = num1;
		} else {
			min = num2;
		}
		
		for(int i=1; i<=min; i++) { //i를 작은수까지 반복한다.
        
        	// 두 수를 각각 i로 나눠 나머지가 0인 값을 최대공약수 변수에 저장.
			if(num1%i==0 && num2%i==0) { 
				resMax = i; 	//마지막으로 저장되는 값이 최대공약수
			}
            
		}
        
		System.out.println(num1 + "," + num2 + "의 최대공약수: " + resMax);
	}
}
        --------------------
        결과값
        num1: 24
        num2: 18
        24,18의 최대공약수: 6

최대공약수는 최소공배수 구할 때와는 조금의 차이점이 보인다. 최소공배수는 구하자마자 break;를 사용해 프로그램을 종료해준다. 그렇지만 최대공약수는 두 수의 가장 작은 약수인 1부터 차근차근 최대공약수 변수에 저장을 해준다.

 

위의 식을 예로 들면

24와 18일 경우, resMax값은 처음엔 1이 저장되고 그 담엔 2 , 4, 6 까지 저장된 후로도 계속 for문이 반복된다.

1, 2, 3, (4), (5), 6, (7), (8)...생략할 뿐  결국 for문은 끝까지 실행된다. 최종적으로 6이 저장되었다 하더라도 거기서 끝내지 말고 개발자적인 사고방식을 추구해보자. for문의 원리를 생각하며 이해하는 방식으로 풀어봤다.


소수

Q. 1에서부터 입력받은 어떤 수까지 내에 있는 소수를 찾아보자.

이 문제는 아직 못 풀었다. 입력받은 수가 소수인지 아닌지 판별하는 건 강사님의 힌트를 통해서 작성해보았다.

 

  • 소수는  약수가 1과 자기 자신 뿐인 자연수. 그 외의 다른 약수가 존재하면 소수가 아님.
  • 입력받은 수를 i로 나누었을 때 0일 경우가 존재하면 소수가 아님. (단 1과 자기 자신은 제외)
  • 1과 자기 자신을 제외할 때까지 반복하려면 시작값을 2 끝값을 (자기 자신-1)까지 설정.
  • 소수가 아닐 경우 break;로 for문 종료. 소수일 경우 소수 변수에 입력받은 수를 대입.
  • 출력 시 문제가 되지 않도록 boolean flag 변수 선언을 해 주었다. (flag는 아래에 설명)

 

import java.util.Scanner;

public class Q5 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("수를 입력: ");
		int num = sc.nextInt();
		
		int prime=0;
		
		boolean flag = false;
		
		for(int i=2; i<=(num-1); i++) {
			if(num%i==0) {
				flag = false;
				System.out.println(num + " : 소수가 아닙니다.");
				break;
			} else {
				flag = true;
				prime = num;
			}			
		}
		if(flag == true) {			
			System.out.println(prime + " : 소수입니다.");
		}
		
		
	}
}

flag란?

다른 프로그램이나 다른 로직에 신호를 남기거나 보내기 위해 사용하는 값(변수)
프로그램에서는 주로 boolean 변수로 사용한다.
깃발을 신호용으로 ( ex - 경주, 함선 간 신호, 전투 시의 신호) 쓰곤 하던 전통에서 따온 용어.
  • 프로그램 로직이 끝나는 시점과 결과값이 나오는 시점이 다를 때 사용하면 편리.
  • 프로그램 로직을 처리하는 도중 결과값이 나오지만 결과값에 상관없이 끝까지 실행되어야 하는 경우 결과값을 플래그로 저장해놓는다.

문제 해결!!

Q. 1에서부터 입력받은 어떤 수까지 내에 있는 소수를 찾아보자.

어제 포기했던 문제를 오늘 리프레쉬한 상태로 다시 고민해보고 풀어냈다.

import java.util.Scanner;

public class Q5 {
	public static void main(String[] args) {
		
        	//수를 입력받자
		Scanner sc = new Scanner(System.in);
		System.out.print("수를 입력 >> ");
		int input = sc.nextInt();
		
		int primeNum; //소수 변수 선언
		boolean isPrimeNum = false; //소수에 대한 flag 변수
		
		System.out.println(2 + "\t- 소수O"); //2는 소수이므로 미리 출력.
		
        	//1부터 입력받은값(input) 사이의 소수를 구하므로 input까지 반복.
		for(primeNum=1; primeNum<=input; primeNum++) { 
			
			for(int i=2; i<=input-1; i++) { //1과 자기자신은 미포함시킨다. (약수이므로)
				if(primeNum>i) { //primeNum을 i로 나눈 나머지를 구해야하므로 primeNum>i
					if(primeNum%i==0) { //-> i는 primeNum의 약수라는 뜻.
						isPrimeNum = false; //즉, 소수가 아님.
						break;
					} else {
						isPrimeNum = true; //-> 소수임.
					}
				} else { 
					break;
				}
			}
            
			if (isPrimeNum == true) { 
				System.out.println(primeNum + "\t- 소수O");
			} 
            
		}
	}
}
---------------------------
결과값
수를 입력 >> 15
2	- 소수O
3	- 소수O
5	- 소수O
7	- 소수O
11	- 소수O
13	- 소수O
---------------------------
결과값
수를 입력 >> 50
2	- 소수O
3	- 소수O
5	- 소수O
7	- 소수O
11	- 소수O
13	- 소수O
17	- 소수O
19	- 소수O
23	- 소수O
29	- 소수O
31	- 소수O
37	- 소수O
41	- 소수O
43	- 소수O
47	- 소수O

최대한 자세히 설명을 달아놨다. 충분히 이해할 수 있을 것이다..


kimdevel.tistory.com/36

6일차 후기.

 

자바 국비 6일차. 반복문.. 후...

21.01.14 반복문을 드디어 나갔다. For문 / While문 / Do-While문. 독학할 때 이 부분을 나름 열심히 팠다. 그래서 그런지 나름 수업시간에 이해도 잘 됐고 연습문제도 잘 풀어나갔다. 구구단 만들기, 어

kimdevel.tistory.com


[내 소개..?? 겸 국비 일주일 후기]

 

자바 국비 일주일 후기

[자바 국비 한달 후기] [자바 국비 50% 후기] 자바 국비지원을 다닌 지 일주일이 지났다. 진짜 많은 걸 배웠다. 자바, 이클립스 설치, 자바 프로그램 개발(실행) 과정(컴파일), 데이터 타입, 변수, 스

kimdevel.tistory.com

반응형
👋국비 후기 모음👋 (이력도 확인 가능!)

댓글