본문 바로가기
Java

자바의 정석 연습문제 4.4 풀이

by 오늘이 내가 된다. 2021. 12. 31.

	public static void main(String[] args) {
			int num = 1;
			int sum = 0;
			
			while(true) {
				int temp = 1;
				if(num%2==0) {
					temp = -1;
				}
				sum = sum + num*temp;
				if(sum>=100) {
					break;
				}
				System.out.printf("num = %d sum = %d\n", num, sum);
				num++;
			}	
	}

위 코드의 출력

	public static void main(String[] args) {
		int num = 1;
		int sum = 0;
		int val = -1;
		do {
			if (num % 2 == 0)
				sum += num * val;
			else
				sum += num;
			num++;
			System.out.printf("num= %d sum=%d\n", num, sum);
		} while (sum < 100);
	}

위 코드의 출력

 

 

두 코드는 비슷해보이지만 출력은 엄연히 다르다. 무엇때문일까?

우선 옳은 코드는 첫번째 코드이다. sum의 값이 100보다 클 때 while문을 탈출하게 하였고,

무엇보다 num의 값이 증가하기 이전에 출력을 하였다.

num이 증가하게 되면 다음 while문을 돌 때 영향을 끼치는 것이므로 num이 증가하기 전에 출력해야 한다.

 

그러면 두번째 코드는 무엇이 잘못되었을까?

num++이후에 출력을 하였기 때문에 num의 값은 출력에 오류를 범하게 된다.

System.out.printf("num= %d sum=%d\n", num, sum);
			num++;

num++; 이전에 출력을 하게되면 올바른 값이 나온다.

첫번째 코드의 출력
2번째 코드의 출력 순서 변형

정답은 num이 199일때, sum이 100이 되는 것이다.

 

하지만 아직도 첫번째 코드와 두번째 코드의 출력문이 다르다.

 

첫번째 코드의 경우, while문의 실행 도중 sum>=100 이라는 조건에 걸려서 break를 통해 바로 반복문을 빠져나온다.

두번째 코드의 경우, sum이 100이 되었음에도 while(sum<100) 이라는 조건을 만나지 않았기 때문에 계속 실행된다.

 

결과적으로 1+(-2)+3+...+ 가 100이상이 되려면 num은 199일 경우라는 것을 알 수 있다.

하지만 위의 경우, num값을 구하기 위해 sum이 100이상일 때 바로 반복문을 탈출하는 것이 중요하다.

따라서 do while 문은 올바른 코드라고 할 수 없고 아래와 같은 코드를 작성하는 것이 바람직하다.

 

	public static void main(String[] args) {
		int num = 1;
		int sum = 0;

		while (true) {
			int temp = 1;
			if (num % 2 == 0) {
				temp = -1;
			}
			sum = sum + num * temp;
			if (sum >= 100) {
				break;
			}
			num++;
		}
		System.out.printf("num = %d sum = %d\n", num, sum);
	}

댓글