오답노트/Java

연산자 연습문제

개발..너... 2022. 3. 7. 22:42

▶문제 1

 

다음 연산의 결과를 적으시오.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package day03;
 
public class main01 {
    public static void main(String[] args) {
        int x = 2;
        int y = 5;
        char c = 'A';//'A'의 문자코드는 65
 
        //***************문제 1***********************
        System.out.println(y >= 5 || x < 0 && x > 2);
        //A || (B && C) 
        //True || (False && False)
        //답: True
 
        //***************문제 2***********************
        System.out.println(y += 10 - x++);
        //y += 10 - x++
        //y += 10 - 2
        //y = 5 + 8
        //답: 13
 
        ////***************문제 3***********************
        System.out.println(x += 2);
        //이전 식에서 x는 1이 증가하여 3
        //x = x + 2 
        //답: 5
 
         ////***************문제 4***********************
         System.out.println!('A' <= c && c <='Z') );
        //(!(True && Flase))
        //(!(Flase))
        //답: True
 
      ////***************문제 5***********************
        System.out.println('C'-c);
        //67-65 = 2
        //답: 2
 
         ////***************문제 6***********************
         System.out.println('5'-'0');
         //53 - 48 = 5
         //답: 5
 
         ////***************문제 7***********************
         System.out.println(c+1);
         //65 + 1
         //답: 66
 
        ////***************문제 8***********************
         System.out.println(++c);
        //65 + 1
        //답: 66
        //C는 65에서 +1 된 66값으로 저장됨
        //답: B
 
        ////***************문제 9**********************
        System.out.println(c++);
        //답: A
 
        ////***************문제 10**********************
        System.out.println(1 + x << 33);
        //답: 6
    }
    
}
cs

 

[풀이]

-. 문제2

해당 식은 y의 값을 찾는 것이다. y += 10 - X++ 란 뜻으로 y = 10 - x 로 계산해야한다. 이 때 X는 ++, 후위증감으로 식이 실행된 다음 +1이 됨으로 해당 식에서는 X는 2로 들어가고 10 - 2는 8, 거기에 +=이 있음으로 y 원래 y의 값 5에 8을 더해서 최종값은 13이 된다.

 

-.문제3

컴파일러는 위에서 밑으로 내려온다. 위의 식에서 후위 증감으로 식이 모두 실행된 후에 x가 1이 증가하여 x는 3이 되었음으로 x = 3 + 2, 최종 결과값은 5가 나온다.

 

-.문제5

피 연산자가 int보다 작은 타입(byte, short, char)인 경우 int로 변환한 다음에 연산을 수행한다. c의 값이 'A'라는 문자값으로 'C'-c ‘C'-'A'가 되고 'C' 'A' int로 암묵적 형변환되어 아스틱코드로 '67 - 65'가 되고 최종결과는 2가 된다.

 

-. 문제6

문제 5와 같은 이유로 53 - 48 = 5의 값이 출력됨

 

아스키코드

 

여기서 기본적으로 4가지 아스키 코드를 외우고있으면 활용하실때 편하다

Enter = 13,    숫자 0 = 48,     대문자 A = 65 ,     소문자 a = 97

​이 4가지는 꼭 알고있기

 

-.문제7

c+1은 C가 'A'니까 'A'+1이된다. 이항연산자의 성질(int보다 작은 타입은 int로 변환 후 연산)으로 'A'는 65, 결과값은 66이 나온다.

 

-.문제8

단항연산자인'++'은 이항연산자와 달리 int보다 작은 타입도 형변환을 하지 않는다.(이항연산자는 연산을 위해 피연산자 스택(operand stack)’을 사용하는데 이 과정에서 형변환이 발생하는 것이다. 반면에 단항연산자인 증가연산자'++' 피연산자 스택을 사용하지 않으므로 형변환도 발생하지 않는다.) 그래서 println은 변수 c를 숫자(int)로 출력하는 것이 아니라 문자로 출력한다. (println은 이 값을 타입에 따라 어떻게 출력할지를 결정한다. 만일 문자타입이면 저장된 값(문자코드)에 해당하는 문자를 출력하고 숫자라면 숫자로 출력한다.) 변수 c에 저장된 문자가 'A'(문제7에서 'A' 문자코드 값이 1증가되어 66('B'의 문자코드)으로 변경되었다). 그러므로 결과는 66

 

-. 문제9

단항연산자'++'이 후위형인 경우에는 변수가 출력된 후에 저장된 값이 증가하므로 문자 'B'(문제8에서 B로 증가)가 출력된 후에 변수 c의 값이 1증가해서 문자 'C'가 저장된다.

 

▶문제2

 

아래의 코드는 사과를 담는데 필요한 바구니(버켓)의 수를 구하는 코드이다.
13개의 바구니가 필요할 것이다.
알맞은 코드를 넣으시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class main01 {
 
         public static void main(String[] args) {
               int numOfApples = 123// 사과의 개수
                int sizeOfBucket = 10// 바구니의 크기(바구니에 담을 수 있는 사과의 개수)
                int numOfBucket = 0, numOfBucket2=0, numOfBucket3=0, numOfBucket4 = 0;
               
               //입력하세요
 
                             
                System.out.println("필요한 바구니의 수 :"+numOfBucket);
            
        }
              
           
}
cs

 

[답]

//예시1

numOfBucket =  numOfApples % sizeOfBucket > 0 ? numOfApples / sizeOfBucket + 1 : numOfApples / sizeOfBucket;
 
//**예시2
 
numOfBucket2 = numOfApples / sizeOfBucket + (numOfApples%sizeOfBucket > 0 ? 1 : 0)
 
//예시3

numOfBucket3 =  numOfApples % sizeOfBucket==0? numOfApples/sizeOfBucket : numOfApples/sizeOfBucket +1;

 

[풀이]

사과의 갯수에 바구니 수를 나누면 몇개의 바구니가 필요한지 알 수 있다. 단, 나누면 나머지가 떨어지는 것이 문제임. 그럼 나누기를 하고 몫이 딱 떨어지면 그대로 출력하고, 아니면 나머지를 위한 바구니 1개를 더 추가하면 된다. %를 이용하여 나머지연산자가 있는지 확인을 하고(/사용하면 오류) O면 A/X면 B를 출력하라는 것으로 삼항연산자로 간단하게 출력 한다.

 

 

▶문제3

 

아래는 변수 num의 값에 따라 ‘양수’, ‘음수’, ‘0’을 출력하는 코드이다.
삼항 연산자를 이용해서 (1)에 알맞은 코드를 넣으시오.
[Hint] 삼항 연산자를 두 번 사용하라.

1
2
3
4
5
6
7
8
public class main01 {
        public static void main(String[] args) {
            int num = -76;
            System.out.println(---입력---);
    }
    
}
cs

 

[풀이]

Systme.out.println( num > 0? "양수" : (num < 0 ? "음수" : "0" ));
 
삼항연산자안에서 삼항연산자를 한번 더 사용할 수 있다. O일 때 A 아니면 B or C 가 가능하다. "아니면"(:) 뒤에 삼항연산자를 한번 더 사용해주면서 삼항연산자 속에 삼항연산자 사용가능. 가독성을 높히기위해 2번째 삼항연산자에 ()해주는 것이 좋다.

 

▶문제4

 

아래는 변수 num의 값 중에서 백의 자리 이하를 버리는 코드이다.
만일 변수 num의 값이 ‘456’이라면 ‘400’이 되고, ‘111’이라면 ‘100’이 된다.

 

1
2
3
4
5
public class main01 {
        public static void main(String[] args) {
            int num = 456;
            System.out.println( --입력-- );ipter
cs

 

[답]

System.out.println( (num/100) * 100));
 
[풀이]

몫을 버리는 / 성질을 이용

 

▶문제5

 

아래는 변수 num의 값 중에서 일의 자리를 1로 바꾸는 코드이다.
만일 변수 num의값이 333이라면 331이 되고, 777이라면 771이 된다.
(1)에 알맞은 코드를 넣으시오.

 

1
2
3
4
5
6

public
 class main01 {
        public static void main(String[] args) {
            int num = 333;
            System.out.println (---입력---);
    
            )
cs

 

[답]

System.out.println (((num/10) * 10) + 1) ;

[풀이]

문제에서 이슈가 발생하는 곳은 마지막자리이다. 그럼 마지막자리만 분리할 방법이 있는지 생각하기. 마지막 자리 분리를 위해 10을 나누고 101을 더해야하니 *10을 하고 1을 더하기

 

 

▶문제6

 

아래는 변수 num의 값보다 크면서도 가장 가까운 10의 배수에서 변수 num의 값을 뺀 나머지를 구하는 코드이다.
예를 들어, 24의 크면서도 가장 가까운 10의 배수는 30이다. 19의 경우 20이고, 81의 경우 90이 된다.30에서 24를 뺀 나머지는 6이기 때문에 변수 num의 값이 24라면 6을 결과로 얻어야 한다.
[Hint] 나머지 연산자를 사용하라.

 

 

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
            int num = 24;
 
       
            System.out.println (---입력---);
 
            
 
        }
cs

 

 

[풀이]

-. 예시1

System.out.println((num/10+1)*10 - num);

해당 변수와 가장 가까운 10의자리에 초점을 두어 해결

해당변수의 10의자리를 먼저 구하고 +1을 하여 간단하게 해결

 

-. 예시2

System.out.println(10-num%10);

가장 가까운 정수에서 해당 변수를 뺄 때를 초점을 두어 해결

변수가 45이든 29이든 가장 가까운 정수에서 -를 하면 일의 자리수끼리 계산되어진다. %를 통해 1의자리를 구하고 그 나머지를 10에서 차감하는 방법으로 간단한 해결

 

▶문제7

 

아래는 화씨(Fahrenheit)를 섭씨(Celcius)로 변환하는 코드이다.
변환공식이 'C =5/9 ×(F - 32)'라고 할 때, (1)에 알맞은 코드를 넣으시오.
단, 변환 결과값은 소수점 셋째자리에서 반올림해야한다.
(Math.round()를 사용하지 않고 처리할 것)

1
2
3
4
5
6
7
8
9
class Exercise3_7 {
    public static void main(String[] args) {
        int fahrenheit = 100;
        float celcius = ( /* (1) */ );
        System.out.println("Fahrenheit:"+fahrenheit);
        System.out.println("Celcius:"+celcius);
    }
}
 
cs

 

[정답]

float celcius = (int)((5/9f * (fahrenheit - 32)) * 100 + 0.5) / 100f;

 

[풀이]

1. C =5/9 ×(F - 32) 일 때, 5/9는 0임으로 정확한 값을 얻고싶다면 5/9f를 사용하여 실수로 계산해야한다.

2. Math.round()를 사용하지 않고 소수점 셋째자리에서 반올림을 하려면 다음과 같은 과정을 거쳐야 한다.

  1. 값에 100을 곱한다.
  2. 0.5를 더한다.
  3. int타입으로 변환한다.
  4. 100f로 나눈다.(100으로 나누면 소수점 아래의 값을 잃음)

 

​▶문제8

 

아래 코드의 문제점을 수정해서 실행결과와 같은 결과를 얻도록 하시오.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Exercise3_8 {
    public static void main(String[] args) {
        byte a = 10;
        byte b = 20;
        byte c = a + b;
        char ch = 'A';
        ch = ch + 2;
        float f = 3 / 2;
        long l = 3000 * 3000 * 3000;
        float f2 = 0.1f;
        double d = 0.1;
        boolean result = d == f2;
 
       1)System.out.println("c=" + c);
       2)System.out.println("ch=" + ch);
       3)System.out.println("f=" + f);
       4)System.out.println("l=" + l);
       5)System.out.println("result=" + result);
    }
}
 
 
 
cs

 

[풀이]

이항연산은 두 피연산자의 타입을 일치시킨 후 연산을 수행한다.

그리고 int 보다 작은 타입(boolean, byte, char 및 short 타입)은 계산 전 int로 자동변환됨으로 피연산자 앞에 꼭 강제형변환 해주어야한다.

 

-. 문제1

변수 a와 b는 모두 byte타입으로 이항연산인 덧셈 연산을 하기 전에 int타입으로 자동 형변환된다. int와 int의 덧셈이니 연산결과는 int이다. int타입의 값(4byte)를 byte타입의 변수(1byte)에 담아야함으로 형변환을 해주어야한다.

byte c = a + b; -> byte c = (byte)(a+b);

 

-문제2

char 역시 int보다 작은 타입으로 강제형변환을 시켜주어야하며 char(A)에 +2를 하여 문자인 C를 출력한다

*문자출력: char  ch = 'A';

              ch = (char)(ch+2);  //C출력

*숫자출력: int i = 'A';

              i = i + 2; //67출력

=>출력하고싶은 결과값(문자,정수등)을 생각하고 변수 초기화 때 필요에 맞는 키워드 설정

 

-.문제3

int int의 연산결과는 int이기 때문에 3/2의 결과는 1이 된다연산결과를 실수로 얻고 싶으면적어도 두 피연산자 중 한 쪽이 실수타입(float double중의 하나)이어야 한다.

float f = 3/2f;

 

-.문제4

int*int*int의 결과는 int이므로 int타입의 최대값인 약 2*10 9제곱을 넘는 결과는 오버플로우가 발생하여 예상한 것과는 다른 값을 얻는다그래서 피연산자 중 적어도 한 값은 long타입이어야 최종결과를 long타입의 값으로 얻기 때문에 long타입의 접미사 'L'을 붙여서 long타입의 리터럴로 만들어줘야 한다.

long l = 3000l * 3000 * 3000;

 

-.문제5

비교연산자도 이항연산자이므로 연산 시에 두 피연산자의 타입을 맞추기 위해 형변환이 발생한다그래서 double float의 연산은 double double의 연산으로 자동형변환 되는데실수는 정수와 달리 근사값으로 표현을 하기 때문에 float double로 형변환 했을 때 오차가 발생할 수 있다그래서 float값을 double로 형변환 하기 보다는 double값을 유효자리수가 적은 float로 형변환해서 비교하는 것이 정확한 결과를 얻는다.
boolean result = (float)d == f2;

 

 

▶문제9

 

다음은 문자형 변수 ch가 영문자(대문자 또는 소문자)이거나
숫자일 때만 변수 b의 값이 true가 되도록 하는 코드이다.
알맞은 코드를 넣으시오.

1
2
3
4
5
6
7
8
9
class Exercise3_9 {
    public static void main(String[] args) {
        char ch = 'z';
        boolean b = (---입력---);
        System.out.println(b);
    }
}
 
cs

 

 

[풀이]

 

-.예제1

boolean b = ch >= 0? true : false;

ch가 영문자이거나 숫자일경우, 아스키코드를 통해서 true값이 나온다. 실수일 경우에만 false로 나오게하라는 의미인데 음수일 경우 실수가 출력됨

 

-.예제2

( 'A' <= ch && ch <= 'Z' ) || ( 'a' <= ch && ch <= 'z' ) || ('0' <= ch && ch <= '9');

 

 

▶문제10

다음은 대문자를 소문자로 변경하는 코드인데,
문자 ch에 저장된 문자가 대문자인 경우에만 소문자로 변경한다.
문자코드는 소문자가 대문자보다 32만큼 더 크다.
예를 들어 'A‘의 코드는 65이고 ’a'의 코드는 97이다. (1)~(2)에 알맞은 코드를 넣으시오.

 

1
2
3
4
5
6
7
8
9
10
11
class Exercise3_10 {
    public static void main(String[] args) {
        char ch = 'A';
        char lowerCase = ( /* (1) */ ) ? ( /* (2) */ ) : ch;
        System.out.println("ch:"+ch);
        System.out.println("ch to lowerCase:"+lowerCase);
    }
}
 
 
 
cs

 

[풀이]

('A' <= ch && ch <= 'Z'), (char)(ch+32)
대문자일 경우에만 소문자로 변경하라는 의미로 문자열 역시 숫자처럼 범위 지정이 가능함을 생각한다. 또한, 32를 더하지만 문자 char로 변환하여 문자열로 나타나게 하는 것을 잊으면 안됨

 

 

 

 

-. 출처:

 

https://yahma.tistory.com/143

 

[자바의 정석 연습문제] 3. 연산자

[3-1] 다음 연산의 결과를 적으시오. [연습문제]/ch3/Exercise3_1.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Exercise3_1 {     public static void main(String[] args) {    ..

yahma.tistory.com

https://blog.naver.com/study_d_b/222088321987