[출처] 자바의 정석 3판 연습문제 Chapter 4

 

 

연습문제 중 내가 풀지 못했거나 좀 어려웠던 문제들을 정리해봤음.

못 풀은 문제 4-3, 4-12, 4-13, 4-15

코드에 개선이 필요헀던 문제 4-9


4-3) 1+(1+2)+(1+2+3)+(1+2+3+4)+...+(1+2+3+...+10)의 결과를 계산하시오

 

정답)

public class pr4 {

	public static void main(String[] args) {
		
		// 4-3
		int sum=0;
		int totalsum=0;
		
		for (int i=1; i<=10; i++) {
			sum = sum + i;
			totalsum = totalsum + sum;
		}
		System.out.println(sum);
		System.out.println(totalsum);
	}

}

풀이)

1부터 10까지의 값을 계속 더하는 반복문을 먼저 만든다. sum=sum+i;

반복문을 실행할 때마다 얻어지는 sum값을 또 다른 int 변수 totalsum에 저장한다.

 

4-4) 1+(-2)+3+(-4)+... , 과 같은 식으로 계속 더해나갔을 때 몇까지 더해야 총합이 100 이상이 되는지 구하시오.

 
내 작성 답안)
public class pr4 {

	public static void main(String[] args) {
		
		int sum=0;
		int fi=0;
		for (int i=1; sum<100; i++) {
			if(i%2==0) {
				sum = sum - i;
			} else {
				sum = sum + i;
			}
			fi=i;
		}
		System.out.println(fi);
		System.out.println(sum);
		
	}

}

풀이) 총합(sum)100 이상이면 반복문이 멈추도록 조건을 만들고 i1씩 증가시킴

홀수부터 더하기를 시작했을 때 짝수는 빼주도록 조건 기준을 잡았음

그리고 I값을 fi에 저장해서 sum100 이상이 되었을때의 i값(마지막으로 더한 값)을 알 수 있도록 했음

 

4-5) 다음의 for문을 while문으로 변경하시오.

public class Exercise4_5 {
public static void main(String[] args) {
for(int i=0; i<=10; i++) {
for(int j=0; j<=i; j++)
System.out.print("*");
System.out.println();
}
} // end of main
} // end of class

 

내 작성 답안)

public class pr4 {

	public static void main(String[] args) {

		int x = 0;
		int y = 0;
		while(x<=10) {
			while(y<=x) {
				System.out.print("*");
				y++;
			}
			System.out.println();
			y=0;
			x++;
		}
		
	}

}

풀이) y값을 계속 0으로 초기화시켜서 x값이 증가함에 따라 출력하는 별의 개수를 늘게 한다.

 

 

4-6) 두 개의 주사위를 던졌을 때, 눈의 합이 6이 되는 모든 경우의 수를 출력하는 프로그램을 작성하시오.

 

 

내 작성 답안)
public class pr4 {

	public static void main(String[] args) {

		int[] dice = {1,2,3,4,5,6};
		
		
		for(int i=1; i<=6; i++) {
			for (int j=1; j<=6; j++) {
				if(i+j==6) {
					System.out.println(i+", "+j);
				}
			}
		}
		
	}

}

 

4-7) Math.random()을 이용해서 1부터 6사이의 임의의 정수를 변수 value에 저장하는 코드를 완성하라. (1)에 알맞은 코드를 넣으시오.

class Exercise4_7 {
public static void main(String[] args) {
int value = ( /* (1) */ );
System.out.println("value:"+value);
}
}

 

내 작성 답안)

public class pr4 {

	public static void main(String[] args) {

			int value = (int)(Math.random()*6)+1;
			System.out.println("value:"+value);
	
	}

}

 

4-8) 방정식 2x+4y=10의 모든 해를 구하시오. , xy는 정수이고 각각의 범위는 0<=x<=10, 0<=y<=10 이다.

 

내 작성 답안)

public class pr4 {

	public static void main(String[] args) {
		System.out.println("x, y");
		for (int i=0; i<=10; i++) {
			for (int j=0; j<=10; j++) {
				if (2*i+4*j==10) {
					System.out.println(i+", "+j);
				}
			}
		}
	}

}

 

4-9) 숫자로 이루어진 문자열 str이 있을 때, 각 자리의 합을 더한 결과를 출력하는 코드를 완성하라. 만일 문자열이 “12345”라면, ‘1+2+3+4+5’의 결과인 15가 출력되어야 한다.

(1)에 알맞은 코드를 넣으시오.

[Hint] String 클래스의 charAt(int i)를 사용

 
class Exercise4_9 {
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);
}
}

 

내 작성 답안)

public class pr4 {

	public static void main(String[] args) {
		String str = "12345";
		int sum = 0;
		
		for(int i=0; i < str.length(); i++) {
			sum = sum + str.charAt(i) - '0';
		}
		System.out.println("sum="+sum);
		
	}

}

 

 

4-10) int타입의 변수 num이 있을 때, 각 자리의 합을 더한 결과를 출력하는 코드를 완성하라. 만일 변수 num의 값이 12345라면, ‘1+2+3+4+5’의 결과인 15를 출력하라.

 

내 작성 답안)

public class pr4 {

	public static void main(String[] args) {
		int num=12345;
		int sum=0;
		
		while(num!=0) {
			sum = sum + num%10;
			num = num/10;
		}
		System.out.println(sum);
	}

}
 

 

4-11) 피보나치 수열 은 앞의 두 수를 더해서 다음 수를 만들어 나가는 수열이다 예를 들어 앞의 두 수가 11이라면 그 다음 수는 2가 되고 그 다음 수는 12를 더해서 3이 되어서 1,1,2,3,5,8,13,21,...과 같은 식으로 진행된다. 11부터 시작하는 피보나치수열의 10번째 수는 무엇인지 계산하는 프로그램을 완성하시오.

 

내 작성 답안)

public class pr4 {

	public static void main(String[] args) {
		// Fibonnaci 1, 1 . 수열의 시작의 첫 두 숫자를 로 한다
		int num1 = 1;
		int num2 = 1;
		int num3 = 0; // 세번째 값
		System.out.print(num1+","+num2);
		for (int i = 0 ; i < 8 ; i++ ) {
			num3 = num1 + num2;
			System.out.print(","+num3);
			num1 = num2;
			num2 = num3;
		}
	}

}

 

4-12) 구구단의 일부분을 다음과 같이 출력하시오.

 
 
 
 
 

4-13) 다음은 주어진 문자열(value)이 숫자인지를 판별하는 프로그램이다. 알맞은 코드를 넣어서 프로그램을 완성하시오.

 

정답)

public class pr4 {

	public static void main(String[] args) {
		String value = "12o34";
		char ch = ' ';
		boolean isNumber = true;
		
		// charAt(int i) 반복문과 를 이용해서 문자열의 문자를
		// 하나씩 읽어서 검사한다.
		for(int i=0; i < value.length() ;i++) {
			ch = value.charAt(i);
		
			if(!('0'<=ch && ch<='9')) {
				isNumber = false;
				break;
			}
		}
		
		if (isNumber) {
		System.out.println(value+"는 숫자입니다."); 
		} else {
		System.out.println(value+"는 숫자가 아닙니다."); 
		}

		
	}

}
풀이) 문자열의 각 문자가 숫자라면 '0'<=ch && ch<='9' 범위 안에 들어가야 한다.
따라서 숫자가 아닌 문자는 해당 범위 안에 들어가지 못한다. 이것을 이용해서 조건문을 작성한다.
 
 

4-14) 다음은 숫자맞추기 게임을 작성한 것이다. 1100사이의 값을 반복적으로 입력해서 컴퓨터가 생각한 값을 맞추면 게임이 끝난다. 사용자가 값을 입력하면 컴퓨터는 자신이 생각한 값과 비교해서 결과를 알려준다. 사용자가 컴퓨터가 생각한 숫자를 맞추면 게임이 끝나고 몇 번 만에 숫자를 맞췄는지 알려준다. (1)에 알맞은 코드를 넣어 프로그램을 완성하시오.

 

내 작성 답안)

public class pr4 {

	public static void main(String[] args) {
		// 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("더 큰 수를 입력하세요.");
		} else if(input>answer) {
			System.out.println("더 작은 수를 입력하세요.");
		} else {
			System.out.println("맞췄습니다.");
			System.out.println("시도횟수는 "+ count+"번 입니다.");
			break;
		}
		
		} while(true); // 무한반복문
			
			
	}

}
 

 

4-15) 다음은 회문수를 구하는 프로그램이다. 회문수(palindrome)란 숫자를 거꾸로 읽어도 앞으로 읽는 것과 같은 수를 말한다. 예를 들면 ‘12321’이나 ‘13531’같은 수를 말한다. (1)에 알맞은 코드를 넣어서 프로그램을 완성하시오.

 
public class pr4 {

	public static void main(String[] args) {
		
		int number = 12321;
		int tmp = number;
		int result =0; // number 변수 를 거꾸로 변환해서 담을 변수
		while(tmp !=0) {
			result = result*10 + tmp%10;
			tmp=tmp/10;
		}
		if(number == result)
		System.out.println( number + "는 회문수 입니다 ."); 
		else
		System.out.println( number + "는 회문수가 아닙니다."); 
			
			
	}

}

 

풀이) 위에서 풀었던 숫자의 각 자리수 더하기와 유사한 문제인데,

이 문제는 10으로 나눈 나머지를 result에 담고, result를 10씩 계속 곱해줘서 기존의 숫자를 역순으로 바꿀 수 있다.

 


[출처] 자바의 정석 3판 연습문제 Chapter 4

+ Recent posts