[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'을 빼주어서 숫자인지 판별함
O
[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변수 값이 지속적으로 영향을 받았다.
'문제풀이 > 자바' 카테고리의 다른 글
TIL - 자바의정석 연습문제[ch6 - 20] (0) | 2022.12.30 |
---|---|
TIL - 자바의정석 연습문제[ch6 - 5] (0) | 2022.12.27 |
TIL - 자바의정석 연습문제[ch6 - 3,4 ] (0) | 2022.12.27 |
TIL - 자바의정석 연습문제[ch6 - 1,2 ] (0) | 2022.12.27 |
TIL - 자바의정석 연습문제[ch5 - 4 ] (0) | 2022.12.20 |