2023-05-03 수
반복문 do-while문
- do-while문은 최소한 한번은 실행되는 while문이다.
- do-while문은 사용자의 입력을 받아 실행하는 코드를 만드는 경우 주로 사용된다
- 사용자의 입력을 받아 실행하는 코드의 경우 입력 값이 유효한지 안한 지는 사용자가 입력한 후에 알 수 있다.
- do-while 문 사용 예시
: do- while문은 프로그래밍에서 자주 사용되는 제어문 중 하나입니다.
예를 들어 ‘요금안내’, ‘AS접수’, ‘상담원 연결’의 세가지 메뉴가 있는 핸드폰 고객센터 1500-0000에 전화를 걸어 서비스를 받고 싶을 때 일단 번호를 눌러야 해당 메뉴로 이동하던지, 잘못된 번호라고 안내를 해 준다던지 등 시스템이 반응할 수 있습니다.
- do-while문 기본 구문
do {
// 이 영역의 코드 실행하기
// ex) 입력 받기
} while (조건식);
→ 조건식은 불리언(Boolean) 값을 반환해야 합니다.
→ 조건식이 거짓(false)이면 do-while블록을 빠져나와 다음 코드로 진행합니다. 조건식이 참(true)이면 do-while블록 내의 코드를 반복해서 실행합니다.
→do-while문은 while문과 유사하지만, 조건식 검사가 do-while문에서는 나중에 발생하기 때문에 무조건 한번은 실행됩니다.
while문 VS do-while문
<aside> 📍 →while문은 while(조건식)으로 시작해 반복하는 영역이 나오지만, do-while은 do로 시작하고 반복 영역이 나온 후 while(조건식)이 나옵니다.
</aside>
예제)
Scanner sc = new Scanner(System.in);
int input;
do{
System.out.println("짝수를 입력하세요: ");
input = sc.nextInt();
}while(input % 2 != 0);
System.out.println("올바른 짝수가 입력되었습니다: " + input);
<aside> 💻 실행결과 : 짝수를 입력하세요: 3 짝수를 입력하세요: 4 올바른 짝수가 입력되었습니다: 4
</aside>
약수 구하기
- 약수는 어떤 수를 나누어 떨어지게 하는 수입니다.
예를 들어, 6의 약수로는 1, 2, 3, 6 이 있습니다.
4와 5가 약수가 아닌 이유는 6을 4 또는 5로 나누면 나누어 떨어지지 않고 나머지가 생기기 때문입니다.
📍 약수 구하는 방법 %연산으로 나머지를 구했을 때 0이 나오면 나누어 떨어진다고 할 수 있습니다.
그래서 %연산의 결과로 0이 나오는 i만 출력해 주면 약수를 구할 수 있습니다.
예제)
public class Factor {
public static void main(String[] args) {
int n = 36;
for (int i = 1; i <= n; i++) {
System.out.printf("%d %% %d = %d\\n", n, i, n % i);
}
}
}
💻 실행결과 : 36 % 1 = 0 36 % 2 = 0 36 % 3 = 0 … 중략 … 36 % 33 = 3 36 % 34 = 2 36 % 35 = 1
- 약수의 합 구하기
public class SumOfFactors {
public static void main(String[] args) {
int num = 6;
int answer = 0;
for (int i = 1; i <= 6; i++) {
if(num % i == 0){
answer += i;
}
}
System.out.println(answer);
}
}
💻 실행결과 : 12
- 약수만 출력하는 방법
public class Factor3 {
public static void main(String[] args) {
int n = 36;
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
System.out.printf("%d ", i);
}
}
}
}
💻 실행결과 : 1 2 3 4 6 9 12 18 36
💡 if(n % i == 0) 에 의해 나누어 떨어졌을 때의 i만 출력하여 36의 약수 1 2 3 4 6 9 12 18 36이 출력되는 것을 볼 수 있습니다.
소수 판별 : N 까지 검색
import java.util.Scanner;
public class IsPrime {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int factors = 0;
for(int i = 2 ;i < num; i++){
if(num % i == 0){
factors++;
}
}
System.out.println(factors == 0? n+"은 소수입니다.":n+"은 소수가 아닙니다.");
}
}
💻 실행결과 : 7
7은 소수입니다.
6
6은 소수가 아닙니다.
- 시간 복잡도
→ 위의 자바 코드에서 num 보다 작은 자연수를 2부터 차례대로 나누어 보는 방식을 사용하고 있습니다.
이 방식은 각각의 자연수마다 최대 num-2번의 나눗셈 연산을 수행하므로, 시간 복잡도는 즉 O(n)이 됩니다.
import java.util.Scanner;
public class isPrimeDivide2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int factors = 0;
**for (int i = 2; i <= num / 2; i++)** {
if (num % i == 0) factors++;
}
System.out.println(factors == 0 ? "prime" : "not prime");
}
}
💻 실행결과 : 7
prime
6
not prime
소수 판별 시 n /2 까지만 검색해도 되는 이유는 ?
소수는 자기 자신과 1 이외의 자연수로는 나누어 떨어지지 않는 수
따라서, n보다 작은 모든 짝수는 n의 약수가 될 수 없기 때문입니다.
📌 for (int i = 2; i <= num / 2; i++)
삼항 연산자
→ 자바에서 삼항 연산자는 ?: 기호를 사용하여 구현합니다. 삼항 연산자는 if-else문을 간결하게 표현 할 수 있습니다.
- 일반적인 if-else 문
if (조건식) {
변수 = 값1;
} else {
변수 = 값2;
}
변수 = 조건식 ? 값1 : 값2;
예제)
int a = 10, b = 20;
int max = (a > b) ? a : b;
System.out.println(max); // 출력 결과: 20
반복문 제어 break;
```java
// for 문에서 break 로 반복문 멈추기
public class ForBreak {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if(i == 5){
break;
}
System.out.printf("%d ", i);
}
}
}
<aside>
💻 실행결과 :
0 1 2 3 4
</aside>
- `break;`
→ for문이나 while문과 같은 반복문 내에서 break;를 작성하여 실행을 멈출 수 있다.
# 반복문 제어 continue; (계속하기)
```java
public class ForContinue {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if(i == 5){
continue; // i 가 5 일때 continue
} // 5 만 넘어가고 다음 반복을 계속 진행
System.out.printf("%d ", i);
}
}
}
💻 실행결과 : 0 1 2 3 4 6 7 8 9
- continue;
→ for문이나 while문과 같은 반복문 내에서 위와 같이 continue;를 작성하여 실행을 이어 갈 수 있다.
💻
⇒ break; : 만나는 즉시 반복문 전체 탈출
⇒ continue; : 만나면 해당 반복 부분 탈출 후 다음 반복 실행