본문 바로가기
Backend

05월 21일 화 | OOP 06 - JAVA의 반복문(while)과 연습문제

by 구라미 2019. 5. 21.

6. 자바의 반복문

 

반복문 연습하기

배운 것은 시간내서 한번씩 해보기

지난번 마지막 교시에 내주셨던 문제이다. 분수 수열인데 교차합을 수행하는 식이다.

 

연습문제 7) 다음 식의 결과를 구하시오

 

내 하다만 풀이... i/i+1의 형태의 분수가 i의 값이 점점 증가하며 교차연산하는 문제이다.

 

■  선생님 답안  

double hap1 = 0.0;
 boolean flag1 = false;
 for(int a=1; a<100; a++){
	if(flag1){
	hap1 = hap1 - (a/(double)(a+1));
	flag1 =false;}
   	else {
	hap1 = hap1 + (a/(double)(a+1));
	flag1 =true;
	}	
}
System.out.println(hap1);

//결과값 0.6881721793101957

스위치개념 잘 이해하기!

▶ 스위치 개념 복습을 잘해야겠다. 굉장히 자주 사용하는 형태인 것 같음.

위 답안은 스위치개념과 i/i+1의 개념으로 만들어진 코드이다.

분수들의 연산이므로 소수점이 있는 값이 나온다. 그렇기 때문에

총계가 될 hap1변수의 초기값을 실수 0.0으로 선언한다

그 다음 스위치변수를 이용한다.

boolean형 변수 flag1의 값은 false로 선언한다.

for문으로 a의 초기값 1, 범위 100이하, 1씩 증가식의 조건을 만들고 그 안에

if,else 조건식으로 값을 판별하며 교차로 연산한다.

 

if(flag1) 만약 flag1(가장 처음은 false)일 때

hap1 변수안에 hap1- (a/a+1)를 연산한 값을 넣는다.

그리고 hap1에 false를 저장한다.

 

else일 경우

hap1 변수안에 hap1+(a/a+1)를 연산한 값을 넣는다.

그리고 hap1에 true를 저장한다.

 

조건을 만족하지 않을 때까지 반복하는 반복문안에 있으므로

다시 if로 돌아가서 (flag1 마지막에 hap1에 true를 저장했기 때문에 true) 조건에 맞는 다면

.......

 

위 내용대로 반복해서 조건문 실행 후 종료한다.

 

 

While 문

While ( 조건 ) { 조건이 true이면 수행 }

While (true) { } //끝이 없이 돈다. 무한 loop

 

1) While 반복문

int a =1; 
 while (a<=3){
 System.out.println("java");
 a++;
}//while end

//결과값
//java
//java
//java

while(1<=3) Java a=1+1

while(2<=3) Java a=2+1

while(3<=3) Java a=3+1

while(4<=3) true가 아니므로 반복문에서 빠져나옴.

▶for문외에도 while로 반복문을 만들수 있다. 

정수 변수a의 초기값을 1로 설정하고 (횟수를 세어야하기 때문에 초기값이 1)

while (조건: a는 3이하이다.){

"java"라는 문자열을 출력하기

a++ // a를 1 증가시키기, 기존 a에 1을 더한 값과 while의 조건을 비교한다.

비교한 후 조건을 만족하지 않을 때까지 java를 출력하고

반복문을 빠져나온다.

}

 

2) while문안에 if문(조건문) 넣기

int a =1;
while (a<=10){ // 무한 loop
	System.out.println("seoul");
if(a==5){
	break; //반복문
}
a++;
}//while end

while(1<=5) seoul a=1+1

while(2<=5) seoul a=2+1

while(3<=5) seoul a=3+1

while(4<=5) seoul a=4+1

while(5<=5) seoul a=5+1 

while(6<=5) true가 아니므로 반복문에서 빠져나옴. 

▶ 변수a 초기값을 1로 설정

while문의 조건은 a<=10 이다. 즉 a가 10이하가 될 때까지만 명령을 반복한다는 뜻이다.

그런데 문자열 seoul을 출력하라는 명령 다음에

if문이 있다. if문에서 a값이 5가 될때 break하라는 명령이 있다.

break는 반복문을 종료하는 명령으로 a++로 a값이 계속 증가하다가 a가 5와 같을 때 종료한다.

 

do While 문

do {

  조건이 true이면 수행

} while(조건); //조건이라는 말이 나오면 반드시 boolean형이 나와야함.

 

1) do while문

int a =1;
	do {
	System.out.println("cat");
	a++;
}while(a<=3);

//결과
//cat
//cat
//cat

cat a=1+1 while(2<=3)

cat a=2+1 while(3<=3)

cat a=3+1 while(4<=3)

나중에 물어보는 do while문

코드가 짜여진 순서대로 진행되기 때문에 명령의 위치를 정확히 잘 설정해야한다.

▶ 변수 a를 1로 설정

do 안의 명령을 실행한다.

cat 출력과 a의 1증가연산자

while 에 종료 조건을 놓는다.

 

int b=5;

do {
  System.out.println("dog");
  b=b+1;
}while (b<=3);
System.out.println(b);

//결과값
//dog
//6

do while문은 나중에 물어보기 때문에 무조건 한번은 수행.

이처럼 do while 처럼 for문도 무한loop를 돌릴 수 있다.

for( ; ; ){ } ->이렇게 작성하면 무한loop가 된다.

 

▶ 개념을 이해해야한다.

 

연습문제 1) x값이 10으로부터 x를 여러번 뺀 후 결과가 음수가 되면 x를 몇번 뺏는가를 구하시오.

내 풀이

		int x = 3;
		int y = 10;
		int count = 0;
		while (y - x >= 0) {
			count = count + 1;
			y = y - x;
			if (y - x < 0) {
				count = count + 1;
				break;
			}
		}
		System.out.println(count);

우선 주어진 x값이 3, 

▶ 선생님 답안과 거의 비슷했는데 간결하게 쓸 수 있는 것을 너무 늘여쓰긴 했다.

 

■  선생님 답안  

        int x=3;
        int count=0;
        int su=10;
        
        while(true) {
            count++;      
            su = su - x;
            if(su<0) {
                break;
            }      
        }//while end    
        
        System.out.println(count); 

거의 비슷하였지만 while문 안의 조건이 달랐다.

나는 일일이 연산하려고 했는데 선생님은 true,false boolean형을 이용하셨다.

▶ 연산자처럼 boolean형에 익숙해지자.

 

while(true) {

 count = 0 + 1

 su = 10 - 3

 if (7<0) }

while(true) {

 count = 1 + 1

 su = 7 - 3

if (4<0)

}

이런 흐름대로 이어지다가 su<0의 조건을 만족하면

반복문에서 빠져나온다.

반복문에서 명령 위치에 따라가 결과가 달라진다. 알고리즘 흐름이 달라지기 때문에.

 

 

연습문제 2) 어느 달팽이는 낮에는 3cm 올라가고 밤에는 2.5cm 내려온다고 할 때, 달팽이가 13cm의 나무 꼭대기에 올라가려면

며칠이 걸리는지 구하시오.

내 풀이

		double c = 3;
		double d = 2.5;
		int day = 0; // 총 날의 수
		double e = 0; // 총 거리 수

		while (e < 13.0) {
			e = e + (c - d);
			day = day + 1;
			if (e >= 13.0) {
				break;
			}
		}
		System.out.println(day);

내 결과값은 26일이었는데 잘못 계산한 값이다.

마지막날에 13cm에 도달했을 때는 내려올 필요가 없다...그래서 3-2.5로 묶어서 생각하면 안됐음

함정문제가 있었음

▶ 잘모르고 익숙하지 않아 뜻도 제대로 모르면서 예전코드 복붙하는 경우가 있는것 같음

 

 

■  선생님 답안  

        int day=0;        //며칠
        double snail=0.0; //달팽이
        
        while(true) {      
            day++;
            snail = snail + 3.0;
            if(snail>=13.0){
                break;
            }else{
                snail = snail-2.5;
            }      
        }//while end
        
        System.out.println(day+"일"); 
        
        //결과값 21일

선생님 결과값: 21일

마지막날의 3cm에 -2.5cm가 필요없기 때문에...

흑흑...ㅠㅠ

 

이중반복문

반복문 안에 반복문을 넣은 문장이다.

반복문을 중첩해서 사용할 수 있다.

 

1) 이중반복문

		for(int a=1; a<=9; a++){								
			System.out.println("java");
			
			for(int b=1; b<=3; b++){
				System.out.println("seoul");				
			}
		}//for end

a=1 1<=2

java라는 글이 출력된 후

b=1

1<=3 seoul

2<=3 seoul

3<=3 seoul

 

a=2 2<=2

java

b=1

1<=3 seoul

2<=3 seoul

3<=3 seoul

▶ 코드는 짠대로 출력된다.

 

2) 구구단

		for(int a=2; a<=9; a++){
			System.out.println(a+"단");
			for(int b=1; b<=9; b++){
				System.out.println(a+"*"+b+"="+(a*b));
			}

구구단을 출력하는 코드

 

 

반복문으로 도형을 만들기

사각형, 삼각형을 만드는 알고리즘.

3) 반복문으로 도형찍기 - 사각형

//사각형 만들기
		//->등수 구할 때 회전수 참조!!
for(int a=1; a<=4; a++){
  for(int b=1; b<=4; b++){
  System.out.print("*");
  }
System.out.println();
}//for end
        
//결과값
//****
//****
//****
//****
 

*로 만들어진 사각형이 완성되었다.

등수를 구할 때도 총 인원수가 4명이라 가정했을때 4명다 4번씩 점수를 비교해야함

▶ 바깥쪽 for문은 행의 갯수, 안쪽 for문은 열의 갯수 였다.

안쪽 for문의 조건이 만족하면 줄바꿈을 진행한 후 다시 바깥 for문->안쪽 for문->줄바꿈

지정해준 범위만큼 실행한 후 종료한다.

 

4) 반복문으로 도형찍기 - 삼각형

for(int a=1; a<=4; a++){
  for(int b=1; b<=a; b++){
  System.out.print("@");
  }
System.out.println();
}

//결과값
//@
//@@
//@@@
//@@@@

▶ 안쪽 for문의 b 범위를 a이하로 설정하면 b는 a보다 적게 출력된다. 이것을 이용하여 삼각형 모양 찍기

 

 

5) 반복문으로 도형찍기 - 역삼각형

//역삼각형 만들기
for(int a=4; a>=1; a--){
  for(int b=1; b<=a; b++){
  System.out.print("%");
  }
  System.out.println();
}//for end

//결과값
//%%%%
//%%%
//%%
//%

 


반복문 연습문제

 

연습문제 1) 아래 도형패턴을 구현하시오. (사각형)

@★

★@

★@

★@ 

 

내 풀이

for (int a = 1; a <= 4; a++) {
	for (int b = 1; b <= 4; b++) {
		if (a == b) {
			System.out.print("@");
		} else {
			System.out.print("★");
		}
	}
System.out.println();
}

System.out.println();

▶ 선생님 답안과 일치했다.

 

■  선생님 답안  

for(int a=1; a<=4; a++){
	for(int b=1; b<=4; b++){
	if(a==b){
		System.out.print("@");
	} else {
		System.out.print("★");
	}
	}
System.out.println();
}//for end

 

 

연습문제 2) 아래 도형패턴을 구현하시오. (사각형, 공백이 들어간 개념)

    

        ★

            ★

 

내 풀이

for (int a = 1; a <= 4; a++) {
	for (int b = 1; b <= 4; b++) {
	if (a == b) {
		System.out.print("★");
	} else if (a > b) {
		System.out.print(" "); //공백을 안해줘서 여태까지 안됐음.
	} else {
		System.out.print("★");
	}
}
System.out.println();
}

▶ 거의 비슷했는데 명확하지 않은 개념으로 짜다보니 마지막에 ★을 또 찍어주는 필요없는 코드를 추가해버렸음...

 

■  선생님 답안  

 

for(int a=1; a<=4; a++){
	for(int b=1; b<=4; b++){
		if(a<=b){
			System.out.print("★");
		} else {
			System.out.print(" ");
		}
	}
	System.out.println();
}//for end

▶ 코드진행 다시 한번 꼼꼼히 보기.

 

연습문제 3) 아래 도형패턴을 구현하시오. (수로된 사각형)

12345

23456

34567

45678

56789

 

내 풀이

for (int a = 1; a <= 5; a++) {
	System.out.print(a);
	for (int b = 1; b <= 4; b++) {
		System.out.print(a+b);
	}
		System.out.println();
	}
	System.out.println();

▶ 코드진행 다시 한번 꼼꼼히 보기.

 

■  선생님 답안  

for (int a=0; a<5; a++) {			
	for(int b=a+1; b<=a+5; b++){
		System.out.print(b);
	}
	System.out.println();
}

 

연습문제 4) 2g,3g,5g짜리 추가 각각 5개씩 있을 때 세가지의 추의 조합으로

무게가 40~45사이일 때의 각 추의 갯수와 무게를 출력하는 프로그램

출력결과:  2g 3g 5g total

 

감이 안잡혀서 시도도 못했다...

 

 

■  선생님 답안  

int hap = 0;
for(int a=1; a<=5; a++){
 for(int b=1; b<=5; b++){
  for(int c=1; c<=5; c++){
    hap = (a*2)+(b*3)+(c*5);
	 if(hap>=40 && hap<=45){
		System.out.println(a+" "+b+" "+c+" "+hap);}//if end
    }//for end
  }//for end
}//for end

▶ 코드진행 다시 한번 꼼꼼히 보기.

 

 

7. 자바의 배열

배열이란

배열이란 동일한 자료형 값의 집합이다.

1차원배열, 2차원배열이 있다. 3차원배열은 자바에서는 없는 개념이다.

 

2차원배열 중요

만약 시험성적표를 프로그래밍으로 짠다면?

사람이 3명인데 과목이 3개 라면,

배열이 없다면 이름도 일일이, 과목도 일일이 다 해야한다.

같은 성격을 가진 것은 배열이라는 변수에 하나로 모은다.

순서와 색인, index가 있다.

요소 element가 있다.

 

1차원배열: 열 구성

2차원배열: 행과 열 구성

열 ,칸 -> column

행, 줄 -> row

배열은 new 연산자로 메모리를 할당한 후 사용한다

 

배열을 사용할 때 메모리를 확보한다.

int [] kor=new int[3];

kor[0] =60;

대입연산자 좌측에

 

        //Array 배열
        //-> 동일한 자료형 값의 집합
        //-> 순서, 색인, index
        //-> 요소 element
        //-> 1차원 : 열 구성
        //-> 2차원 : 행과열 구성
        //-> 3차원 : 자바에는 없는 개념
        //-> 열, 칸, column
        //-> 행, 줄, row
        //-> new 연산자로 메모리를 할당한 후 사용한다
        
        /*
        String name1="사과", name2="수박", name3="딸기";
        int kor1=60, kor2=100, kor3=85;
        */
        
        //4byte * 3개 => 12byte메모리 할당
        int[] kor = new int[3];
        kor[0]=60; //배열의 인덱스는 0부터 시작한다
                   //배열의 인덱스는 1씩 증가한다
        kor[1]=100;
        kor[2]=85;
        
        System.out.println(kor[0]);
        System.out.println(kor[1]);
        System.out.println(kor[2]);
        
        //int a=3;
        //a. 에러
        
        //kor 배열 요소의 갯수
        System.out.println(kor.length);//3

 

배열의 인덱스는 0부터 시작한다.

배열의 인덱스는 1부터 시작한다.

 

	int[] arg = {55, 42, 8};    //  //열거형
	int size= arg.length; //3
	for(int a=0; a<size; a++)
	{
		System.out.print(arg[a]);
	}

결과값: 55 42 8

 

 

배열은 여러가지 자료형을 담을 수 있다.

 

	double[] avg = {1.2,3.4,5.6};
	for(int a=0; a<avg.length; a++){
		System.out.print(avg[a]);
	}
	
	char [] ch = {'a','b','c','d','e'};
	for(int a=0; a<ch.length; a++){
		System.out.print(ch[a]);
	}
	
	String [] name = {"진달래","개나리","무궁화"};
	for(int a=0; a<name.length; a++){
		System.out.print(name[a]);
	}

결과값: 

첫번째 배열: 1.2 3.4 5.6 

두번째 배열: a b c d e 

세번째 배열: 진달래 개나리 무궁화

 

 

연습문제 1)  대문자, 소문자의 갯수를 각각 구하시오.

연습문제 2) 모음의 갯수를 구하시오.

연습문제 3) 대문자와 소문자를 서로 바꾸어서 출력하시오.

 

		int upper = 0;
		int lower = 0;
		int mo = 0;
		
		for (int idx=0; idx<size; idx++){
			if(ch[idx]>='A' && ch[idx]<='Z'){
				upper++;
			}//if end
			
			if(ch[idx]>='a' && ch[idx]<='z'){
				lower++;
			}//if end
			
		}
		System.out.println("대문자수"+upper);
		System.out.println("소문자수"+lower);
			

 

 

 

 

 

댓글