TIL

day13 TIL

dalooong 2023. 7. 7. 01:05

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; : 만나면 해당 반복 부분 탈출 후 다음 반복 실행