[Java] 소수 구하기_for문 / if문 / break / boolean 활용

JTI·2022년 10월 7일
1

📌 Code list

목록 보기
13/55
post-thumbnail

2와 100 사이에 있는 모든 소수를 찾는 프로그램을 작성하라.
주어진 정수 k를 2부터 k-1까지의 숫자로 나누어서 나머지가 0인 것이 하나라도 있으면 소수가 아니다.

✏️ break 이용

public class Test
	public static void main(String[] args) {
		
		System.out.print("2부터 100사이의 모든 소수: ");

		for (int i = 2; i <= 100; i++) {
			for (int j = 2; j <= 100; j++) {
				if (i != j && i % j == 0) { // i와 j가 같은 숫자가 아닌 다른 숫자와 나눴을 때 나머지가 0일 경우,
					break; // 출력 X 소수가 아닌 것.
				
                } if (i == j) { // 같은 숫자이면 출력 ex) 2 % 2 = 0 / 3 % 3 = 0
					System.out.print(i + " ");
				}	
			}
		}
	}
}

💡 소수는 1과 자기자신 이외에는 약수(나눠지는 수)를 가지고 있지 않는 수이다.

우선 2~100까지 순환하는 for 문을 2개 만든다.
이유는 어떤 수 i가 나눠지는 수 j를 검사하기 위해서 2개의 인자가 필요하기 때문이다.
i라는 수를 2부터 시작되는 j라는 수로 하나하나 나눠보는 것이다.

만약 i 와 j가 같아지기 전에 나눠지는 수가 하나라도 나오게 되면 break를 만나게 된다.
그럼 출력을 하기 전에 for(j)문을 빠져나와서 숫자가 출력이 안되게 하는 것.

그러면 당연히 i와 j가 같아지는 수들만이 두번째 if문을 통과해서 출력이 된다.


✏️ boolean 이용

또 다른 식으로도 소수를 구할 수 있다.

boolean 변수를 둬서 true / false 이용

public class Test {
	public static void main(String[] args) {
		
		for (int i = 2; i <= 100; i++) {
			boolean count = true;
			
            for (int j = 2; j < i; j++) { // j < i 조건이랑 i != j 랑 동일. (자신(i)과 같은 숫자가 나오기 전에 컷)
				if (i % j == 0) {
					//i는 소수가 아니다.
					count = false;
				}
			}
			//소수 판별가능.
			if (count) {
				System.out.println(i);
			}
		}
	}
}
if (count = true) { // 숫자 다나옴
	System.out.println(i);
}

여기서 만약 count = true로 조건을 달면 어떻게 될까?
결론적으로 소수가 아닌 것이 걸러나오지 않고 다 나오게 된다.
이유는 저건 무조건 true되는 식이다.
일단 count에 true가 대입되고 판정하기 때문에 무조건 true가 된다.
그래서 모든 숫자가 true 형식으로 다 나오게 된다.


여기서 또 반복을 덜 돌기 위해 더 나은 코드를 짤 수 있다.

우리는 소수를 구하는 코드를 짤때, 두가지의 의문을 품을 수 있다.

  1. i가 6인경우 2로 나누어 떨어진다. 그러면 3으로 해 볼 필요가 있는가?🤔
  2. i가 100인경우 50(i / 2)보다 큰 값을 나누어 볼 필요가 있는가?🤔

그럼 이를 바탕으로 코드를 다시 짜보자.

public class Test {
	public static void main(String[] args) {
		
		for (int i = 2; i <= 100; i++) {
			boolean count = true;  // 소수로 가정
			for (int j = 2; count && j <= (i / 2); j++) { 
				if (i % j == 0) {
					count = false;
				}
			}

			if (count) {
				System.out.println(i);
			}
		}
	}
}

💡 for (int j = 2; count && j <= (i / 2); j++)

  • count가 밑에 소수가 아닌것이 판별나면 (false값으로 바뀌면)
    바로 빠져나오도록 설정. (의문 1번 해결)
  • i / 2는 전체 100에서 2로 나눈 값. (의문 2번 해결)

이런식으로 반복을 좀 더 줄여가며 더 나은 코드로 발전시킬 수 있다!

profile
Fill in my own colorful colors🎨

0개의 댓글