//1부터 20까지의 정수 중에서 2 또는 3의 배수가 아닌 수의 총합을 구하시오.
int i = 0; //i는 증가하는 정수
int sum = 0;//sum은 i의 값 중 2또는 3의 배수가 아닐때 누계한 값
for(i=1;i<=20;i++) {
❌//2의 배수이면서 3의배수인 값의 반대는 2의 배수 또는 3의 배수가 아닐 때이다.
if(!(i%2==0&&i%3==0)) {
sum +=i;
System.out.printf("현재 %d를 더했고, 누계는 %d입니다.%n",i,sum);
}
}
<결과>
현재 1를 더했고, 누계는 1입니다.
현재 2를 더했고, 누계는 3입니다.
현재 3를 더했고, 누계는 6입니다.
현재 4를 더했고, 누계는 10입니다.
현재 5를 더했고, 누계는 15입니다.
현재 7를 더했고, 누계는 22입니다.
현재 8를 더했고, 누계는 30입니다.
현재 9를 더했고, 누계는 39입니다.
현재 10를 더했고, 누계는 49입니다.
현재 11를 더했고, 누계는 60입니다.
현재 13를 더했고, 누계는 73입니다.
현재 14를 더했고, 누계는 87입니다.
현재 15를 더했고, 누계는 102입니다.
현재 16를 더했고, 누계는 118입니다.
현재 17를 더했고, 누계는 135입니다.
현재 19를 더했고, 누계는 154입니다.
현재 20를 더했고, 누계는 174입니다.
<모범풀이>
//1부터 20까지의 정수 중에서 2 또는 3의 배수가 아닌 수의 총합을 구하시오.
int i = 0; //i는 증가하는 정수
int sum = 0;//sum은 i의 값 중 2또는 3의 배수가 아닐때 누계한 값
for(i=1;i<=20;i++) {
//2의 배수이면서 3의배수인 값의 반대는 2의 배수 또는 3의 배수가 아닐 때이다.
if(!(i%2==0||i%3==0)) {
sum +=i;
System.out.printf("현재 %d를 더했고, 누계는 %d입니다.%n",i,sum);
}
}
<모범결과>
현재 1를 더했고, 누계는 1입니다.
현재 5를 더했고, 누계는 6입니다.
현재 7를 더했고, 누계는 13입니다.
현재 11를 더했고, 누계는 24입니다.
현재 13를 더했고, 누계는 37입니다.
현재 17를 더했고, 누계는 54입니다.
현재 19를 더했고, 누계는 73입니다.
!(i%2==0&&i%3==0)
라고 정의한 것이 잘못되었다. !(i%2==0&&i%3==0)
는 i%2!=0||i%3!=0
이다. 즉, '2의 배수가 아니거나 3의 배수가 아닌 수'를 뜻하는 것이다.!(i%2==0||i%3==0)
로 정의 되어야 한다. 즉, i%2!=0&&i%3!=0
이 되어야 하는 것이다. <나의 풀이>
int sum = 0; //총 합계
//i는 1부터 10까지 다음 수행문 반복
for(int i=1; i<=10; i++) {
//j는 1부터 i까지 다음 수행문 반복
for(int j=1; j<=i; j++) {
//j의 값이 계속해서 sum에 누계하여 저장
sum +=j;
System.out.printf("+%d=%d ",j,sum);
}
System.out.println();
}
<나의 결과>
+1=1
+1=2 +2=4
+1=5 +2=7 +3=10
+1=11 +2=13 +3=16 +4=20
+1=21 +2=23 +3=26 +4=30 +5=35
+1=36 +2=38 +3=41 +4=45 +5=50 +6=56
+1=57 +2=59 +3=62 +4=66 +5=71 +6=77 +7=84
+1=85 +2=87 +3=90 +4=94 +5=99 +6=105 +7=112 +8=120
+1=121 +2=123 +3=126 +4=130 +5=135 +6=141 +7=148 +8=156 +9=165
+1=166 +2=168 +3=171 +4=175 +5=180 +6=186 +7=193 +8=201 +9=210 +10=220
<모범 풀이>
int sum = 0;
int totalSum = 0;
for(int i=1; i <=10; i++) {
sum += i;
totalSum += sum;
}
System.out.println("totalSum="+totalSum);
<모범 결과>
totalSum=220
int odd = 0;
int even = 0;
int sum = 0;
//
for(int i=1; sum<100; i++) {
//짝수인 경우
if(i%2==0) {
even = -i;
sum += even;
System.out.printf("+(%d) = %d%n", even, sum);
}
//홀수인 경우
else {
odd = i;
sum += odd;
System.out.printf("+%d = %d%n", odd, sum);
}
}
// for문을 벗어나면 현재 i번째 값과 sum값을 출력한다.
// i번째 값은 for문 안에서만 통용되나보다. odd값이 곧 i이므로 i 대신 odd를 넣어주자
System.out.printf("현재 %d째, 총 합계는 %d", odd, sum);
<결과>
...(전략)
+197 = 99
+(-198) = -99
+199 = 100
현재 199째, 총 합계는 100
int sum = 0; // 총합을 저장할 변수
int s = 1; // 값의 부호를 바꿔주는데 사용할 변수
int num = 0;
// true . 조건식의 값이 이므로 무한반복문이 된다
for(int i=1;true; i++, s=-s) { // s 1, -1, 1, -1... 매 반복마다 의 값은
num = s * i; // i (s) . 와 부호 를 곱해서 더할 값을 구한다
sum += num;
if(sum >=100) // 100 . 총합이 보다 같거나 크면 반복문을 빠져 나간다
break;
}
System.out.println("num="+num);
System.out.println("sum="+sum);
<예제>
for (int i = 0; i <= 10; i++) {
for (int j = 0; j <= i; j++)
System.out.print("*");
System.out.println();
}
<예제 결과>
*
**
***
****
*****
******
*******
********
*********
**********
***********
int i=0;
int j=0;
// i는 0에서 10이 될 때까지 (11번)
while(i<=10) {
// j가 i 이하일 때 그만큼 "*"를 찍는 것을 반복한다.
while(j<=i) {
System.out.print("*");
j++; // j값을 증가시키지 않으면 *찍는게 끝나지 않는다. (처음엔 생략했었음)
}
i++; // i값만큼 *을 찍고나면 i를 1 증가시켜야 한다.
// 별 피라미드 계층을 만드려면 엔터를 작동시켜야 한다.
System.out.println();
}
<결과>
*
*
*
*
*
*
*
*
*
*
*
int i=0;
int j=0;
// i는 0에서 10이 될 때까지 (11번)
while(i<=10) {
// j가 i 이하일 때 그만큼 "*"를 찍는 것을 반복한다.
while(j<=i) {
System.out.print("*");
j++; // j값을 증가시키지 않으면 *찍는게 끝나지 않는다. (처음엔 생략했었음)
}
j=0; //💡 while과 for문이 다른점!! while은 초기화문이 없어 직접 초기화해줘야함!
// (내부 while문일 경우)
i++; // i값만큼 *을 찍고나면 i를 1 증가시켜야 한다.
// 별 피라미드 계층을 만드려면 엔터를 작동시켜야 한다.
System.out.println();
}
<결과>
*
**
***
****
*****
******
*******
********
*********
**********
***********
int i=0;
while( i<=10) {
int j=0;
while(j<=i) {
System.out.print("*");
j++;
}
System.out.println();
i++;
}
<내 풀이>
int a; // 주사위 A의 수
int b; // 주사위 B의 수
for (a=1; a<=6; a++) {
for (b=1; b<=6; b++) {
if (a+b==6) {
System.out.printf("A(%d)+B(%d)=%d%n", a, b, a+b);
}
}
}
<결과>
A(1)+B(5)=6
A(2)+B(4)=6
A(3)+B(3)=6
A(4)+B(2)=6
A(5)+B(1)=6
<모범 답안>
for(int i=1;i<=6;i++)
for(int j=1;j<=6;j++)
if(i+j==6)
System.out.println(i+"+"+j+"="+(i+j));
<결과>
1+5=6
2+4=6
3+3=6
4+2=6
5+1=6
String str = "12345";
int i = Integer.parseInt(str); // str을 정수형으로 바꿔 변수 i에 담아준다.
int a = 0; //잘리는 일의자리 수
int sum = 0; //잘리는 일의자리 수들의 총계
int tmp = i; //계속 잘린 수, 최초에는 i로 시작해야하므로 i로 초기화
//잘리는 수가 0이하가 되면 false로 반복문 종료
while(tmp>0) {
a = tmp%10; //잘리는 일의자리 수 담기
System.out.printf("+%d ",a); //현재 일의자리 수
tmp = tmp/10; //일의자리 수 버리기 (tmp /= 10)이어도 된다.
sum += a; //sum은 잘린 일의자리 수들의 누계이다.
}
System.out.println();
System.out.printf("총계=%d",sum);
<결과>
+5 +4 +3 +2 +1
총계=15
class Exercise4_7 {
public static void main(String[] args) {
String str = "12345";
int sum = 0;
for (int i = 0; i < str.length(); i++) {
/*
(1) 알맞은 코드를 넣어 완성하시오.
*/
}
System.out.println("sum=" + sum);
}
}
String str = "12345";
int sum = 0;
for (int i = 0; i < str.length(); i++) {
// 임시 변수 tmp에 str의 i번째 문자-'0'로 숫자로 만든 값을 저장한다.
int tmp = str.charAt(i)-'0';
// sum에 tmp의 값을 누계한다.
sum += tmp;
}
System.out.println("sum=" + sum);
}
<모범 답안>
class Exercise4_7 {
public static void main(String[] args) {
String str = "12345";
int sum = 0;
for(int i=0; i < str.length(); i++) {
sum += str.charAt(i) - '0';
}
System.out.println("sum="+sum);
}
}
<결과>
sum=15
sum += str.charAt(i) - '0'
를 활용하는 것이 더 간결하다.<예제>
int value = ( /* (1) */ );
System.out.println("value:"+value);
<풀이>
int value = (int) (Math.random()*6)+1;
System.out.println("value:"+value);
}
0.0 *6 <= Math.random() *6 < 1.0 *6
(int) 0.0 <= (int) (Math.random() *6) < (int) 6.0
(int) 1.0 <= (int) (Math.random() *6)+1 < (int) 6.0 +1
1 <= (int) ((Math.random() *6)+1) < 7
<문제>
int num = 12345;
int sum = 0;
/*
(2) 알맞은 코드를 넣어 완성하시오.
*/
System.out.println("sum="+sum);
<풀이>
int num = 12345;
int sum = 0;
/*
(2) 알맞은 코드를 넣어 완성하시오.
*/
// num이 0이 되기 전까지 반복. (num은 정수이므로 0이 최소값이다.)
for(int i=1; num>0; i++) {
sum += num%10; //sum은 num의 일의자리 수들의 합
num /= 10; //num =num/10 ,num에서 일의자리 수는 계속 잘라 주어야 함.
}
System.out.println("sum="+sum);
<문제>
// 1~100사이의 임의의 값을 얻어서 answer에 저장한다.
int answer = /* (1) */ ;
int input = 0; // 사용자입력을 저장할 공간
int count = 0; // 시도횟수를 세기위한 변수
// 화면으로 부터 사용자입력을 받기 위해서 Scanner클래스 사용
java.util.Scanner s = new java.util.Scanner(System.in);
do {
count++;
System.out.print("1과 100사이의 값을 입력하세요 :");
input = s.nextInt(); // 입력받은 값을 변수 input에 저장한다.
/*
(2) 알맞은 코드를 넣어 완성하시오.
*/
} while(true); // 무한반복문
// 1~100사이의 임의의 값을 얻어서 answer에 저장한다.
int answer = (int)(Math.random()*100) +1 ;
int input = 0; // 사용자입력을 저장할 공간
int count = 0; // 시도횟수를 세기위한 변수
// 화면으로 부터 사용자입력을 받기 위해서 Scanner클래스 사용
java.util.Scanner s = new java.util.Scanner(System.in);
do {
count++;
System.out.print("1과 100사이의 값을 입력하세요 :");
input = s.nextInt(); // 입력받은 값을 변수 input에 저장한다.
if(input==answer) {
System.out.println("축하합니다. 정답입니다.");
System.out.printf("시도횟수는 %d번입니다.", count);
break; //무한 반복문 빠져나오기
} else if(input>answer) {
System.out.println("더 작은 수를 입력하세요.");
} else /*(input<answer)*/ {
System.out.println("더 큰 수를 입력하세요.");
}
} while(true); // 무한반복문
<결과>
1과 100사이의 값을 입력하세요 :50
더 큰 수를 입력하세요.
1과 100사이의 값을 입력하세요 :75
더 큰 수를 입력하세요.
1과 100사이의 값을 입력하세요 :85
더 큰 수를 입력하세요.
1과 100사이의 값을 입력하세요 :92
더 큰 수를 입력하세요.
1과 100사이의 값을 입력하세요 :96
더 큰 수를 입력하세요.
1과 100사이의 값을 입력하세요 :99
더 작은 수를 입력하세요.
1과 100사이의 값을 입력하세요 :97
축하합니다. 정답입니다.
시도횟수는 7번입니다.
자바의 정석 기초편 (남궁 성)