본문 바로가기

공부/자바 OOP

5월 21일 - while/ do~while 반복문+ 도형 + 연습문제

금요일 과제)
 운행거리에 따라 택시 요금을 계산하는 프로그램
 2000m까지는 기본요금 900원이고,
 2000m초과 운행시 200m단위마다 
 기본요금에 100원씩 가산하여 요금을 계산한다 
 예) 운행거리 :3000m
      기본요금 :900원
      초과거리 1000m
      초과요금 500원

//내 풀이
int more = 3000;
int money = 900 ;
int y=more-2000 ;
		
if (more<=2000){
	System.out.println(money);
}else if(more>2000&&(y%200)%2==1){
	System.out.println(money+(y+1));
}else if(more>2000&&(y%200)%2==0){
	System.out.println(money+((y)));
}//if end

출력결과
1900
        
//선생님 풀이
int distance = 3000; //총운행거리
int fee = 0;         //기본요금
int overFee = 0;     //추가요금
        
if (distance<=2000) {
     fee = 900;
}else {
     int exceed = distance-2000;  //초과거리
     overFee = (exceed/200) * 100;
     fee = 900 + overFee; 
}//if end
        
System.out.println("총운행거리 : " + distance);
System.out.println("기본요금 : 900");
System.out.println("추가요금 : " + overFee);
System.out.println("전체요금 : " + fee);

출력결과
총운행거리 : 3000
기본요금 : 900
추가요금 : 500
전체요금 : 1400

*내 풀이

미완성풀이, 못 풀었다는 거다 ㅋㅋㅋ 

초과거리를 변수 y로 선언후 y를 %200으로 한 나머지의 짝홀수 분별법으로 하려고 했는데 결과는 폭망

200m단위로 움직이니, 1m를 초과해도 200m값의 가격을 내야한다. 그래서 홀수로 떨어질땐 무조건 +1을 하여 

초과거리에 곱해야겠다고 생각을 했는데... 짝꿍에게 내 코딩을 보여준 후, y%200 이 식에서 만약 y가 200이하일 경우 

y가 그대로 출력이 되니 말이 안된다는 피드백을 해주었다. ㅁㅣ 완 성 풀이가 아닌 틀린 거..

 

*선생님 풀이 

,,

어제자 문제 7 ) 다음식의 결과를 구하시오

switch 이론

//선생님 풀이
double hap = 0.0 ;
boolean flag = false ;

for (int a=1; a<100; a++) {
     if(flag){
        hap = hap - (a/(double)(a+1));
        flag = false ;
     }else{
        hap = hap + (a/(double)(a+1));
        flag = true;
     }//if end
}//for end
        
System.out.println(hap);

출력결과
0.6881721793101957

While 반복문

 

1) while문

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

while(true){ } -> 무한LOOP / 조건이 true일때엔 계속 반복하므로 무한으로 뺑뺑 돔

for( ; ; ){ }     -> 무한LOOP 

예제) while

int a =1;

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

출력결과
JAVA
JAVA
JAVA

int a =1;
while(a<=10){
	System.out.println("SEOUL");
	a++;
}//while end
	
출력결과
SEOUL
SEOUL
SEOUL
SEOUL
SEOUL
SEOUL
SEOUL
SEOUL
SEOUL
SEOUL

 a++; 이 없으면 무한LOOP

예제) while ~ break

int a =1;
while(true){ //무한LOOP
	System.out.println("SEOUL");
    if(a==5){
		break; //반복문 탈출
	}//if 
		a++;
}//while end

출력결과
SEOUL
SEOUL
SEOUL
SEOUL
SEOUL

 

2) do~while문

형식 : do {

                조건이 true이면 수행

         } while (조건);

예제) do~while

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

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

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

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

 

예제) do~while

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

SEOUL  b=5+1  while(6<=3)

//조건의 참, 거짓과는 상관없이 무조건 한번은 수행된다.

 

<do~while 연습문제>

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

10-3=7

  7-3=4

  4-3=1

  1-3=-2

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

출력결과
4

->분석 :

while(true)

{ count=0+1

  su=10-3

  if(7<0)      }

while(true)

{ count=1+1

  su=7-3

  if(7<0)      }

 

 

 

 

문제 2) 어느 달팽이는 낮에는 3cm 올라가고 밤에는 2.5cm 내려온다고 할 때, 

          달팽이가 13cm의 나무 꼭대기에 올라가려면 며칠이 걸리는지 구하시오.

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일

*13cm에 도달했을 때엔 내려올 필요가 없다. 즉, 하루에 0.5cm 움직이지만 낮에 3cm올라가서 13cm에 도달했다하면,

안내려와도 된다는 말, 문제파악 필요 

 


이중 반복문

 

*이중 for

구구단, 시계

시계 - 시침이 한칸돌 때 30도, 분침은 한바퀴 돌아야함 360도 (각도로 응용)

 

예제) 이중반복문 

for (int a=1; a<=2; a++){
	System.out.println("JAVA");
			
	for(int b=1; b<=3; b++){
		System.out.println("SEOUL");
	}//for			
}//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

예제) 구구단

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));
	}//for
}//for

구구단은 모두 9줄 -> b 변수 범위설정 9

첫번째 for의 a값이 두번째 for에 들어갔을때 a는 불변 b변수 변화값으로 돌아가고 올라가고 

신기하다

 

도형만들기

1) 사각형 : 등수구할 때 회전수 참조! 

등수구하는 알고리즘

for (int a=1; a<=4; a++){ //회전수 4번
	for (int b=1;b<=4;b++){
		System.out.print("#");
	}
	System.out.println();
}//for end

출력결과
####
####
####
####

 

회전수로 돌려돌려 , 멀리보면 사각형모양이 보인다. 선으로 안나옴 ㅋㅋㅋ

4개씩 정렬해야하므로 print만 적어준다. 첫번째 for구문에 ln처리해줘서 엔터하기

->분석 :

a=1

     b=1  1<=4  #

            2<=4  #

            3<=4  # 

            4<=4  #  

a=2

     b=1  1<=4  #

            2<=4  #

            3<=4  # 

            4<=4  #  

 

2) 삼각형 : 회전수 증가, 

            예) 로또번호 만들 때,

로또번호에 적용되는 알고리즘

for (int a=1; a<=4; a++){ 
	for (int b=1;b<=a;b++){
		System.out.print("*");
	}
    System.out.println();
}//for end
	
출력결과
*
**
***
****

위의 사각형과 한끝차이, 두번째 for구문에 b변수에 a로 대입해 비교하며 빼기해서 출력

->분석 : 할때마다 회전수가 증가

a=1 *

     b=1  1<=1  *

a=2 **

     b=1  1<=2  *

     b=1  2<=2  *

 

3) 역삼각형 : 회전수 감소,

                예) 정렬 알고리즘

예) 정렬 알고리즘

for (int a=4; a>=1; a--){ 
	for (int b=1;b<=a;b++){
		System.out.print("*");
	}
	System.out.println();
}//for end

출력결과
****
***
**
*

회전수가 줄어들고 있으므로 a의 변수는 감소,

->분석 :

a=4  ****

     b=1  1<=4  *

            2<=4  *

            3<=4  *

            4<=4  *

a=3  ***

     b=1  1<=3  *

            2<=3 *

            3<=3  *

         


<연습문제>  

문제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("*");
		}
	}//for			
	System.out.println();
}//for end

행이랑 열값이 같을 때 @,

좌표값을 이용해, (1,1) (2,2) (3,3) (4,4) 을 해서 if절에 같을땐 @ 아닐땐 *로 출력

 

 

문제2) 

            ★

               

                 

사각형이라 생각하고 , 안보이는 곳은 공백으로 생각

//내 풀이
for(int x=1; x<=4; x++){
	for(int y=1; y<=4; y++){
		if(x==y){
			System.out.print("*");
		}else if(x>y){
			System.out.print(" ");					
		}else{
			System.out.print("*");
		}
	}//for
	System.out.println();
}//for

출력결과
****
 ***
  **
   *
   
//선생님 풀이
for(int x=1; x<=4; x++){
	for(int y=1; y<=4; y++){
		if(x<=y){
			System.out.print("*");
		}else{
			System.out.print(" ");
		}
	}
    System.out.println();
}//for

출력결과
****
 ***
  **
   *

이것 역시 좌표의 응용으로 한다

if의 조건을 나눠서 적었다, 세파트로 나워서 조건을 세웠지만 크게 보면 공백과 별 두가지뿐이기 때문에

두가지 조건을 나눠서 하면 됨/ 

 

문제3) 12345

         23456

         34567

         45678

         56789

한 줄에 있는 숫자 규칙

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

 

문제4) 2g, 3g, 5g짜리 추가 각각 5개씩 있을 때, 세가지의 추의 조합으로 무게가 40~45사이일 때 

         각 추의 갯수와 무게를 출력하는 프로그램

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

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

         

         

         

'공부 > 자바 OOP' 카테고리의 다른 글

5월 22일 - 배열 2+연습문제  (0) 2019.05.22
5월 21일 - 배열 1  (0) 2019.05.21
5월20일 - 반복문 For + 연습문제  (0) 2019.05.20
5월 17일 - 제어문 + QUIZ(if, switch)  (0) 2019.05.17
5월 17일 - 자바OOP 1 : 연산자  (0) 2019.05.16