[11] Java 연습문제 02 - for문 연습문제

kangsun·2022년 9월 18일
0

Java

목록 보기
12/44

1. 알파벳 한 줄에 5개씩 출력하기

ABCDE
FGHIJ
KLMNO
PQRST
UVWXY
Z

[강사님 풀이]

		int count=0;
        
		for (char ch='A'; ch<='Z'; ch++) {
			count++;
			System.out.print(ch);
//			System.out.print(count + " ");
 			if(count%5==0) {
				System.out.println();
			}//if end
		}//for end
		
		System.out.println();

[해설]

  • for (char ch='A'; ch<='Z'; ch++)

    - for문을 이용해서 대문자 A부터 Z까지 읽도록 한다.

  • count++;    →    int count=0;

    - count 변수에 증감연산자로 넣어주면

    - 5의 배수일 때 println(); 을 적용시켜주면 된다는 것을 확인할 수 있다.

  • if(count%5==0)

    - count 정수형 변수에 나머지연산자 %로 5를 나누어 남은 값이 0과 같으면 (=5의 배수면)

  • System.out.println();

    - 줄바꿔서 출력



[⚠️ 오답노트]

✔️ int count = 0; 변수를 따로 생성할 생각을 하지 못했다.

✔️ 숫자형 변수를 주고 if문에 (count%5==0) 를 주었으면 간단하게 풀었을 텐데.. 문자형에 연산자를 주려하니 얼마를 나눠야 하는지 생각하다가 시간을 많이 잡아 먹었다.

✏️ 문자형을 나열하고 줄바꾸기 할 때는 숫자형 변수를 하나 생성해서 풀어보자.

[또 다른 풀이]

문자형에 나머지 연산자 사용하기 (아스키코드 적용)

		for(char ch='A'; ch<='Z'; ch++) {
			if(ch%5==4){
				System.out.println(ch);
			} else  {
			System.out.print(ch);
					}
		}//for end
		System.out.println();
  • 아스키 코드에서 E,J,O,T,Y는 5로 나누었을 때 나머지값이 4가 나온다.

  • for(char ch='A'; ch<='Z'; ch++)

    - 반복문으로 대문자 A-Z 까지 읽도록 한다.

  • if(ch%5==4)

    - 문자를 5로 나누었을 때 나머지값이 4로 나오면

  • System.out.println(ch); - true

    - 줄을 띄어서 출력하고

  • else {System.out.print(ch);} - false

    - 나머지값이 4로 나오지 않는다면 일렬로 출력한다.


2. # 역삼각형으로 출력하기

           ####
            ###
             ##
              #

[강사님 풀이]

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

[해설]

  • for (int a=1; a<=4; a++) {
    	for (int b=1; b<=4; b++) {

    - a=1 일 때 b=1,2,3,4를 출력한다. 맨 윗줄은 1,2,3,4 모두 다 출력하려면 1과 같거나 큰 수가 와야한다. (a<=b) 1 <= 1,2,3,4
    - a=2일 때 b=1,2,3,4 를 출력한다. 두번째 줄은 2,3,4만 출력하려면 2와 같거나 큰 수만 와야한다. (a<=b) 2<=2,3,4
    - 나머지 a=3, a=4도 반복해서 출력한다.

  • System.out.print("#"); - true

    - a보다 같거나 큰 수가 오면 # 출력

  • System.out.print(" "); - false

    - else 아니라면 공백 출력


[⚠️ 오답노트]

		for (int a=4; a>=1; a--) {
			for (int b=1; b<=a; b++) {
				System.out.print("#");
			}//for end
			System.out.println();
		}//for end
이렇게 출력됨..

####
###
##
#

✔️ 4x4칸 모두 출력하고 공백을 줄 생각을 하지 못했음.

✏️ 모양을 보고 어떻게 출력할지 생각하지 말고, 저 형태를 숫자로 바꿔서 생각해보기


3. 분수 계산하기

	* 다음식의 결과값을 구하시오.
    
        1   2    3    4    5      99
        ─ - ─ + ─ - ─ + ─ ...     ──   = ?
        2   3    4    5    6      100

[강사님 풀이]

		double hap=0.0;
		boolean flag=false;
		
		for(int a=1; a<=99; 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);
		
		System.out.println();

💻 console
0.6881721793101957

[해설]

  • double hap=0.0;

    - 분수를 더하기 때문에 합을 넣을 수 있는 실수형 변수를 하나 생성한다.

  • boolean flag=false;

    - true, false 값이 들어갈 수 있는 flag변수에 flase값을 넣어준다.
    - 왜냐하면, - + 를 교차로 연산시켜줘야 하기 때문이다.

  • for(int a=1; a<=99; a++)

    - 반복문으로 1-99까지 숫자가 나올 수 있도록 범위를 지정한다. (식을 보면 범위는 1-100까지 인데 왜 1-99까지만 합니까? 에 대한 답 클릭!)

  • if(flag) {
    			hap = hap - (a/(double)(a+1));
    			flag=false;
                }

    - if(flag)에서 flag는 boolean flag=false; 이므로 else문으로 간다.

  • else {
    		hap = hap + (a/(double)(a+1));
    		flag=true;
    		}//if end

    - (a/(double)(a+1))를 연산한 값을 hap 변수에 넣어준다.
    - (double) 은 a와 a+1이 정수형이기 때문에 강제 형변환을 시켜야 실수형으로 값을 도출할 수 있다.
    - (a/(double)(a+1)) : 분수 숫자의 변형 패선을 보면 a/a+1 인 것을 알 수 있다.
    - 그리고 flag=true; flag값을 true로 바꿔주어 boolean flag=true; 로 바뀝니다!
    - 그럼 if문이 실행되어 빼기값이 들어가겠죠~

       a	    a		 a		  a
      ⎯⎯	-  ⎯⎯	 +  ⎯⎯	  -  ⎯⎯ . . . 
      a+1	   a+1		a+1		 a+1
  • 여기서 a를 for문으로 i++증가시켜주면 a와 a+1도 1씩 100까지 증가할 것이다.

  • ✅ 99까지 설정한 이유 찾아오셨죠? ㅎㅎ
    ↳ 분모엔 a+1이 되기 때문에 99까지만 해줘도 되는 것이었습니다!.. 대단하죠?



[⚠️ 오답노트]
✔️ 구글 검색해서 풀었다...

		double hap1 = 0.0;
		javaboolean 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);

✔️ flag에 대한 정확한 개념을 알지못하고 긁었기 때문에 의미가 없음.. (그래도 한게 어디?..)
✔️ flag로 할 생각을 일단 못했고
✔️ (a/(double)(a+1))의 패턴을 찾지 못했음..

* flag변수 : 스위치 변수로 미리 true, false값 둘 중에 하나를 넣어놓고, 어떤 조건에 부합하면 flag의 기존 값을 반대로 바꿔준다. 그 값을 비교해서 true나 false에 따라서 처리가 달라지는 것

✏️ 먼저 주어진 값의 숫자의 범위를 확인하고, 그 값 안에서 어떻게 처리를 할지 잘 생각해보자.
✏️ - + 교차로 연산해야하니까 flag를 활용해야겠다는 생각!!
✏️ 반드시 변수와 연산자의 자료형이 일치하는지 체크할것!!


4. 1-100에서 10단위로 누적합 구하기

	* 아래와 같이 계산해서 출력하시오
    
           1+....+10=55
           11+....+20=155
           21+....+30=255

           81+....+90=
           91+....+100=955   

[강사님 풀이]

		int sum=0;
        
		for(int a=10; a<=100; a+=10) {	
//			System.out.println(a);
			for(int b=a-9; b<=a; b++) {	
//				System.out.println(b);	
				sum=sum+b;
			}//for end
			System.out.println((a-9) + "+...+" + a + "=" + sum);
			sum=0;
		}//for end
	
		System.out.println();

💻 console
1+...+10=55
11+...+20=155
21+...+30=255
31+...+40=355
41+...+50=455
51+...+60=555
61+...+70=655
71+...+80=755
81+...+90=855
91+...+100=955

[해설]

  • int sum=0;
    - 누적합 구할 변수
  • for(int a=10; a<=100; a+=10) 
    - 10부터 10씩 더해서 100이 되기 전까지 반복하는 반복문
    - 계산식을 보면 누적의 합이 시작되는 숫자와 마지막 숫자가 -9씩 차이가 나는 것을 알 수 있다. (우와..)
  • for(int b=a-9; b<=a; b++)
    - 2중 for문, a가 100전까지 10씩 증가할때 b는 a-9부터 a전까지 증가시킨다.
    - a=10일 때 b=10-9; 1<=10 --> 그럼 b<=10이 될 때까지만 반복한다. --> a=20 이면 20-9=11 부터 20까지 , a=30일 때 30-9, 21부터 30까지 반복..
  • sum=sum+b; 
    - 이 조건을 만족하는 동안은 sum 변수에 누적해서 더한다.
  • System.out.println((a-9) + "+...+" + a + "=" + sum);
    - 두번째 for문이 종료되면 반복문을 빠져나와 괄호안에 있는 문장을 출력한다.
    - 1+...+10=55
  • sum=0;
    - 누적의 합 초기화
    - 1부터 10까지 더한 후 11부터 20은 다시 0부터 누적해야하기 때문에 꼭 sum=0;으로 설정해줘야 한다.


[⚠️ 오답노트]
✔️ -9 씩 차이가 반복된다는 점을 찾기는 커녕.. 1부터 100까지 반복문 돌림..
✔️ 이중for문.. a값을 넣어야 한다는 걸 생각 못함 ~~ 이야~!!
✔️ sum=0;..

✏️ 강사님께서는 식의 반복되는 패턴을 캐치하셔서 그걸 코드에 반영하시는 것 같다.
✏️ 합을 새로 구할 때 초기화식 sum=0; 꼭 떠올리기~!!


5. 달팽이가 나무꼭대기에 올라가려면 며칠이 걸릴까?

	* 어느 달팽이는 낮에는 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;
			}//if end
		}//while
		
		System.out.println(day + "일");

💻 console
21일

[해설]

  • int day=0;
    - 며칠 걸리는지? 변수 생성 (결과값)
  • double snail=0.0;
    - 달팽이 오르락 내리락하는 cm값 여기에 누적시키기
  • while(true)
    - 무한 반복문으로 설정
  • day++;	
    - +1일
  • snail=snail+3.0;
    - 낮에는 3cm 올라감
  • 	if(snail>=13.0) {
    		break;
        }
    - 달팽이가 13cm 의 나무 꼭대기에 올라가면 반복문 완전히 빠져나감. 종료
  • else {
    	snail=snail-2.5;
    }//if end
    - 13cm 도달하지 못하면 밤에는 -2.5씩 내려옴


[⚠️ 오답노트]
✔️ 결과값을 미리 보여주셨을 때랑은 다른 유형의.. 스토리텔링식 문제..
✔️ 도대체 어디서부터 설정해야하는지 감도 안왔음
✔️ 낮에는 +3, 밤에는 -2.5, 13일때 break를 줘야하는지까지 생각했지만 반복문, if문 변수 생성.. 하지 못했다. 시간도 부족해서 풀지 못했음..

✏️ 밤에는 2.5씩 내려오기 때문에 달팽이 변수 double로 줘야한다는 점 잊지말기!! (자료형 일치!!!)

profile
코딩 공부 💻

0개의 댓글