본문 바로가기

Java/자료구조

1-2. 반복

1. 1부터 n까지 정수의 합 구하기 

 

- while문으로 n까지의 정수의 합 구하기 

//while문으로 1,2,...,n의 합을 구함

import java.util.Scanner;

public class SumWhile {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("1부터 n까지의 합을 구합니다.");
		System.out.print("n값: ");
		int n = sc.nextInt();
		
		int sum =0;
		int i=1;
		
		while(i<=n) {
			//i가 n이하면 반복
			sum+=i; //sum에 i를 더함
			i++;
		}
		System.out.println("1부터"+n+"까지의 합은"+sum+"입니다.");

	}

}

 

 

 

1) while문 반복

 

반복(repetition) 구조 

- 어떤 조건이 성립하는 동안 처리를 반복하여 실행하는 것

 

while문

- 실행 전에 반복을 계속할지를 판단하는 사전판단반복

- 제어식의 평갓값이 true이면 프로그램 명령문을 반복

 

while (제어식) 명령문

 

 

- 합을 저장하는 변수 sum을 0, 반복을 제어하기 위한 변수 i를 1로 초기화 

- 변수 sum값은 '루프 본문을 수행하는 동안의 합',  변수 i값은 '다음에 더하는 값'

- 변수 i값이 n이하인 동안 i값을 1씩 증가하면서 루프 본문을 n회 반복하여 실행 

 

 

2) for문 반복 

 

//for문으로 1,2,...,n의 합을 구함

import java.util.Scanner;

public class SumFor {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		System.out.println("1부터 n까지의 합을 구합니다.");
		System.out.println("n값: ");
		int n = sc.nextInt();
		
		int sum = 0;
		
		for(int i=1; i<=n; i++)
			sum+=i; //sum에 i를 더함
		
		System.out.println("1부터"+n+"까지의 합은"+sum+"입니다.");
	}

}

 

 

for문

- 초기화 부분은 for문을 실행하기 전에 한 번만 실행 

- 제어식을 평가한 값이 true이면 for문의 명령문을 반복

- 명령문을 실행한 다음에는 업데이트 부분을 실행 

 

for(초기화 부분; 제어식; 업데이트 부분) 명령문

 

 

 

2. 양수만 입력받아 1부터 n까지의 합 구하기 

 

- 양수만 입력받기 위해 do while문으로 작성

- 0이나 음숫값을 입력하면 다시 "n값: "이 출력되며 사용자에게 새로 입력할 것을 요구 

//양수만 입력하여 1,2,...n의 합을 구함

import java.util.Scanner;

public class SumFor2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n;
		
		System.out.println("1부터 n까지의 합을 구합니다.");
		
		do {
			System.out.print("n값: ");
			n = sc.nextInt();
		}while(n<=0);
		
		int sum = 0;
		
		for(int i=1; i<=n; i++)
			sum+=i;
		
		System.out.println("1부터 " +n+"까지의 합은"+sum+"입니다.");

	}

}

 

 

do while문 

- 일단 루프 본문을 한 번 실행한 다음에 계속 반복할 것인지를 판단하는 사후판단반복문

- 제어식을 평가한 값이 true이면 루프 본문의 명령문이 반복 

do while 문 (제어식);

 

 

 

3. 반복과정에서 조건 판단하기 1

 

import java.util.Scanner;

public class SumVerbose1 {
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int n;
		
		System.out.println("1부터 n까지의 합을 구합니다.");
		
		do {
			System.out.print("n값: ");
			n = sc.nextInt();
		}while(n<=0);
		
		int sum = 0;
		
		for(int i=1; i<=n; i++)
		{
			if(i<n)
				System.out.print(i+"+");
			else
				System.out.print(i+"=");
			sum+=i;
		}
		
		System.out.println(sum);
	}
}

 

- 더하는 값이 n개일 때 출력할 + 기호는 n-1개 

- 중간 과정 : 변수 i값 뒤에  +를 출력

- 마지막 과정: 변수 i값 뒤에 =를 출력 

- 별로 바람직하지 못함

  -> n값이 10,000 이라면 마지막 과정을 한 번 실행하기 위해 무려 10,000이나 판단해야 함 

 

...
for(int i=1; i<n; i++) {
	System.out.print(i+"+");
    sum+=i;
}

System.out.print(n+"=");
sum+=n;
System.out.println(sum);
..

 

- 중간 과정 : for문에서 1부터 n-1까지의 값 뒤에 +를 출력

- 마지막 과정: n값 뒤에 =와 합계를 출력

- for문의 반복횟수가 n번에서 n-1번으로 줄었고, if문의 판단 횟수는 n번에서 0번으로 줄어듬 

 

 

4. 반복 과정에서 조건 판단하기 2

 

 +와 -를 번갈아 출력(1)

import java.util.Scanner;

public class Alternative1 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n;
		
		System.out.println("+와 -를 번갈아 n개 출력합니다.");
		
		System.out.print("n값: ");
		n = sc.nextInt();
		
		for(int i=0; i<n; i++)
			if(i%2 ==0)
				System.out.print("+"); //짝수
			else
				System.out.print("-"); //홀수
	}

}

 

- i가 짝수이면 +를 출력

- i가 홀수이면 -를 출력 

 

문제점

1) for문을 반복할 때마다 if문을 실행해야 함

2) 변경할 때 유연하게 대응하기 어려움 

 

 

+ 와 -를 번갈아가며 출력(2)

...
//(1)
for(int i=0; i<n/2; i++)
	System.out.print("+-");
//(2)
if(n%2!=0)
	System.out.print("+");
...

 

1)

- for문은 +-를 n/2회 출력

- n이 짝수이면 1)행만으로 출력을 완료 

 

2)

- n이 홀수일 때만 +를 출력

- n이 홀수이면 마지막에 +를 출력하고 완료 

 

- 반복할 때마다 if문의 판단을 실행할 필요가 없음. 그러므로 if문의 판단은 2)에서 한번만 실행 

 

 

5.반복 과정에서 조건 판단하기 3

 

- *를 n개 출력하되 w개마다 줄 바꿈을 하는 프로그램 

import java.util.Scanner;

public class PrintStars1 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n,w;
		
		System.out.println("*를 n개 출력하되 w개마다 줄을 바꿔서 출력합니다.");
		
		do {
			System.out.print("n값: ");
			n=sc.nextInt();
		}while(n<=0);
		
		do {
			System.out.print("w값: ");
			w=sc.nextInt();
		}while(w<=0 || w>n);
		
		for(int i=0; i<n; i++)
		{
			System.out.print("*");
			//1)
			if(i%w ==w-1)
				System.out.println();
		}
		//2)
		if(n%w !=0)
			System.out.println();
	}

}

 

 

 

1)

- for문에서 변수 i값을 w값으로 나눈 나머지가 w-1일때 줄 바꿈을 함 

- w값이 5라면 i값이 4,9,14일때 줄 바꿈을 함

 

2)

- n값이 w값의 배수가 아니라면 마지막 줄바꿈은 2)에서 함 

- n값이 w값의 배수가 아닐 때만 줄바꿈

 

- for문을 반복할 때마다 if문을 실행하므로 비효율적

 

...
//1)
for(int i=0; i<n/w; i++)
	System.out.println("*".repeat(w));
//2)
int rest = n%w;
if(rest!=0)
	System.out.println("*".repeat(rest));
...

 

1)

- for문에서 *를 w개 출력하는 것을 n/w번 실행

- n값이 15이고 w값이 5이면 *****를 3번 출력

- n값이 w값의 배수이면 이 단계에서 출력을 완료 

 

"*".repeat(w)

- String 클래스에 들어 있는 인스턴스 메서드 

- *를 w번 반복한 문자열을 출력 

 

2)

- *를 n%w번 출력하고 줄바꿈 

- n값이 w값의 배수가 아니라면 남아 있는 마지막 줄 바꿈을 함 

- n값을 w값으로 나눈 나머지를 구하여 변수 rest에 넣고 *를 rest개 출력한 다음 줄바꿈

 

 

6. 다중 루프 다루기 

 

1) 곱셈표 

 

- 이중 루프로 구구단 곱셈표 출력

public class Multi99Table {
	public static void main(String[] args) {
		System.out.println("----구구단 곱셈표----");
		
		for(int i=1; i<=9; i++)
		{
			for(int j=1; j<=9; j++)
			{
				System.out.printf("%3d",i*j);
			}
			System.out.println();
		}
	}

}

 

- 바깥쪽 for문(행 루프)은 i값을 1~9 까지 1씩 증가시키며 1행, 2행,...9행dmf cnffur 

- 바깥쪽 for문은 세로 방향을 반복

- 각 행에서 실행하는 안쪽 for문(열 루프)은 변수 j값을 1~9까지 1씩 증가시킴

- 각 행안에서 반복하는 가로 방향을 반복 

 

 

 

2) 직각이등변삼각형 출력하기 

 

- 왼쪽 아래가 직각인 이등변삼각형을 출력

import java.util.Scanner;

public class TriangleLB {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n;
		
		System.out.println("왼쪽 아래가 직각인 이등변삼각형을 출력합니다.");
		
		do {
			System.out.print("몇 단 삼각형입니까?");
			n = sc.nextInt();
		}while(n<=0);
		
		for(int i=1; i<=n; i++)
		{
			for(int j=1; j<=i; j++)
				System.out.print('*');
			System.out.println();
		}
	}

}

'Java > 자료구조' 카테고리의 다른 글

3-2 선형 검색  (1) 2024.02.01
3-1 검색 알고리즘  (0) 2024.01.31
2-2 클래스  (0) 2024.01.28
2-1 배열  (0) 2024.01.28
1-1 알고리즘이란?  (1) 2024.01.25