핑구

02. 이것이 자바다 4장 확인 문제 본문

프로그래밍 언어/JAVA

02. 이것이 자바다 4장 확인 문제

코딩 펭귄 2021. 7. 26. 21:50

문제마다 클래스를 만들기 번거로워 문제를 각각의 메소드로 만든 후 main 메소드에서 호출하는 방식으로 풀이하였습니다.

package chap04;

import java.util.Scanner; //Exercise07

public class Exercise {

	public static void main(String[] args) {
		Exercise03();
		Exercise04();
		Exercise05();
		Exercise06();
		Exercise07();
	}

	// for문을 이용해 1부터 100까지의 정수 중 3의 배수의 총합 구하기
	public static void Exercise03() {
		int sum = 0;
		for (int i = 1; i <= 100; i++) {
			if (i % 3 == 0) {
				sum += i;
			}
		}
		System.out.println("Exercise03: " + sum);
	}

	// 두 개의 주사위를 던졌을 때 나오는 눈을 (눈1, 눈2) 형태로 출력하고, 눈의 합이 5인 경우 실행 멈추기
	public static void Exercise04() {
		int dice1 = 0; // 눈1
		int dice2 = 0; // 눈2

		System.out.println("Exercise04: ");

		while (dice1 + dice2 != 5) {
			dice1 = (int) (Math.random() * 6 + 1);
			dice2 = (int) (Math.random() * 6 + 1);
			System.out.println("(" + dice1 + ", " + dice2 + ")");
		}
	}

	// 중첩 for문을 이용하여 방정식 4x + 5y = 60의 모든 해 구하기
	public static void Exercise05() {
		System.out.println("Exercise05: ");

		for (int i = 0; i <= 10; i++) {
			for (int j = 0; j <= 10; j++) {
				if ((4 * i) + (5 * j) == 60) {
					System.out.println("(" + i + ", " + j + ")");
				}
			}
		}
	}

	// for문을 이용해 삼각형 출력
	public static void Exercise06() {
		System.out.println("Exercise06: ");

		for (int i = 1; i <= 5; i++) {
			for (int j = 0; j < i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

	// 입력된 데이터로 예금, 출금, 조회, 종료 기능을 제공하는 코드 작성하기
	public static void Exercise07() {
		boolean run = true;

		int balance = 0;

		Scanner scanner = new Scanner(System.in);

		System.out.println("Exercise07: ");

		while (run) {
			System.out.println("---------------------------------");
			System.out.println("1. 예금 | 2. 출금 | 3. 잔고 | 4. 종료");
			System.out.println("---------------------------------");
			System.out.print("선택>");
			int choice = scanner.nextInt();
			int money;

			switch (choice) {
			case 1:
				System.out.print("\n예금액>");
				money = scanner.nextInt();
				balance += money;
				break;

			case 2:
				System.out.println("\n출금액>");
				money = scanner.nextInt();
				if (money > balance) {
					System.out.println("출금할 금액이 충분하지 않습니다.");
				} else {
					balance -= money;
				}
				break;

			case 3:
				System.out.println("\n잔고>" + balance);
				break;

			case 4:
				System.out.println("\n프로그램 종료");
				run = false;
				break;
			}
		}
	}
}

결과

 

문제마다 하나씩 살펴보겠습니다.

Exercise 03

public static void Exercise03() {
	int sum = 0;
	for (int i = 1; i <= 100; i++) {
		if (i % 3 == 0) {
			sum += i;
		}
	}
	System.out.println("Exercise03: " + sum);
}

Exercise 03은 for문을 이용하여 1부터 100까지의 숫자에서 3의 배수만 모두 더한 후 그 값을 출력하는 문제입니다.

 

먼저 3의 배수가 더해질 변수인 sum을 선언한 후, for문을 이용해 i를 1부터 100까지 반복합니다.

for문 내에 if문을 사용하여 i가 3의 배수인 경우에만 미리 선언해둔 sum에 i의 값을 더합니다.

 

%는 우변의 값으로 나눴을 때 생기는 나머지 값을 알 수 있는 연산자로, 'i % 3 == 0'은 i를 3으로 나눴을 때 0이 되는 경우를 뜻합니다. 이는 3의 배수를 의미하는 것입니다.

 

마지막으로 sum에 저장된 값을 출력하면 1부터 100까지의 숫자 중 3의 배수만 모두 더한 값이 출력됩니다.

 

Exercise 04

public static void Exercise04() {
	int dice1 = 0; // 눈1
	int dice2 = 0; // 눈2

	System.out.println("Exercise04: ");

	while (dice1 + dice2 != 5) {
		dice1 = (int) (Math.random() * 6 + 1);
		dice2 = (int) (Math.random() * 6 + 1);
		System.out.println("(" + dice1 + ", " + dice2 + ")");
	}
}

Exercise 04는 주사위 두 개를 두 주사위 눈의 합이 5가 될 때까지 굴리는 문제입니다.

 

while문은 조건식이 true인 경우에만 수행되기 때문에 두 주사위 눈의 합이 5가 아닌 경우(dice1 + dice2 != 5)로 조건식을 만들면 두 눈의 합이 5일 때 반복을 멈출 수 있습니다.

 

주사위를 굴리는 것은 Math.random() 메소드를 사용합니다. 

이 메소드는 0.0과 1.0 사이에 있는 double 타입의 난수 하나를 리턴합니다. 따라서 해당 리턴 값에 원하는 숫자를 곱한 후 (주사위는 값이 6개이므로 6을 곱합니다.) 1을 더하면 원하는 범위의 난수를 얻을 수 있습니다.

주의할 점은 double 타입으로 리턴되기 때문에 int 타입으로 사용하여야 할 경우 형변환이 필요합니다.

 

마지막으로 두 눈의 값을 출력하는 코드까지 작성해 줍니다.

 

Exercise 05

public static void Exercise05() {
	System.out.println("Exercise05: ");

	for (int i = 0; i <= 10; i++) {
		for (int j = 0; j <= 10; j++) {
			if ((4 * i) + (5 * j) == 60) {
				System.out.println("(" + i + ", " + j + ")");
			}
		}
	}
}

Exercise 05는 중첩 for문을 이용하여 2차 방정식(4x + 5y = 60)의 해를 구하는 문제입니다.

 

i를 x로 보고, j를 y로 보는 중첩 for문을 작성합니다.

x와 y는 10 이하의 값이므로 0부터 10까지 반복합니다.

내부 for문 안에 if문을 작성하여 (4 * i) + (5 * j)가 60인 경우에만 i와 j 값을 출력합니다. 

 

중첩 for문이므로 i가 0일 때 j는 0부터 10까지의 경우를 모두 수행합니다. 따라서 i가 0부터 10의 경우, j가 0부터 10의 경우를 모두 수행하므로 for문을 총 121번 수행하여 해를 찾습니다.

 

Exercise 06

public static void Exercise06() {
	System.out.println("Exercise06: ");

	for (int i = 1; i <= 5; i++) {
		for (int j = 0; j < i; j++) {
			System.out.print("*");
		}
		System.out.println();
	}
}

Exercise 06은 다음과 같이 5단으로 별을 찍는 문제입니다.

 

*

**

***

****

*****

 

해당 문제 또한 중첩 for문을 이용합니다. 

 

j를 사용하는 for문으로 별의 개수를 조절하고, i를 사용하는 for문으로 줄을 바꿉니다.

 

첫 줄에 별 하나, 두 번째 줄에 별 두 개 ... 형태로 별을 출력해야 하므로 j는 0부터 시작하며, 1부터 시작하는 i보다 작을 때까지 반복합니다.

 

한 줄에 별을 다 찍은 후에는 줄을 바꿔 줍니다.

i가 5가 될 때까지 반복하면 5단 별이 출력됩니다. 

 

Exercise 07

import java.util.Scanner;

public static void Exercise07() {
	boolean run = true;

	int balance = 0;

	Scanner scanner = new Scanner(System.in);

	System.out.println("Exercise07: ");

	while (run) {
		System.out.println("---------------------------------");
		System.out.println("1. 예금 | 2. 출금 | 3. 잔고 | 4. 종료");
		System.out.println("---------------------------------");
		System.out.print("선택>");
		int choice = scanner.nextInt();
		int money;

		switch (choice) {
		case 1:
			System.out.print("\n예금액>");
			money = scanner.nextInt();
			balance += money;
			break;

		case 2:
			System.out.println("\n출금액>");
			money = scanner.nextInt();
			if (money > balance) {
				System.out.println("출금할 금액이 충분하지 않습니다.");
			} else {
				balance -= money;
			}
			break;

		case 3:
			System.out.println("\n잔고>" + balance);
			break;

		case 4:
			System.out.println("\n프로그램 종료");
			run = false;
			break;
		}
	}
}

Exercise 07은 while문을 이용해 입금, 출금, 조회 프로그램을 작성하는 문제입니다.

 

입금할 돈과 출금할 돈을 입력받기 위해서는 Scanner 클래스를 사용해야 하며, Scanner 클래스를 사용하기 위해서는 제일 상단에 있는 'import java.util.Scanner;' 구문이 필요합니다. 해당 구문은 Scanner 클래스는 java.util 패키지 내에 있는데, 이것을 가져와서 사용한다는 의미입니다.

 

scanner.nextInt는 공백 전까지 입력된 정수를 읽어온다는 뜻이며, 여기에서는 메뉴 선택 시 1~4의 숫자를 사용하고, 금액 입력 시에도 숫자를 사용하기 때문에 정수를 읽어옵니다. 

 

미리 선언된 balance 변수에 바로 scanner.nextInt를 사용하여 입력된 금액을 저장할 수 있으나, 따로 money 변수를 생성하여 저장한 이유는 출금액이 현재 예금되어 있는 금액보다 클 경우 오류 처리를 위함입니다.

오류 처리는 if문을 사용해 출금액으로 입력된 금액이 현재 예금되어 있는 금액보다 크다면 출금할 수 없게 하였습니다.

마이너스 통장이라면 해당 변수를 굳이 만들지 않아도 됩니다.

 

입금, 출금, 잔고 확인이 끝난 후 종료를 하는 경우에는 true로 선언된 run 변수의 값을 false로 만들어 주면 while문을 종료할 수 있습니다.

 

switch case문에 break를 사용하여도 해당 switch문만 종료되며, while문에는 영향을 주지 않습니다. 

break를 사용하지 않는 경우 하위의 case문이 실행되기 때문에 사용해 주어야 합니다.

 

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

04. 중복되지 않는 난수 출력하기  (0) 2021.08.18
03. 이것이 자바다 5장 확인 문제  (0) 2021.07.28
01. Hello, World  (0) 2021.07.26
00. Eclipse 설치하기  (0) 2021.07.15
00. JAVA 설치하기  (0) 2021.07.15