원하는 결과:
실수는 1과 자신 외에 나눠지는 값이 없는 1보다는 큰 자연수.
즉 자신 이외의 숫자로 나눴을 때 나눠지면 실수가 아닌 것.
그것에 입각해서 코드를 구현한다.
답:
public class Prob006_method {
public static void main(String[] args) {
System.out.println("<< 15 까지의 소수 >>");
primeNumber(15);
System.out.println("<< 32 까지의 소수 >>");
primeNumber(32);
}
private static void primeNumber(int num) {
// 구현하세요.
for (int i = 2; i <= num; i++) {
for (int j = 2; j <= i; j++) {
if ((i % j) == 0) {
if (j == i) {
System.out.print(i + ", ");
} else {
break; // 반복문에서 빠져나옴
}
}
}
}
System.out.println();
}
}
풀이
- 일단 1을 제외한 2부터 주어진 수 i를 뽑는 반복문을 만든다.
- 반복문이 돌면서 값을 하나씩 뽑아내면 값마다 2부터 자기 자신인 j를 하나씩 나눠보는 식을 구현한다.
- 자기 자신의 크기보다 작은 숫자들로 나눠지면 실수가 아니다. 일단 그 숫자들을 걸러내기 위해 if문으로 i 나누기 j를 했을 때 값이 떨어지는 수들을 걸러낸다.
- 나눠 떨어지는 숫자들 중에 서로가 같다면 실수가 맞으니 출력해줌. 그러나 나누어 떨어졌는데 서로가 같지 않다면 그 수는 실수가 아니기 때문에 더 볼 필요가 없으므로 break를 이용해서 반복문을 빠져나옴.
말로 설명하니까 더 어려워보여..ㅋㅋㅋㅋㅋ
예를 들자면 음 i가 4일 때 j는 i보다 같거나 작다고 지정되어있기 때문에 2,3,4까지 출력할 수 있음. 그러나 j가 4까지 간다면 i와 j는 나누어 떨어지고 또 서로 같은 수 이기 때문에 if문에서 출력해버림. 그러면 우리가 원하는 출력 값을 얻을 수 없음. 그러므로 4가 2에서 나눠졌을 때 그 이상 반복문을 돌리면 안 됨. 즉 j가 4까지 가게 해서는 안됨. 그래서 4가 2로 나눠졌을 때 if문으로 잡아서 break를 이용해서 내보내야 함. j 반복문을 종료시켜야 함.
그러면 i반복문이 실행이 될 거임. i는 5가 됨. 5는 실수라서 자기보다 작은 숫자로 나눠지지 않음. 그래서 j가 5가 될 때까지 반복문이 돌아감. 그리고 출력이 됨.
break를 모른다면 이해가 안 되는 코드임.
break를 알긴 알지만 제대로 감을 잡지 못한 상태였음.
그러니 break를 쓸 생각 전혀 못했음.
이 문제를 만나서 break에 대해 좀 더 알아갈 수 있는 기회가 되었음.
하하하
그렇게 헤매었는데.. 답보니 허탈하네
break를 이럴 때 쓰는구나...
이것도 매일 해본다 실시
+0404
이 코드를 구현하는 방법이 2가지 더 있다.
기존꺼보다는 덜 효율적일지도 모르지만..?
1.
2.
2번이 더 효율적인 방법
1번은 break를 else안에 넣어서 일단 i==j이면 실수가 맞아서 더이상 확인 안해도 되는데 반복문이 필요이상으로 계속 돌아가게됨.
2는 break를 작은 if에서 빼서 일단 i==j가 같다면 그 값을 출력하고 바로 빠져나올 수 있게끔 함.
i가 자신보다 작은 값으로 나눠진다면 그건 실수가 아님. 그래서 그럴때도 더이상 반복문 안 돌리고 빠져나오도록 일단 나눠지면 안쪽 if로 걸러내고 i==j에 해당안되니가 break로 바이바이
'study > JAVA' 카테고리의 다른 글
Java 반복되는 코드를 줄이자 리펙토링! (0) | 2022.03.31 |
---|---|
JAVA 종류별 값의 합 구하기(값 누적) (0) | 2022.03.31 |
Java 기초 배열 Array (0) | 2022.03.29 |
Java 기초 제어문 (0) | 2022.03.29 |
반복문 숙제 체크 (0) | 2022.03.29 |
댓글