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 |