본문 바로가기

BackEnd/Java

[java] 자바의 정석 ch3 연습문제 풀이

728x90
반응형

3-1) 다음 연산의 결과를 적으시오.

 

package JAVA1218;

public class ex03_01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int x = 2;
		int y = 5;
		char c = 'A';  // 아스키 코드 : 65
		
		System.out.println(1+x << 33);
		System.out.println(y >= 5 || x < 0 && x > 2);
		System.out.println(y += 10 - x++);
		System.out.println(x += 2);
		System.out.println(!('A' <= c && c <= 'Z'));
		System.out.println('C'-c);
		System.out.println('5'-'0');
		System.out.println(c+1);
		System.out.println(++c);
		System.out.println(c++);
		System.out.println(c);
		
	}
}
1) 6
→ 덧셈이 쉬프드연산자보다 우선순위가 높아 3<<33이 되고, int는 32bit이므로 1(33-32)번만 쉬프트 합니다.
→ 3은 2진수로 11(2)이고 1번 왼쪽으로 쉬프트되면 110(2)이므로 6이 됩니다.
2) true
3) 13
→ y = y + 10 - (x +1) 이지만 ++가 x뒤에 있으므로 출력이 된 후 y값에 저장합니다.
    따라서 이 계산식에서는 포함되지 않습니다.
4) 5
→ x는 이전 계산식에서 1증가했기 때문에 3이고 이젠 5가 저장됩니다. 
5) false
→ 값은 true지만 !로 인해 반대 결과가 출력됩니다.
6) 2
→ 67 - 65 = 2 (아스키 코드)
7) 5
→ 53 - 48 = 5 (아스키 코드지만 5개 차이나므로 5입니다.)
8) 66
→ 숫자 덧셈이 있어 숫자로 출력됩니다.
9) B
→ 1증가한 후 출력합니다. c에는 B가 저장됩니다.
10) B
→ 출력 후 1증가합니다. c에는 C가 저장됩니다.
11) C

 

 

3-2) 아래의 코드는 사과를 담는데 필요한 바구니(버켓)의 수를 구하는 코드이다. 만일 사과의 수가 123개이고 하나의 바구니에는 10개의 사과를 담을 수 있다면, 13개의 바구니가 필요할 것이다. (1)에 알맞은 코드를 넣으시오.

 

package JAVA1218;

public class ex03_02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int numOfApples = 123;          // 사과의 개수
		int sizeOfBucket = 10;          // 바구니의 크기(바구니에 담을 수 있는 사과 개수)
		int numOfBucket = ( /* (1) */); // 모든 사과를 담는데 필요한 바구니의 수
		
		System.out.println("필요한 바구니의 수 : " + numOfBucket);
	}
}

// 출력
// 필요한 바구니의 수 : 13
(1) (int)Math.ceil((float)numOfApples / sizeOfBucket)

 

 

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

 

package JAVA1218;

public class ex03_03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int num = 10;
		
		System.out.println( /* (1) */ );
	}
}

// 출력
// 양수
(1) num > 0 ? "양수" : num < 0 ? "음수" : 0

 

 

3-4) 아래는 변수 num의 값 중에서 백의 자리 이하를 버리는 코드이다. 만일 변수 num의 값이 '456'이라면 '400'이 되고, '111'이라면 '100'이 된다. (1)에 알맞은 코드를 넣으시오.

 

package JAVA1218;

public class ex03_04 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int num = 456;
		
		System.out.println( /* (1) */ );
	}
}

// 출력
// 400
(1) num/100 > 0 ? num/100 * 100 : 0

 

 

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

 

package JAVA1218;

public class ex03_05 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int num = 333;
		
		System.out.println( /* (1) */ );
	}
}

// 출력
// 331
(1) num / 10 > 0 ? num/10*10+1 : 1

 

 

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

 

package JAVA1218;

public class ex03_06 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int num = 24;
		
		System.out.println( /* (1) */ );
	}
}

// 출력
// 6
(1) num >= 0 ? (num/10+1)*10-num : false

 

▷ 간단하게 표현하면 10 - num % 10으로 표현할 수 있습니다!

 

 

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

 

package JAVA1218;

public class ex03_07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int fahrenheit = 100;
		float celcius = /* (1) */;
		
		System.out.println("Fahrenheit : " + fahrenheit);
		System.out.println("Celcius : " + celcius);
	}
}

// 출력
// Fahrenheit:100 
// Celcius:37.78
(1) (float)Math.round((float)5/9*(fahrenheit - 32)*100)/100

 

▷ 다른 코드 예시 : (int)((5/9f*(fahrenheit-32))*100 + 0.5) / 100f

1. 값에 100을 곱합니다.
→ 37.77778 * 100
2. 0.5를 더합니다.
3. int타입으로 변환해 소숫점을 버립니다.
4. 이후 100f로 나눕니다.(100, 100.0은 각각 int, double이므로 100f를 사용해 결과를 도출합니다.)

 

 

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

 

package JAVA1218;

public class ex03_08 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		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;
		
		System.out.println("c="+c);
		System.out.println("ch="+ch);
		System.out.println("f="+f);
		System.out.println("l="+l);
		System.out.println("result="+result);
	}
}

// 출력
// c=30 
// ch=C 
// f=1.5 
// l=27000000000 
// result=true
1. byte c = a+b                          →  byte를 int로 변경 또는 (byte)(a+b)로 변경합니다.
2. ch = ch + 2                            →  (char)((int)ch + 2) 또는 (char)(ch+2)로 변경합니다.
3. float f = 3 / 2                          →  (float)3/2 또는 3/2f로 변경합니다.
4. long l = 3000 * 3000 * 3000  →  3000뒤에 L을 붙입니다.
5. boolean result = d==f2          → d 앞에 (float)을 붙입니다.

 

 

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

 

package JAVA1218;

public class ex03_09 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		char ch = 'p';
		boolean b = ( /* (1) */ );
		
		System.out.println(b);
	}
}
(1) ((ch>= 65 && ch<=90) || (ch>=97 && ch<=122) || (ch >= 48 && ch <= 57)) ? true : false

→ ((ch>= 'A' && ch<='Z') || (ch>='a' && ch<='z') || (ch >= '0' && ch <= '9')) ? true : false

 

 

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

 

package JAVA1218;

public class ex03_10 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		char ch = 'A';
		
		char lowerCase = (/* (1) */) ? (/* (2) */) : ch;
		
		System.out.println("ch:"+ch);
		System.out.println("ch to lowerCase:"+lowerCase);
	}
}
(1) ch>= 65 && ch<=90
(2) (char)((int)ch + 32)     →   (char)(ch + 32)

 

 

제가 풀이한 것은 좀 길고 간단하지 못한데 다른 분들의 풀이를 참고해보니 훨씬 쉽고 간단한 코드가 많네요!

혹시 다른 풀이 아이디어가 있으시면 댓글로 남겨주세요!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

728x90
반응형