Backend/JAVA

JAVA 코딩 제어문 - 반복문 : while, for, do ~ while문

쏠솔랄라 2023. 2. 6. 14:13

 

 

제어문

 

: 코드의 흐름을 제어하는 문장(문법)

 

코드의 일정 부분을 선택하여 실행하거나

코드의 일정 부분을 반복하여 실행하는 제어문

 

 

제어문의 종류

 

조건문

: if ~ else문

조건식의 결과가 참과 거짓에 따라 실행 내용을 선택하여 실행하는 제어문

조건문 설명 : https://developernew.tistory.com/13

 

선택문

: swich ~ case문

값에 따라 실행 내용을 선택하여 실행

선택문 설명 : https://developernew.tistory.com/14

 

반복문

: while, for, do ~ while

코드의 일정 부분을 반복하여 실행하는 제어문

조건식이 [참]일 동안 반복하여 실행한다 ; [거짓]이 될 때 종료함

반복문 설명: https://developernew.tistory.com/18

 

 


 

반복문 : while, for, do ~ while문

 

코드의 일정 부분을 반복하여 실행하는 제어문

조건식의 결과가 참일 동안 반복하여 실행한다

반드시 탈출 조건 또는 종료 지점을 만들어 주어야 한다

 

 

종류

while : 반복할 횟수가 일정하지 않을 때

do ~ while : 무조건 한 번은 실행을 해야하며 잘못된 데이터를 거를 때

for : 반복할 횟수가 일정할 때

 

 

while

반복할 횟수가 일정하지 않을 때

반복할 횟수를 모를 때

반복이 무한일 때

 

형식 :

while( 조건식 ) {

종속문장

}

 

->

조건식이 참이면 종속문장 실행

조건식이 참일 때까지 무한으로 실행

조건문이 거짓일 때 빠져나오게 된다

 

 

do ~ while

무조건 한 번은 실행을 해야 하며 잘못된 데이터를 거를 때 사용한다

while문과 구별하기 위해 조건식 옆에 ;을 적어 준다

종속문장이 먼저 실행이 되고 그 후에 조건식을 비교하는 형식

 

형식:

do {

종속문장;

}

while (조건식);

 

-> while(조건식)이 참이면 다시 do {}로 돌아가고

조건식이 거짓이 될 때 빠져나옴

 

 

for

반복할 횟수가 일정할 때

반복할 횟수를 알고 있을 때

반복이 유한할 때

괄호 안에 초기식과 조건식, 증감식들을 구별하기 위해서 반드시 세미콜론 두개가 필요

 

형식:

for (초기식; 조건식; 증감식) {

종속문장;

}

 

* 초기식

일반적으로 초기식부분에서 변수 선언을 한다

기존 데이터 공간을 가져와서 사용해도 된다

반복할 변수를 설정하는 부분 ; 반복의 시작

 

* 조건식

참일 때 실행해라

반복의 끝을 설정

단순한 조건식이 온다

 

* 증감식

일정하게 증가 또는 감소하는 식

일반적으로 증감연산자를 많이 사용

 

i++ i+=1 i==+1 0

i + i (x)

for를 만나는 순간 초기식을 가지고 조건식 비교 -> 조건식이 참이면 종속문장 실행 -> 종속문장 실행 후 증감식으로 반복

: 초기식 > 조건식 > 증감식 > 조건식 > 증감식 > ... > 조건식(거짓인 경우 종료)

 

ex.

 

for(int i = 0; i<5; i++) {

System.out.println(i);

}

 

for(float a = -0.36f; a>=-0.4; a-=0.01) {

System.out.println(a);

}

 

 

-> 모든 제어문은 중첩이 가능하다

다중 for문
for문 안에 for문이 있는 형태

외부 for문 종속문장 안에 내부 for문이 있는 형태
for문이 중첩적인 구조를 가지는 for문
총 반복횟수 : 외부 for문 * 내부 for문
외부 for문이 한 번 실행할 때마다 내부 for문은 한바퀴가 돈다

형식

for (초기식; 조건식; 증감식) {
종속문장;
for (초기식; 조건식; 증감식) {
종속문장;
}
}

 

 


 

 

Exercise 1

 

public class Test01 {

public static void disp(int i) {

}

public static void main(String[] args) {

 

예시1)

int i=0;

while (i < 5) {

System.out.println(i);

}

 

// 멈추는 조건이 없으므로 무한히 i값 출력

 

예시2)

int i = 0;

while (i < 5) {

System.out.println(i);

i++;

}

 

// 'i++'값을 부여해 i가 5 미만이 될 때까지 출력

 

 


 

 

Exercise 2

 

public class Test02 {

public static void disp(int i) {

}

public static void main(String[] args) {

 

예시1)

int i=0;

while(true) {

System.out.println(i);

i++;

}

// 무한히 출력하게 됨

 

예시2) 

int i = 0;

while(true) {

System.out.println(i);

i++;

if(i == 4){

break;

}

}

// i가 4가 되면 멈춤 ; 0, 1, 2, 3 출력

/*

지역변수 : 변수의 생성 위치

어느 지역 또는 영역에 속해서 그 지역 내에서 우선적으로 사용되는 변수

그 지역이 실행할 때 공간이 생성되고 , 그 지역이 끝날 때 공간이 소멸

*/

 

int i = 0; // main 메소드의 지역 변수

while(true) {

System.out.println(i);

if(i == 4){

break;

}

i++;

}

 

// 0, 1, 2, 3, 4 출력

 

int i = 0;

while(true) {

i++;

System.out.println(i);

if(i == 4){

break;

}

}

// 1, 2, 3,4 출력

 

 


 

 

Exercise 3

 

1부터 100까지의 정수를 출력하세요

 

int i1 = 1;

 

while (true) {

System.out.println(i1);

i1++;

if (i1 == 100 ) {

break;

}

}

 

// or

 

int i1a = 1;

 

while (i1a <= 100) {

System.out.println(i1a);

i1a++;

}

 

 


 

 

Exercise 4

 

1부터 10까지의 합 구하기
 

 

int i2 = 1;

int sum2 = 0;

 

while (true) {

sum2 += i2;

i2++;

 

if (i2 > 10) {

break;

}

}

System.out.println(sum2);

 

// or

 

int i2a = 1;

int sum2a = 0;

 

while (i2a <= 10) {

sum2a += i2a;

i2a++;

}

System.out.println(sum2a);

 

 


 

 

Exercise 5

 

10~20 사이의 숫자만 입력받아 1부터 입력 받은 수까지의 합을 구하시오

 

Scanner sc = new Scanner(System.in);

int user = 0;

while(true) {

System.out.println("10~20사이의 숫자를 입력하세요.");

user = sc.nextInt();

 

if(user >= 10 && user<= 20) {

break;

} else {

System.out.println("잘못된 값입니다. 다시 입력해주세요.");

}

}

 

int i3 = 1;

int sum3 = 0;

 

while (i3 <= user) {

sum3 += i3;

i3++;

}

System.out.println("1부터 입력한 값까지의 총 합 : " + sum3);

sc.close();

 

 


 

 

Exercise 6

 

어떤 수의 약수를 구하는 프로그램을 작성하여라
* 약수 = 어떤 수를 정수로 나눌 수 있는 수
 

Scanner sc = new Scanner(System.in);

System.out.println("약수를 구하려는 수를 입력하세요");

 

int user5 = sc.nextInt();

int i5 = 1;

 

while (i5 <= user5) {

 

if (user5%i5 == 0) {

System.out.println(i5);

}

i5++;

}

 

sc.close();

 

 

 

 

Exercise 7

 

두 수의 최소 공배수와 최대 공약수를 구하는 프로그램을 작성하라
최소공배수 = 공배수 중에서 가장 작은 정수
최대공약수 = 공약수 중에서 절대치가 가장 큰 수
 

import java.util.Scanner;

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

 

System.out.println("두 수를 입력하세요");

int user1 = sc.nextInt();

int user2 = sc.nextInt();

 

sc.close();

 

// 최대공약수

// Step1

int min; // user1과 2중 작은 수 찾기

 

if (user1 <= user2) {

min = user1;

} else {

min = user2;

}

 

// Step2

int i = 1; // 공약수

int gcm = 1; // i1과 i2의 최대공약수

 

while (true) {

if (user1%i == 00 && user2%i == 00) {

gcm = i;

}

i++;

 

if (i > min) {

break;

}

}

System.out.println("두 수의 최대공약수: " + gcm);

 

 

// 최소공배수

int lcm = (user1 * user2)/ gcm;

System.out.println("두 수의 최소공배수: " + lcm);

}

 

// or

 

import java.util.Scanner;

public static void main(String[] args) {

 

Scanner sc = new Scanner(System.in);

System.out.print("두개의 정수 입력 : ");

int a = sc.nextInt();

int b = sc.nextInt();

sc.close();

 

int big = (a > b) ? a : b;

int small = (a < b) ? a : b;

 

// System.out.println((a < b) ? a : b);;

// (a > b) ? System.out.println(a) : System.out.println(b);

 

int i = small;

 

while(i > 0) {

if(small % i == 0 && big % i == 0) {

System.out.println("최대 공약수는 " + i + "입니다.");

break;

}

i--;

}

 

i = 1;

 

while(true) {

if((big * i) % small == 0) {

System.out.println("최소 공배수는 " + (big * i) + "입니다." );

break;

}

i++;

}

}

 

 


 

 

Exercise 8

 

정수를 입력해 수를 거꾸로 출력하시오
출력만은 한개만 출력
출력은 while 밖에서 한 번

입력 : 12340
출력 : 04321
 

 

import java.util.Scanner;

public static void main(String[] args) {

 

Scanner sc = new Scanner(System.in);

 

System.out.println("정수 입력 : ");

int su = sc.nextInt();

 

String rev = "";

 

while (su !=0) {

rev += (su%10);

su /= 10;

}

 

System.out.println(rev);

 

sc.close();

 

 


 

 

Exercise 9

 

사용자가 틀릴 때까지 구구단 문제를 출제하는 프로그램 구현
(2 x 1 부터 19 x 9까지 구현)

사용자가 3문제를 틀리면 게임오버! 라는 메세지를 출력한 뒤 종료
종료 전에 정답 개수와 점수를 출력

[1] 일반 정답 +10점
[2] 어려운 문제 정답은 5점 추가 (총 15점) 11단부터~
 

package whileloop;

import java.util.Scanner;

public static void main(String[] args) {

 

Scanner sc = new Scanner(System.in);

 

int cnt1 = 0; //오답

int cnt2 = 0; //정답

int tot = 0;

int over = 3;

 

while (true) {

System.out.println("구구단의 답을 입력하세요");

int a = (int)(Math.random() * 18 + 2);

int b = (int)(Math.random() * 18 + 2);

int x = a*b;

System.out.println(a + " X " + b + " = ?");

 

int ans = sc.nextInt();

if (ans != x) {

tot-=5;

over --;

 

System.out.println("틀렸습니다. 5점 감점. " + over + " 회 남았습니다.");

cnt1++;

 

if (over == 0) {

System.out.println("게임 오버");

System.out.println("총 문제 개수 : " + (cnt1+cnt2));

System.out.println("총 정답 개수 : " + cnt2 + ", 총점 : " + tot);

break;

}

} else {

System.out.println("정답입니다! 10점 획득");

tot+=10;

cnt2++;

 

if (a >= 11 || b >=11) {

System.out.println("축하합니다! 어려운 문제를 맞춰 5점 추가 획득");

tot+=5;

}

}

}

sc.close();

}

 

 


 

Exercise 10

 

업다운 게임을 구현하려 합니다.
컴퓨터에게 1부터 100 사이의 정답을 생성하도록 코드를 구현한 뒤
사용자가 숫자를 입력하여 정답을 맞추도록 프로그래밍하세요

<게임의 상태>
[ 업 ] 사용자가 정답보다 낮은 값을 입력한 경우
[ 다운 ] 사용자가 정답보다 높은 값을 입력한 경우
[ 정답 ] 사용자가 정답과 같은 값을 입력한 경우, 게임 종료

게임 종료시 총 입력한 횟수를 화면에 출력
 

import java.util.Scanner;

public static void main(String[] args) {

 

System.out.println("업다운 게임! 1~100사이의 수를 맞추세요.");

 

Scanner sc = new Scanner(System.in);

 

int x = (int)(Math.random() * 100 + 1);

 

int cnt = 0;

 

while (true) {

System.out.print("정수 입력 : ");

int user = sc.nextInt();

cnt++;

 

if (x > user) {

System.out.println("[업!]");

} else if (user > x) {

System.out.println("[다운!]");

} else {

System.out.println("[정답]");

System.out.println("총 입력 횟수 : " + cnt + " 번");

break;

}

}

sc.close();

}

 

 


 

Exercise 11

 

[ 아이템 강화 시뮬레이션 ]
1. 아이템은 1번 강화하는데 현금 1000원이 필요하다
2. 아이템은 처음에 레벨이 0이다
3. 강화가 성공할 확률은 35% 이고 성공하면 레벨이 1 증가
4. 강화가 실패할 확률은 30% 이고 실패하면 레벨이 1 감소
5. 그 외의 경우에는 아무런 변화가 없다

0레벨의 아이템을 10레벨로 만들기 위해 내가 쏟아 부어야 되는 현금을 계산하세요

 

public static void main (String[] args) {

 

System.out.println("아이템 강화");

 

int lev = 0; // 레벨

int cost = 1000; // 현금

int cnt = 0;

int tot = 0;

 

while (true) {

double rate = Math.random();

cnt++;

tot += cost;

 

if (rate <= 0.35) { // 성공할 확률

lev++;

 

System.out.println(cnt + ". 강화 성공! " + lev);

 

if (lev == 10) {

System.out.println(cnt + ". 강화 종료! 레벨 : " + lev);

System.out.println("총 강화 횟수 : " + cnt + " 번 / 총 금액 : " + tot + " 원" );

break;

}

 

} else if (rate >= 0.7) {

 

if (lev == 0) {

System.out.println(cnt + ". 강화 실패! 레벨 0이하로는 떨어지지 않습니다. 레벨 : " + lev);

} else {

lev--;

 

System.out.println(cnt + ". 강화 실패! 레벨 : " + lev);

}

 

} else {

System.out.println(cnt + ". 아무런 변화가 없습니다. 레벨 : " + lev);

}

}

}

 

 


 

Exercise 12

 

아래의 구간을 for 문을 이용하여 화면에 출력

[1] 2자리 정수
[2] 1부터 100사이의 홀수
[3] 대문자 알파벳
[4] 1000보다 작은 3의 배수
[5] 1000보다 작은 2의 제곱수 (1, 2, 4, 8, 16, ..., 256, 512)

 

public static void main(String[] args) {

 

for (int a=10; a<100; a++) {

System.out.println(a);

}

 

for (int b=1; b <= 100; b+=2) {

System.out.println(b);

}

 

for (char ch = 'A'; ch <='Z'; ch++) {

System.out.println(ch);

}

 

for (int d=1; d < 1000; d++) {

if(d%3 == 0) {

System.out.println(d);

}

}

 

for (int e=1; e < 1000; e*=2) {

System.out.println(e);

}

}

 

 


 

 

Exercise 13

 

돈을 저축하려 합니다
오늘 저축할 돈은 어제 저축한 돈의 두배로 할 예정이고
첫째날에 1원을 저축하려고 합니다

(Q1) 30일동안 통장에 저축될 돈은 얼마입니까?
(Q2) 40일동안 통장에 저축될 돈은 얼마입니까?

 

for (int day=1, amt=1, tot=0; day<=30; amt*=2, day++) {

tot+=amt;

System.out.println(day + "일째 저축 금액 : " + amt + "원\n총 " + tot + "원");

}

 

long amt = 1, tot=0;

 

for (int day=1; day<=40; amt*=2, day++) {

tot+=amt;

System.out.println(day + "일째 저축 금액 : " + amt + "원\n총 " + tot + "원");

}

 

}

}

 

 


 

 

Exercise 13

 

[문제] Test04.java에 구현
타이머 만들기
사용자에게 분을 입력받아서 해당하는 시간이 흐른 뒤 메세지가 출력되도록 코드구현

(예상결과)
분 입력 : 3
3분 0초 남음
2분 59초 남음
...
0분 2초 남음
0분 1초 남음
0분 0초 남음
정신차려 이놈자식아!!!!

 

import java.util.Scanner;

public static void main(String[] args) throws InterruptedException {

 

 

Scanner sc = new Scanner(System.in);

 

System.out.println("타이머를 몇 분으로 설정할까요?");

int user = sc.nextInt();

 

sc.close();

for (int min=user-1; min>=0; min--) {

for (int sec=59; sec>=0; sec--) {

System.out.println(min + "분 " + sec + "초 남음");

}

}

System.out.println("정신차려 이놈자식아");

 

// or

 

for (int sec1 = user*60; sec1>=0; sec1--) {

System.out.println(String.format("%02d분 %02d초 남음", sec1/60, sec1%60)); //문자열이 앞에 오고 , 뒤의 정수값이 차례대로 온다

}

System.out.println("정신차려 이놈자식아");

 

// or

 

for (int sec2 = user*60; sec2>=0; sec2--) {

System.out.println(String.format("%02d분 %02d초 남음", sec2/60, sec2%60));

Thread.sleep(1000); // 내가 지정한 시간 만큼 프로그램을 멈추어 주는 역할 ; ms단위로 적어 주어야 한다

}

}

 

}