Java - 기본기

7. 조건문과 반복문 기초&활용 (2) : for, while, do ~ while

TerianP 2021. 10. 1.
728x90

1. 임의의 수 만들기 : 난수 생성하기

  • Math.random() : 0.0 과 1.0 사이의 임의의 double값을 반환
    • 각 변에 내가 원하는 범위에 따른 숫자를 곱한다 ⇒ 이 부분은 내가 구하고자 하는 '개별값의 갯수' 라고 생각해도 됨
    • 0 ~ 50까지 범위 안의 값을 구하기위해서는 *50 ⇒ Math.random()50, 이때 출력되는 값은 정확히는 0 이상 50 미만, 즉 0 ~ 49, 50 개의 수
    • 0 ~ 3 까지 범위 안의 값을 구하기 위해서는 *3 ⇒ Math.random()**3, 이때 출력되는 값은 정확히는 0 이상 3미만, 즉 0 ~ 2, 3개의 수
    • 이후 정수를 얻기 위해서는 실수를 int 형으로 형 변환이 필요하다.
    • 만약 특정한 숫자부터 시작하고 싶다면, 해당 숫자를 더해주어야 한다.0.0 부터 1.0 사이의 임의의 실수를 발생시키기 때문에 특정한 범위를 지정해서 난수를 생성하기 위해서는 다음 순서에 따른다.
static void use_random() {

		for(int i=1; i<=6; i++) {
			System.out.println(Math.random()); // 0.0 <= x < 1.0
			System.out.println(Math.random()*10); // 0.0 <= x < 10.0
			System.out.println((int)(Math.random()*45)); // 0 <= x < 45, 0 ~ 44
			System.out.println((int)(Math.random()*45)+1); // 1 <= x < 46 0 ~ 45 , 로또 번호 구하기
	
		}
	}

 

 

여기서 문제!! 만약 -5 ~ 5 사이의 임의의 값을 출력하기 위해서는 어떻게 하면 될까?

  1. 먼저 내가 -5 부터 5 사이에 정수가 몇개 있는지 파악한다 총 11개 숫자임으로 *11 ⇒ 이렇게해서 출력되는 수의 범위는 0 이상 11미만, 출력값은 0 ~ 10
  2. 다음으로 범위를 지정해야하는데 내가 원하는 범위는 -5 이상 5미만 임으로, 이에 맞게 -5 를 덧붙인다 ⇒ 최종적으로 범위는 -5 이상 6 미만, 출력값은 -5 ~ 5
// Quiz1. -5 ~ +5 까지 중 임의의 수
		for(int i=1; i<=6; i++) {
			System.out.println((int)(Math.random()*11)); // 0 <= x < 11 , 출력값은 0 ~ 10
			System.out.println((int)(Math.random()*11)-5); // -5 <= x < 6, 출력값은 -5 ~ 5
}

 

2. 반복문 - for 문

  • 반복 횟수를 아는 경우 사용!! - 조건을 만족하는 동안 블럭 {} 반복
  • 반면 while 문은 반복 횟수를 잘 모르는 경우 사용 하는게 적합
  • for 문 안에 변수 i 를 선언하는 경우 for문 밖에서는 i 사용 불가
  • for 문 조건식에 2개 이상의 변수를 사용 가능한데, 이때는 두 개의 변수가 동일한 타입이여야함
for(초기화; 조건식; 증감식){
	// 수행될 문장 => 조건이 만족하는 동안 문장 수행 후
	// 증감 실행
	// 조건식 거짓일 때 for 문 종료
}

#####################################

public static void main(String[] args) {
		for(int i=1; i<=10; i+=2) { // i가 10 이하일때까지 i+2
			System.out.println(i); // i = 1, 3, 5, 7, 9 => 11 일 때는 10보다 크기 때문에 실행X
			System.out.println("Hello World");
		}
	}

결과 :
1
Hello World
3
Hello World
5
Hello World
7
Hello World
9
Hello World


#####################################
// for 문 안에 2개의 변수를 넣는 것도 가능

static void use_for2() {
		// 단 이때 i 와 j 는 같은 타입이여야 함
		for(int i=1, j=10; i<=10; i++, j--) {
			System.out.println("i = "+i);
			System.out.println("j = "+j);
		}
	}

 

3. 중첩 for문 사용하기

- 중첩 for문의 대표 문제는 구구단 출력하기!

- 중첩 for 문의 바깥쪽 for 문은 세로의 크기 = row = y값이고, 안쪽 for 문은 가로의 크기 = col = x 값이다.

- 중첩 for 문 생성 시 new int[row][col] 이라고 생각하면 보다 쉽다. 따라서 수학에서의 좌표평면 즉 함수로 읽는 경우 (y,x) 이라는 것에 주의해야한다!! -> 매우 헷갈린다

static void gugudan() {
		for(int i=2; i<=9; i++) { // 2단부터 시작!
			for(int j=1; j<=9; j++) { // i * 9 까지 출력
				System.out.println(i+" * "+j+" = "+i*j);
			}
			System.out.println(); // 한번 출력이 끝나고 한줄 띄우기
		}
}

대표 문제 2 : 별 찍기 && 별 찍기 응용

**********
**********
**********
**********
**********

####### 위처럼 출력하는 코드는? ##########
static void star() {
		for(int i=1; i<=5; i++) {
			for(int j=1; j<=10; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
    
    
################# 별찍기 응용 : 직각 삼각형 출력 ###########
static void star_1() {
		for(int y=1; y<=3; y++) { // y 값은 증가하는 모양 => 1 2 3
			for(int x=1; x<=y; x++) { // x 값은 증가하는 모양 => 1 2 3
				// 즉 1 1 좌표일때는 
				System.out.print("*");
			}
			System.out.println(); // 출바꿈 only
		}
	}
	
	static void star_2() {
		for(int y=3; y>=1; y--) {
			for(int x=1; x<=y; x++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

########### 결과 ###########
*
**
***

***
**
*

- 대표 문제 3 : 별 찍기 오른쪽 정렬

  • 얘는 for문을 여러번 써서 출력가능!
  • 중요한 점은 빈칸의 증가와 * 의 감소를 for문으로 적절하게 구현하는 것
static void star_4() {
		for(int i=1; i<=6; i++) { // 아래 2개의 for문이 전체 몇번 반복되는지
			for(int a=6; a>=i; a--) { // 빈칸은 점차 감소함
				System.out.print(" ");
			}
			for(int j=1; j<=i; j++) { // * 은 점차 증가함
				System.out.print("*");
			}
			System.out.println();
		}
	}

########### 결과 ###########

      *
     **
    ***
   ****
  *****
 ******

4. while : 한번도 반복 안될 수도 있음

조건을 만족시키는 동안 블럭 {} 반복 - 반복횟수 모를 때

while(조건식){
	// 조건식의 연산결과가 참(true)인 동안 반복될 문장들을 적는다
}

#########################
public static void main(String[] args) {

		int i=5; // 반복할 횟수 넣기
		
		while(i!=0) {
			i--; // 1씩 줄어듦
			
			System.out.println(i + " - I can do it? ");
			// 0 까지 찍히는 이유는 i가 1일때 i-- 하여 줄어든 0이 출력되고,
			// 그 후 0 일 때 조건식 0!=0 이 거짓처리됨으로 결국 0 까지만 출력됨
		}
		System.out.println("끝 : "+ i);
	}

활용 문제 : 원하는 숫자 입력 후 각 자리숫 모두 더하기 

  • 처음에는 while 문을 이용해서 출력해보았다(buffer 사용)
  • 다음은 동일한 문제를 for 문을 이용해서 출력해보았다(buffer 사용)
  • 마지막으로 String 이 아닌 int 형으로 바로 변환하여 출력하는 방법으로 풀어보았다.
    • 이 방법에서 사용되는 방법은 특정한 수를 10씩 나눠가면서 나머지 값을 구하면 각 자리수를 알 수 있다는 점이다.
    • ex) 12345 일 때, 10씩 나눠가면 12345 → 1234 → 123 → 12 → 1, 이때 나머지 값들을 구하면 각 자리수를 알 수 있다.
static void while_3() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		
		int sum = 0; // 초기값 설정
		int i = 0;
		
		String str = br.readLine(); // 입력받기
		
		String[] result = str.split(""); // String 으로 입력받은 값을 그대로 하나하나 자름
		
		while(i<result.length) { // String 을 배열로 만들어서 배열의 길이만큼 while 문 실행
			sum+=Integer.parseInt(result[i]); // sum 에 배열의 각 자리수를 int 로 형변환 후 더하기
			bw.write("합계 : "+sum+"\n"); // 출력
			i++; // i 값 증가
		}
		
		br.close();
		
		bw.write("### 최종 합계 : "+sum +" ###");
		bw.flush();
		bw.close();
	}

############## for문 이용 ###################
static void for_1() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		
		int sum = 0;
		
		String str = br.readLine();
		
		String[] result = str.split("");
		
		
		for(int i=0; i<result.length; i++) { // 여기만 for 문으로 변경
			sum+=Integer.parseInt(result[i]);
			bw.write("합계 : "+sum+"\n");
		}

		
		br.close();
		
		bw.write("### 최종 합계 : "+sum +" ###");
		bw.flush();
		bw.close();
	}


############### for문 이용 + 다른방법 ############

static void for_2() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		
		int sum = 0;
		
		String str = br.readLine();
		
		int num = Integer.parseInt(str);
		
		for(int i=num; i>0; i = i/10 ) {
			// 즉 어떤 수에 10씩 나눠가면 한 자리씩 점점 줄일 수 있음
			// ex) num = 12345 일때 -> 12345, 1234, 123, 12, 1
			// 이후 %10 연산하면 각 자리수를 구할 수 있음
			bw.write("각 자리수 구하기 위해서는 %10 : "+i%10+"\n");
			sum+=i%10;
			bw.write("sum 값 : "+sum +"\n");
		}

		
		br.close();
		
		bw.write("### 최종 합계 : "+sum +" ###");
		bw.flush();
		bw.close();
	}

 

5. do ~ while 문 : 최소 1번은 무조건 실행됨

블럭 {} 를 최소한 한 번 이상 반복 - 사용자 입력 받을 때 유용

do {
	// 조건식의 연산 겨로가가 참일때 수행될 문장들을 적는다(처음 한번은 무조건 실행)
}while(조건식);

활용 문제 : 랜덤한 숫자 맞추기!!

static void dowhile_1() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int answer = 0;
		int num = 0;
		answer = (int)((Math.random()*100)+1); // 1 <= answer < 101
		
		
		
		do {
			System.out.print("나의 숫자를 맞춰봐! : ");
			num = Integer.parseInt(br.readLine());
			
			if(answer > num) {
				System.out.println("숫자가 너무 작아요");
			}else if(answer < num){
				System.out.println("숫자가 너무 커요");
			}
		}while(answer!=num); // 여기에 != 가 들어가는 이유는 answer 과 num 이 서로 다른동안 while 문이 돌아야하기 때문에
			bw.write("정답입니다 연금술사!");
			
		br.close();
		
		bw.flush();
		bw.close();

 

댓글