JAVA/정올 문제풀이

기초 다지기 135 : 반복제어문2 - 형성평가6

최뭉뭉 2018. 12. 29. 22:01

*완전!!!! 기초부터 혼자 공부하면서 기록하기 위해 쓰는 글입니다. 부족한 부분이 많습니다. 혹시 가르쳐주실 부분이 있으시면 댓글 언제든지 환영합니다 :D

참고로, 이클립스를 사용했습니다!



문제:

두 개의 정수를 입력받아 두 정수 사이(두 정수를 포함)에 3의 배수이거나 5의 배수인 수들의 합과 평균을 출력하는 프로그램을 작성하시오.

(평균은 반올림하여 소수 첫째자리까지 출력한다.)





일단 데이터값을 입력받기 위해서는

import java.util.Scanner;     ☞ Scanner를 import해주고, 

Scanner sc=new Scanner(System.in);    ☞  Scanner 객체를 생성해줘야 합니다.




int a=sc.nextInt();

int b=sc.nextInt();

☞그 다음엔 두 개의 정수를 입력받을 수 있도록 int형 변수 a와 b를 설정해둡니다.









int sum=0;

int cnt=0;

float avg=0;

☞ 필요한 변수들을 생성한 후 초기화시켜줍니다.

sum 변수는 합계를 저장해줄겁니다. 계속 입력받은 변수를 더해서 저장해놔야겠죠?

일단 cnt는 현재 입력된 변수가 몇개인지 세는 역할을 할 겁니다. 그래야 합계를 총 개수로 나눌 수 있으니까요!

avg 변수는 누가 봐도 평균함수일 겁니다 ㅎ.ㅎ... 소수까지 저장시켜줘야 하므로 float형 실수형 변수로 만들어줬습니다.

즉, avg 변수에는 sum/cnt를 한 값이 들어가겠죵? 

cnt변수와 sum변수에는 정수가 들어갈 것이기 때문에 int형 변수로 지정해줬답니다










int min=(a<b)?a:b;

int max=(a<b)?b:a;

☞ int형 변수인 min과 max를 만들어줘서 그 안에 최소값과 최대값을 넣어주는 작업을 할 건데요

이런 작업을 하는 이유는 우리가 입력하는 두 정수 중 앞에 있는 값이 더 클지 뒤에 있는 값이 더 클지 모르기 때문에 최소값과 최대값을 딱 정해주고 for 문을 돌리기 위한거죠!

이렇게 생긴 걸 삼항연산자라고 하는데요, 괄호 안에 있는 조건이 참이라면 앞에 있는 값을 min에 집어넣고, 거짓이라면 뒤에 있는 값을 min에 집어넣는 겁니다.

첫 문장을  if문으로 표현하면 아마

if(a<b){ 

int min=a;

}else{

int min=b; }

이런 코드가 되었을 거에요... 그것을 한문장으로 간단하게 표현하는 magic!

코드는 간결하고 이해하기 쉬울수록 좋으니까요! 

만약 a가 더 작다면 min=a가 되고, b가 더 작다면 min은 b가 되겠죠?

max도 마찬가지로 a가 더 크다면 max=a, b가 더 크다면 max=b가 됩니다.






for(int i=min;i<=max;i++){

☞ for문은 while문과 같은 반복제어문 중 하나로 기본 구조는 for(초기값; 조건식; 증감식) 입니다

초기값 부분에는 for문을 입력값 중 작은 수부터 시작해야 하므로 int형 변수 i를 만들어주고 min으로 설정해줍니다.

두번째 부분인 조건식에는 반복문이 실행될 조건을 넣어줍니다. 이 조건식이 참일때만 반복문이 실행됩니다.

저는 min에서 max까지 반복문을 실행시킬 것이기 때문에 i가 max 이하라는 조건식을 넣어줍니다. 

마지막 증감식 부분에는 반복문이 계속 돌아가는 무한루프를 벗어나기 위해 i의 값을 변경시켜주는 증감식을 넣어줍니다.

i++는 i=i+1과 같은 의미입니다.







if(i%3==0||i%5==0){

 이처럼 ()안의 조건을 만족할 때 {} 안의 문장을 실행하는 if문을 조건문이라고 합니다.

% 연산자는 a를 b로 나눴을 때 몫을 제외한 나머지 값만 돌려줍니다.

예를 들어 5%3을 출력해보시면 나머지값인 2가 출력됩니다.

i를 3으로 나눴을 때 나머지가 0인건 i가 3의 배수, 5로 나눴을 때 나머지가 0인건 i가 5의 배수라는 걸 뜻합니다.

둘 중 하나를 만족한다면 합과 평균을 출력해줘야 하기 때문에 ||연산자를 사용해줍니다.

|| 연산자는 둘 중 하나만 참이어도 조건이 만족됩니다. | 를 쓸때는 Shift+\ 표시를 누르시면 된답니다! 







sum+=i;

 sum은 합계를 구하는 함수이기 때문에 입력받은 i변수를 계속 더해줍니다.

sum+=i 는 sum=sum+i 와 같은 문장입니다.












cnt++;

☞ cnt 변수의 개수도 조건을 만족할때마다 1씩 늘려줍니다.

그래야 cnt에 조건을 만족하는 수의 총개수가 저장되어서 sum을 나눠줄수 있겠죠?








avg=(float)sum/(float)cnt;

 avg 함수에 평균을 구해서 저장해야 하므로 sum/cnt를 한 값을 저장해줍니다.

여기서 주의해야 할 점은 현재 sum 변수와 cnt 변수는 int형으로 지정이 되어있기 때문에 그냥 sum/cnt로 계산을 하면 계산결과도 int형으로 나옵니다.

우리는 소수점 첫째 자리까지 출력해야 하므로 sum값고 cnt값도 모두 실수형인 float형으로 바꿔줍니다.

저렇게 앞에 (float)를 붙여서 다른 형으로 형변환을 하는 것을 casting(캐스팅)이라고 합니다.








System.out.println("sum : "+sum);

 for문 밖에 println 출력문을 써서 sum 변수를 출력해줍니다.

println 출력문은 그냥 print문과는 달리 출력 후 자동으로 한줄을 바꿔줍니다. 그래서 line의 뜻인 ln이 뒤에 붙는거죠





System.out.printf("%.1f",avg);

 그 밑엔 printf 출력문을 써서 avg 변수를 출력해줍니다.

printf 출력문은 %d, %f, %s 와 같은 서식을 써서 변수를 넣기 용이하게 만들어져 있는 출력문입니다.

소수 첫째자리까지 출력하고 싶을 때는 "%.1f"를 쓰고 , 뒤에 넣고 싶은 변수명을 써주시면 됩니다.

avg를 소수첫째자리까지 반올림하고 싶으므로 ("%.1f",avg)를 넣어줬습니다.












어디 한번 실행을 해보겠습니다.


  10 15 라는 두개의 정수를 입력해봤습니다.

그러면 for문이 min값인 10부터 max값인 15까지 실행이 될겁니다

10부터 15까지 돌아가면서 3의 배수인 12, 15와 5의 배수인 10, 15가 조건을 만족합니다.

즉 10, 12, 15 세 숫자를 가지고 합과 평균을 구하겠네요

cnt에는 3이 저장되어 있을거고 sum은 10+12+15=37입니다.

그 후엔 37/3을 계산한 후 소수 첫째자리까지 반올림한 12.3이 avg 값이 되어 저장이 됩니다.






이렇게 이번 문제도 무난하게 클리어했답니다 후후