본문 바로가기

Programming/Java의 정석

[Java의 정석 3판] chapter4 조건문 연습 문제

4-1.

int형 변수 x가 10보다 크고 20보다 작을 때 true인 조건식
10 < x && x > 20

char형 변수 ch가 공백이나 탭이 아닐 때 true인 조건식
!(' ' == ch || ch == \t)

char형 변수 ch가 'x'또는 'X'일 때 true인 조건식
'x' == ch || ch == 'X'

char형 변수 ch가 숫자 '0'~'9' 일 때 true인 조건식
'0' <= ch || ch <= '9'

char형 변수 ch가 영문자(대문자 또는 소문자)일 때 true인 조건식
('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')

int형 변수 year가 400으로 나눠떨어지거나 또는 4로 나눠떨어지고 100으로 나눠떨어지지않을 때 true인 조건식
year % 400 == 0 || year % 4 == 0 && year % 100 != 0

boolean형 변수 powerOn가 false일 때 true인 조건식
powerOn == false

문자열 참조변수 str이 "yes"일 때 true인 조건식
str.equals("yes")

 

4-2. 1부터 20까지의 정수 중에서 2 또는 3의 배수가 아닌 수의 총합 = 73

		int sum = 0;
		for(int i  = 1; i <= 20; i++) {
			if(i % 2 != 0 && i % 3 != 0) {
				sum += i;
			}System.out.println(sum);
		}

i <= 20 에서 i < 20으로 자꾸 쓴다. 20까지니까 <= 로 꼭 쓰기

 

4-3. 1+(1+2)+(1+2+3)+(1+2+3+4)+...+(1+2+3+...+10)의 결과 = 220

		int sum = 0;
		int totalSum = 0;
		
		for(int i = 1; i <= 10; i++) {
			sum += i;
			totalSum += sum;
		}
		
		System.out.println("totalSum : " + totalSum);

 

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

			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); // 결과 : num=199
			System.out.println("sum="+sum); // 결과 : sum=100
			int sum1 = 0, num1 = 0;
			while(true){
				num1++;
				if(num1 % 2 == 0) 
					sum1 -= num1;
				else
					sum1 += num1;
				if(sum1 >= 100)
					break;
			}
		System.out.println(num1);

첫 번째 답안은 정석에 나와있는 답안인데..도저히 이해가 안가서 구글링 해보니 두 번째 답안이 많이 나오는데 훨씬 이해는 되지만...왜 내가 짜진 못할까 답답..

 

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
}
		int i = 0;
		while(i <= 10) {
			int j = 0;
			while(j <= i) {
				System.out.print("*");
				j++;
			}
			System.out.println();
			i++;
		}

간단하게 중첩for문이니 while문도 중첩으로 쓴 것.. 별찍기는 왜 아직도 이해가 안될까

 

4-6. 두 개의 주사위를 던졌을 때, 눈의 합이 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));
				}
			}
		}

 

4-7. Math.random() 이용해서 1부터 6사이의 임의의 정수를 변수 value에 저장하는 코드 완성

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

유일하게 무난하게 잘 푼 문제 ^^..

 

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

실행결과
x=1, y=2
x=3, y=1
x=5, y=0
		for(int x = 0; x <= 10; x++) {
			for(int y = 0; y <= 10; y++) {
				if(2*x + 4*y == 10) {
					System.out.println("x = " + x + ", y = " + y);
				}
			}
		}

 

4-9. 숫자로 이루어진 문자열 str이 있을 때, 각 자리의 합을 더한 결과를 출력하는 코드를 완성하라.

만일 문자열이 "12345"라면, '1+2+3+4+5'의 결과인 15를 출력이 되어야 한다. 

		String str = "12345";
		int sum = 0;
		
		for(int i = 0; i < str.length(); i++) {
			sum += str.charAt(i) - '0';
		}
		System.out.println("sum = " + sum);

문자에서 '0'을 빼면 정수변환?

 

4-10. int타입의 변수 num이 있을 때, 각 자리의 합을 더한 결과를 출력하는 코드를 완성하라. 만일 변수 num의 값이 12345라면, '1+2+3+4+5'의 결과인 15를 출력하라. (1)에 알맞은 코드를 넣으시오.

[주의] 문자열로 변환하지 말고 숫자로만 처리해야 한다.

		int num = 12345;
		int sum = 0;
		while(num > 0) {
			
			sum += num % 10;
			num /= 10;
		}
		
		System.out.println("sum = " + sum);

num /= 10 입력을 못하고 무한반복문이 나왔었다...

 

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

		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. 실행결과랑 똑같이 출력 못하겠..다. 그냥 내가 푼걸로 대체. 단은 2~9까지 출력, 수는 3까지만 나오게하기

		int dan = 0;
		int su = 0;
		
		for(dan = 2; dan <= 9; dan++) {
			for(su = 1; su <= 3; su++) {
				System.out.print(dan + " * " + su + " = " + dan * su);
				System.out.println();
			}
			System.out.println();
		}

 

4-13. 

실행결과 : 12o34는 숫자가 아닙니다.

		String value = "12o34";
		char ch = ' ';
		boolean isNumber = true;
		
		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 + "는 숫자가 아닙니다.");
		}

 

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

		int answer = (int)(Math.random() * 100 + 1);
		int input = 0;
		int count = 0;
		
		Scanner sc = new Scanner(System.in);
		
		do {
			count++;
			System.out.print("1과 100 사이의 값을 입력하세요 : ");
			input = sc.nextInt();
			
			if(answer > input) {
				System.out.println("더 큰 수를 입력하세요.");
			} else if(answer < input) {
				System.out.println("더 작은 수를 입력하세요.");
			} else if(answer == input) {
				System.out.println("맞췄습니다. \n 시도횟수는 " + count + "입니다.");
				break;
			}
			
		} while(true);

이제 숫자맞추기 게임은 마스터

 

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

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

result = result * 10 + tmp % 10;
tmp /= 10; 이 부분이 이해가 안간다.. 내일 스터디 때 확인해보기