문제풀이/자바

TIL - 자바의정석 연습문제[ch4 - 1 ~ 10 /11 - 14 / 15 ] 완

Mo_bi!e 2022. 12. 9. 04:22

[4 - 2]

1. 문제설명

2 - 1 . 나의 해답

package pr4;

public class pr4_2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		{
		int i = 0, num = 0, tmp = 0;
		
		while(i <= 20) {
			if(!(num % 2 ==0 && num % 3 ==0)) {
				
				tmp = num;
				tmp += tmp;
				
			}
			i++; num++;
		}
		System.out.println(num);
		}
	}

}

콘솔 : 21 (오답)

이유

1 출력을 tmp 값이 아니라 num값으로 함

2 if조건식을 잘못 정의 함

2 - 2. 나의 고친 해답

package pr4;

public class pr4_2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		{
		int i = 0, num = 0, tmp = 0;
		
		while(i <= 20) {
			
			if((num % 2 !=0 && num % 3 !=0)) {
				tmp += num;
				System.out.println(num);
			}		
			i++; num++;
		}
		System.out.println(tmp);
		}		
	}

}

 

3. 정답 코드

4. 보충 및 회고

(1) 보충

조건식에 대한 참거짓 명확화와 조건식의 익숙 혹은 암기

 

(2) 회고

for문으로도 활용해보면 좋았을 것 같다.

조건식을 설정할 때 반복적으로 실수하게된다. 유의하자

그리고 필요없는 변수를 한번 더 이용하려고하는데 굳이 그럴필요가 없다.

 

 


[4 - 3]

1. 문제설명

2. 나의 해답

package pr4;

public class pr4_3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int num = 1 ; int tmp = 0 ; int total = 0;
		
		while(num < 11) {
			
			//key : tmp 의 값의 크기가 점점 커지는 방식으로 접근
			// 나는 tmp 나 total이나 값이 동일하지 않나 싶었음 num대입으로 
			
			tmp += num; 
			total += tmp;
			
//			tmp = 0 ; 
			num++; 
			
			System.out.printf("쌓인 값은 %d \n", tmp);
		}
		
		
		System.out.println(total);
	}

}

콘솔 : 220 (정답)

3. 정답 코드

4. 보충 및 회고

(1) 보충

for문을 좀더 자유자제로 쓸수 있게끔해야겠다.

 

(2) 회고

while문을 복잡하게 하기보다 한곳에 모은 for문을 하는방법이 있다.

 


[4 - 4] 

1. 문제설명

2. 나의 해답

package pr4;

public class pr4_4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int total = 0 ,num = 1;
		
		while(total <= 100) { //100 이하일때 까지 반복
			
			if(num % 2 == 1) { //홀수일 때 
				
				total += num;
				
			}
			
			else if (num % 2 == 0) { //짝수일 때 
				
				total -= num;
			}
			System.out.printf("현재 숫자는 %d, 총 값은 %d \n", num, total);
			num++;
			
		}
		
		System.out.printf("%d까지 더해야 총합이 %d이다 ", num, total);
		
		
	}

}

콘솔 : 200(오답)

 

2 - 1 고친 답

{
    int total = 0 ,num = 1;

    while(true) { //무한 루프

        if(num % 2 == 1) //홀수일 때 
            total += num;			
        else if (num % 2 == 0)  //짝수일 때 
            total -= num;

        if(total >= 100)
            break;		

        num++;
    }

    System.out.printf("%d까지 더해야 총합이 %d이다 ", num, total);
}

while 과 if 두가지 방식으로 접근이 가능한데, 서로 작동하는 것이 참거짓에 따라 작동이 다르다. 유의하기

따라서 <= 와 <도 구분해야한다.

콘솔 : 199(정답)

3. 정답 코드

4. 보충 및 회고

(1) 보충

 

 

(2) 회고

1) 문제를 '잘'읽고 조건문을 작성해주어야함

2) 홀수짝수로 조건문으로 +,-연산하기보다, -를 곱하기로 바꾸어주면 수월할 수 있다.

s = -s;

 


[4 - 5]

1. 문제설명

2. 나의 해답

package pr4;

public class pr4_5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		for(int i = 0; i<= 10; i++) {
			for(int j =0 ; j<=i ; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		
		{
		int i = 0; 
		while(i <= 10) {
			
			int j = 0; //j값의 위치를 잘못잡아서 *이 계속 하나만 출력 
			while(j <= i) {
				System.out.print("*");				
				j++;
			}
			System.out.println();			
			i++;
		}	
		}	
	}

}

콘솔 : 정답

3. 정답 코드

4. 보충 및 회고

(1) 보충

 

(2) 회고

무난했다.


[4 - 6]

1. 문제설명

2. 나의 해답

package pr4;

public class pr4_6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int x = 1;
		
		while(x < 7) {  
				
				int y = 1;
			while(y < 7) {
				if(x+y == 6) {
					System.out.printf("%d + %d = %d \n", x, y , x+y);
				}
				
				y++;
			}
			x++;
		}
		
	}

}

콘솔 (정답)

1 + 5 = 6

2 + 4 = 6

3 + 3 = 6

4 + 2 = 6

5 + 1 = 6

3. 정답 코드

4. 보충 및 회고

(1) 보충

 

(2) 회고

나는 while문으로 해서 무난하게 해결했다.


[4 - 7]

1. 문제설명

2. 나의 해답

package pr4;

public class pr4_7 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		double andom__ = Math.random();
		System.out.println("andom__:" + andom__);
		
		int random = ((int)Math.random() * 10 + 1) ;
		System.out.println("random:" + random);
		int Value = random % 7; 
		
		
		System.out.println("value:" + Value);
	}

}

콘솔 : 오답

2-2. 고친코드

package pr4;

public class pr4_x {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		double random__ = Math.random(); //난수출력하기
		System.out.println("random__:" + random__);
		
		double random1 = (random__ * 10) ; //소수점 첫재짜리를 올려주기
		System.out.println(random1);
		
		int random = ((int)random1) ; //정수형으로 형변환해주기
		
		
		System.out.println("random:" + random);
		int Value = random % 6; 
		
		
		System.out.println("value:" + (Value +1));
	}

}

종래와 달리 일단 정수화 시켜 주고 난뒤, 0~9까지 수를 나머지연산자를 이용해서 출력의 값을 조절이가능하다

이경우 나머지 연산으로 0이 될수있는데 이러한 문제를 대비하기 위해서 +1을 해준다.

 

3. 정답 코드

4. 보충 및 회고

(1) 보충

실제 문제에서는 6을 곱해주어서 값을 한정시킬 수있다.

왜그럴까? 구구단의 6단을 생각해보자

6단의 앞자리 수는 6 x 10 은 60인데  앞자리가 최대 6까지만 갈수있다.

6 X 9 는 54 로서 5만 갈수있다.

 

이러한 연유로 소수점에 X 6을 하면은 해당숫자만 구할 수 있다.

 

(2) 회고

 

 


[4 - 8]

1. 문제설명

2. 나의 해답

package pr4;

public class pr4_8 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		// 문제 발생점
		// 1. while 조건문 역으로 사용
		// 2. x++위치 반복문 블럭 밖에 둠
		// 3. int y 위치 블럭 밖에 둠  
		
		int x = 0 ; 
	
		
		while((0 <= x && x <= 10)) {
//		System.out.println("x"+x);
			int y = 0 ;
			while((0 <= y && y <= 10)) {
//			System.out.println("y"+y);
				
				if((2*x) + (4*y) == 10) {
				System.out.printf("x = %d, y = %d \n", x, y);
				
			}
			y++;
			}x++; //x++ 위치를 잘못 잡음 
		}
	}

}

콘솔 : 정답

3. 정답 코드

4. 보충 및 회고

(1) 보충

 

(2) 회고

무난했다. while문을 이용함

 


[4 - 9]

1. 문제설명

2. 나의 해답

package pr4;

public class pr4_9 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String str = "12345";
		int sum = 0;
		int tmp = 0;
		
		for(int i = 0 ; i < str.length() ; i++) {
			
			tmp  = str.charAt(i) - 48; //정령 이렇게 48을 그대로 빼주는 방식을 접근해야하는 것일까?
			sum = tmp;
		
		System.out.println("sum = " + sum);
	}

}}

콘솔 : 10 (오답)

2-2. 고친 나의해답

package pr4;

public class pr4_x {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String str = "12345";
		int sum = 0;
		int tmp = 0;
		
		for(int i = 0 ; i < str.length(); i++) {
			
			tmp  = str.charAt(i) - 48; //정령 이렇게 48을 그대로 빼주는 방식을 접근해야하는 것일까?
			System.out.print("\n최초 sum은 "+sum);
			
			
			System.out.println("\ntmp는" + tmp);
			sum += tmp;
			System.out.print("sum은 "+sum);
	}
		System.out.println("\nsum = " + sum);

}}

매번 반복적으로 하는 실수가 반복문 내에서 값이 누적증가해야하는데, 누적된 값에다가 불러온 값을 다시 대입해 버리는 불쌍사가 발생한다. 반복적인 실수이다. 유념하자

3. 정답 코드

4. 보충 및 회고

(1) 보충

charAT()은 인덱스의 문자를 반환하는 것이다.

잊지말자

 

(2) 회고

누적된 값에다가 다시 대입하지말자

 


<접근방법>
4-10 num의 값이 12345라면, ‘1+2+3+4+5’의 결과인 15를 출력하라 : 10 제곱단위로 나누어서 몫으로 더해주기

X : 나머지연산자로 간단하게 가능

[4-11] 피보나치(Fibonnaci) 수열(數列)
: num3 = num1 + num2;

num1 = num2;

num2 = num3;
中: 대입순서 착각

[4-12] 구구단 : 생략

[4-13] 다음은 주어진 문자열(value)이 숫자인지를 판별하는 프로그램이다. (1)에 알맞
은 코드를 넣어서 프로그램을 완성하시오.
: charAt()을 이용하고, '0'을 빼주어서 숫자인지 판별함



[4-14] 1과 100사이의 값을 반복적으로 입력
해서 컴퓨터가 생각한 값을 맞추면 게임이 끝난다. 사용자가 값을 입력하면, 컴퓨터는 자
신이 생각한 값과 비교해서 결과를 알려준다. 사용자가 컴퓨터가 생각한 숫자를 맞추면
게임이 끝나고 몇 번 만에 숫자를 맞췄는지 알려준다.

package pr4;

public class pr4_x{
public static void main(String[] args){
		// 1~100사이의 임의의 값을 얻어서 answer에 저장한다.
	
		int answer = (int)(Math.random()* 100); // int는 ()를 써주어야한다.
		System.out.println(answer);
		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) 알맞은 코드를 넣어 완성하시오
			if(answer > input) 
				System.out.println("더큰수입력");
			
			else if(answer == input){
				System.out.println("맞춤");
				System.out.println("횟수는 " + count);
				break;
				}
			else
				System.out.println("작은수 입력");
			
		
		}while(true); // 무한반복문
} // end of main
} // end of class HighLow

4-14 회고

+1 을 하지않아서어서 x100을 했다고 하더라도 0이 나오고 100이 안나온다

+1을 해서 1~ 100 만 나오게끔할수있다.

 

[4 - 15]

1. 문제설명

2. 나의 해답

package pr4;

public class pr4_x{
		public static void main(String[] args){
			
		int number = 12321;
		int tmp = number;
		int result =0; // 변수 number를 거꾸로 변환해서 담을 변수
		
		while(tmp !=0) { //tmp 가 0이면 break;
			System.out.println("tmp1 = "+tmp);
			
			result *= 10; //시작할때 10을 곱하게끔
			//다만 이경우 최초에는 어차피 0을 곱하기때문에 발생하지 않음
			
			
			//끝에서부터 하나씩 뽑아내기 성공
			result += (tmp % 10);
			System.out.println("나머지 result = "+result);
			
			//자리수 조정하기 위해서 10을 나누어줌
			tmp  /= 10;
			System.out.println("나누기 tmp3 = "+tmp);
		
		}
		
		System.out.println("최종 : " + result);
		
		if(number == result)
		System.out.println( number + "는 회문수 입니다.");
		else
		System.out.println( number + "는 회문수가 아닙니다.");
		
		
		} // main
}

콘솔 : 정답

3. 정답 코드

4. 보충 및 회고 

(1) 보충

1) while문 조건에 대한 이해

while문 내 조건은 false 이면 break 라는 것을 이해하자

 

 

(2) 회고 : 문제풀이과정에서 어떻게 접근하려고했는지 (접근방법) + 어려움이 있었는데 해결했다.

1) 최초의 문제점은 number 변수를 건드리면서 문제의 조건에 대한 이해가 부족했다.

왜냐하면 각변수에 대한 이해가 부족했다. tmp가 있으면 왜 선언되어있는지, number 가 대입하는지 고민을 하는것이 바람직하다.

 

number를 건드리면 안된다는 많은 단서가 있었다. tmp에 대입한점 / tmp가 0이면 반복문이 멈춘다는 점/ 최종적으로 result와 number가 같은지로 회문수 판단하는 점을 종합적으로 고려하면은 number 대신에 tmp를 이용해야한다.

 

즉 number > tmp > 역 > result

 

2) result *= 10 의 위치와 관련해서 뒤쪽에 뒀다가 loop 마지막에 곱하기 10을하면 최종자릿수가 한자리더 추가될 수있는 문제가 있다 이러한 경우 최초에 두면 0을 나누기 때문에 자릿수에 영향을 받지않는다.

 

3) result += (tmp % 10); 의 복합식관련 해서 이런식으로 식을 복합적으로 연산 후 복합연산자를 이용할 수 있다는 것을 깨닫게 되었다. 이러한 생각을 못하고 별도의 식으로 지속적으로 두면서 result변수 값이 지속적으로 영향을 받았다.