[Java] 조건문과 반복문을 이용한 간단한 알고리즘 정리 - 2

다양한 알고리즘 문제를 풀이하였다. 이 중에는 할인액 계산, 다독왕 게임, 피보나치 수열, 출입증, 일차 방정식, 숫자 맞추기 게임, 만원의 행복, 은행 등 다양한 문제가 포함되어 있다. 각 문제는 조건문과 반복문을 이용하여 풀이하였으며, 특히 do-while 문을 이용하여 코드를 먼저 실행시킨 후 원하는 만큼 계속해서 반복시키는 방법을 사용하였다.
Jan 05, 2024
[Java] 조건문과 반복문을 이용한 간단한 알고리즘 정리 - 2

[배수 판별기]

입력 받은 양의 정수가 3의 배수, 4의 배수, 6의 배수 혹은 8의 배수인지를 알려주는 프로그램을 설계하고 작성하라.

  1. 3의 배수이면 '3의 배수이다'를 출력
  1. 4의 배수이면 '4의 배수이다'를 출력
  1. 6의 배수이면 '6의 배수이다'를 출력
  1. 8의 배수이면 '8의 배수이다'를 출력
  1. 그 외의 경우이면 '어느 배수도 아니다'를 출력하라.

MultipleCalc.java

package ch4Practice; import java.util.*; public class MultipleCalc { public static void main(String[] args) { // 값 입력 Scanner scan = new Scanner(System.in); System.out.println("값을 입력해주세요. -> "); int input = scan.nextInt(); // 3의 배수인가? if(input%3==0) { System.out.println("3의 배수이다."); } // 4의 배수인가? if(input%4==0) { System.out.println("4의 배수이다."); } // 6의 배수인가? if(input%6==0) { System.out.println("6의 배수이다."); } // 8의 배수인가? if(input%8==0) { System.out.println("8의 배수이다."); } // 그 이외의 경우 if(input%3!=0 && input%4!=0 && input%6!=0 && input%8!=0) { System.out.println("어느 배수도 아니다."); } scan.close(); } }
 

핵심 키워드

  • AND 조건과 !=연산자를 통해 조건을 만족하는 코드를 작성한다.

[청구 금액 계산기]

할인점에서 고객에게 청구 금액을 계산하는 프로그램을 설계하고 작성하라. 고객이 30만원 이상 구매하면 3만원을 할인해 주어야 하고, 30만원 미만 10만원 이상을 구매하면 5,000원을 할인해 주어야 하며, 10만원 미만을 구매하면 할인이 없어야 한다. 구매 금액을 입력 받아, 구매 금액과 할인액, 청구 금액을 출력해야 한다.

출력 예시>
구매 금액을 입력하세요 --> [숫자 입력]
구매금액 : 000 할인액 : 000 청구 금액 : 000

BillCalc.java

package ch4Practice; import java.util.*; public class BillCalc { public static void main(String[] args) { int discount, result; // 구매금액 입력 Scanner scan = new Scanner(System.in); System.out.printf("구매 금액을 입력하세요 -->"); int input = scan.nextInt(); // 30만원 이상 구매? if(input>=300000) { // 할인액 설정 discount = 30000; }// 30만원 미만 10만원 이상 구매? else if(input>=100000) { discount = 5000; }else { discount =0; } // 청구금액 = 구매금액 - 할인액 result = input - discount; // 구매금액, 할인액, 청구금액 출력 System.out.println("구매금액 : " + input); System.out.println("할인액 : " + discount); System.out.println("청구 금액 : " + result); } }

핵심 키워드

  • if와 else if문의 순서를 파악해서 올바른 흐름을 가지도록 코드를 작성한다.

[다독왕]

1년동안 읽은 책 수에 따라 멘트를 출력하는 프로그램을 작성하시오.
조건> 책 수를 입력받아, Switch-case문을 사용하여 작성할 것

출력 예시> 10권 미만일 경우 "조금 더 노력하세요"를 출력, 10권 이상 20권 미만일 경우 "책 읽는 것을 즐기는 분이시네요!"를 출력, 20권 이상 30권 미만일 경우 "책을 사랑하는 분이시네요!"를 출력, 30권 이상일 경우 "당신은 다독왕입니다!"를 출력한다.

ReadingKing.java

package ch4Practice; import java.util.*; public class ReadingKing { public static void main(String[] args) { // 책 수 입력 Scanner scan = new Scanner(System.in); System.out.printf("1년동안 읽은 책 수를 입력하세요 --> "); int input = scan.nextInt(); // 조건> Switch-case문을 사용하여 작성 switch(input/10) { // 10권 미만? case 0: System.out.println("조금 더 노력하세요"); break; // 10권 이상 20권 미만? case 1: System.out.println("책 읽는 것을 즐기는 분이시네요!"); break; // 20권 이상 30권 미만? case 2: System.out.println("책을 사랑하는 분이시네요!"); break; // 30권 이상? default: System.out.println("당신은 다독왕입니다!"); break; } } }

핵심 키워드

  • 각 조건이 이상~미만으로 이루어져 있으므로 입력받은 값의 나머지 연산을 통해 switch-case문으로 코드를 작성한다.

[피보나치 수]

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다. 입력 n이 들어오면, n번째 피보나치 수를 출력하는 프로그램을 작성하시오.

n=17 일 경우의 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

Fibonacci.java

package ch4Practice; import java.util.*; public class Fibonacci { public static int recursion(int n) { if (n == 0) return 0; // 첫 번째 원소라면 else if (n == 1) return 1; // 두 번째 원소라면 else { return recursion(n - 2) + recursion(n - 1); } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.printf("수를 입력해주세요 --> "); // 수 입력 int input = scan.nextInt(); // 입력한 수 만큼 재귀함수 호출 for (int i = 0; i <= input; i++) { // 해당 번째의 피보나치 수 출력 System.out.print(recursion(i) + " "); } } }

핵심 키워드

  • 재귀함수를 통해 다음 값 = 현재 값 + 이전 값의 식을 가진 피보나치 수열을 코드로 구현할 수 있다.

[출입증]

연구소의 출입을 허가하는 출입증이 있다. 연구소는 101호, 102호, 103호, 201호, 202호, 301호의 연구실로 구성되어 있다. 숫자가 큰 호실의 출입증은 해당 숫자보다 작은 호실의 연구실 출입도 허가된다. 예를 들어 103호 출입증은 101호와 102호의 출입이 허가된다. 또한 202호 출입증은 101, 102, 103, 201호 출입이 허가된다. 출입증에 표기된 호수를 입력하면, 출입 가능한 호실의 리스트를 출력하는 프로그램을 작성하시오.
조건> swtich-case 문을 활용하시오

출력 예> 출입증에 표기된 호수를 입력하세요 --> [숫자 입력] 출입 가능한 연구실 :
  1. 000호
  1. 000호
  1. 000호

Pass.java

package ch4Practice; import java.util.*; public class Pass { public static void main(String[] args) { // 출입증 입력 Scanner scan = new Scanner(System.in); System.out.printf("출입증에 표기된 호수를 입력하세요 --> "); int input = scan.nextInt(); // 번호를 매기기 위한 변수 선언 int counter = 0; // 각각의 케이스에 대한 출력 // 조건> Switch-case문을 사용하여 작성 System.out.println("출입 가능한 연구실 :"); switch (input) { case 301: counter++; // 번호의 숫자 증가 System.out.printf("%d. 301호\n", counter); case 202: counter++; System.out.printf("%d. 202호\n", counter); case 201: counter++; System.out.printf("%d. 201호\n", counter); case 103: counter++; System.out.printf("%d. 103호\n", counter); case 102: counter++; System.out.printf("%d. 102호\n", counter); case 101: counter++; System.out.printf("%d. 101호\n", counter); } } }

핵심 키워드

  • break 문을 사용하지 않는 switch-case 문의 예제를 작성했다.

[방정식]

다음 ax + by = c 와 같은 일차 방정식이 있다. a, b, c 차례대로 값을 입력 받고, 해당 방정식을 만족하는 0을 포함한 자연수로 구성된 모든 해를 구해서 (x, y) 형태로 출력하는 프로그램을 만드시오.

출력 예> a값을 입력하세요 --> [숫자 입력] b값을 입력하세요 --> [숫자 입력] c값을 입력하세요 --> [숫자 입력] 해당 방정식을 만족하는 모든 해를 출력합니다. . . (x, x) . . . (x, x) 모든 해를 출력 후 종료합니다. . .

Equation.java

package ch4Practice; import java.util.*; public class Equation { public static void main(String[] args) { // a, b, c값 입력 Scanner scan = new Scanner(System.in); System.out.printf("a값을 입력하세요 --> "); int a = scan.nextInt(); System.out.printf("b값을 입력하세요 --> "); int b = scan.nextInt(); System.out.printf("c값을 입력하세요 --> "); int c = scan.nextInt(); System.out.println("해당 방정식을 만족하는 모든 해를 출력합니다... "); // 조건 만족하는 x값 찾기 for (int x = 0; x < c; x++) { // 조건 만족하는 y값 찾기 for (int y = 0; y < c; y++) { // 방정식 조건 if (a * x + b * y == c) { // (x,y) 출력 System.out.println("(" + x + ", " + y + ")"); } } } } }

핵심 키워드

  • 이중 for문을 통해 각각 x와 y의 값을 찾아낼 수 있다.

[숫자 맞추기 게임]

숫자 맞추기 게임을 하는 프로그램을 작성하라. 프로그램은 1과 100을 포함한 사이의 임의의 정수를 선택해야 한다. 그 다음에 사용자에게 1에서 100 사이의 숫자를 입력 받는다. 사용자가 추측한 숫자가 맞거나, 크거나 혹은 작은지 알려주고 사용자가 정확하게 맞추거나 맞추기를 그만 둘 때까지 수자 맞추기를 계속하라. 맞출 때까지 추측한 횟수를 세고 사용자가 맞추고 난 후 그 횟수를 출력하라. 각 게임이 끝난 후에 사용자가 맞추기 게임을 계속하기를 원하는지 묻고, 사용자가 게임을 종료하기를 원할 때 까지 게임을 계속하게 하라. 단, 각 게임 마다 추측 횟수는 초기화되어 새로 세어야 한다.

출력 예>
숫자를 입력하십시오 --> [숫자입력] 정답은 해당 숫자보다 큽니다 숫자를 입력하십시오 --> [숫자입력] 정답은 해당 숫자보다 작습니다 . . . 반복 정답입니다! 추측 횟수는 [숫자]번 입니다. 계속 하시겠습니까?(y/n) --> [y 또는 n 입력] (y를 선택할 경우 다시 첫 줄로 돌아가 반복 . . .) . . . n 선택시 프로그램을 종료합니다. . .

UpDownGame.java

package ch4Practice; import java.util.*; public class UpDownGame { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String select; int input = 0; do { // 랜덤 값 생성 int result = (int) (Math.random() * 100) + 1; // 추측 횟수 생성 int count = 0; System.out.print(result); while (input != result) { // 사용자 값 입력 System.out.println("숫자를 입력하십시오 -->"); input = scan.nextInt(); // 입력한 개행문자 제거 scan.nextLine(); // 입력 값이 작을 경우 if (input < result) { System.out.println("정답은 해당 숫자보다 큽니다."); count++; } // 입력 값이 클 경우 else if (input > result) { System.out.println("정답은 해당 숫자보다 작습니다."); count++; } } // 입력 값을 맞췄을 경우 System.out.println("정답입니다."); System.out.println("추측 횟수는 [" + count + "] 번 입니다."); System.out.printf("계속 하시겠습니까?(y/n) --> "); select = scan.nextLine(); } while (select.equals("y")); } }

핵심 키워드

  • input = scan.nextInt();이 동작하지 않을 경우, 이전에 사용했던 Scanner 객체에서 입력된 개행문자를 scan.nextLine(); 메서드를 통해 삭제한다.
  • do-while 문을 통해 처음 코드를 실행한 이후, 계속해서 코드를 반복시킬 수 있다.

[만원의 행복]

만원에서 시작하여, 사용할 액수를 입력받고 돈을 사용할 때마다 해당 금액만큼 차감 후 "현재 가진 돈은 000원 입니다."를 출력한다. 해당 과정을 반복하여 돈을 남김없이 사용한 경우 "모든 돈을 사용하였습니다. . . 종료"를 출력하며 종료되는 프로그램을 작성하시오. 단, 금액은 반드시 정수만 입력받으며, 현재 가진 돈보다 크거나 0 혹은 음수를 입력 시 다시 입력을 요구하여야 한다. 또한, 잔액을 출력할 경우 반드시 세자리 수 마다 콤마(,)로 구분하여 출력한다. (예. 9,999원)
조건> 콘솔에 출력 시 printf만을 사용할 것

출력 예> 현재 가진 돈은 10,000원 입니다. 얼마를 사용하시겠습니까? --> [숫자 입력] (사용 범위를 벗어날 경우) 다시 입력해주세요, 사용 범위가 틀렸습니다. 얼마를 사용하시겠습니까? --> [숫자 입력] (정상적인 값을 입력한 경우) 현재 가진 돈은 xx,000원 입니다. 얼마를 사용하시겠습니까? --> [숫자 입력] . . . 반복 (모든 돈을 사용한 경우) 모든 돈을 사용하였습니다. . . 종료

MoneyCalc.java

package ch4Practice; import java.text.*; import java.util.*; public class MoneyCalc { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // DecimalFormat 클래스를 이용해서 숫자에 , 찍기 DecimalFormat decFormat = new DecimalFormat("###,###"); int moneyLeft = 10000; do { // 현재 가진 돈 출력 System.out.printf("현재 가진 돈은 %s입니다.\n", decFormat.format(moneyLeft)); // 사용할 돈 입력 System.out.printf("얼마를 사용하시겠습니까? -->"); int price = scan.nextInt(); // 사용할 돈과 현재 가진 돈 비교 // 사용할 돈이 현재 가진 돈보다 작거나 같을 경우 if (price <= moneyLeft) { moneyLeft -= price; } else { // 그 외의 경우 System.out.println("다시 입력해주세요, 사용 범위가 틀렸습니다."); } } while (moneyLeft != 0); // 현재 가진 돈이 0일 경우 종료 System.out.println("모든 돈을 사용하였습니다."); } }

핵심 키워드

  • DecimalFormat 클래스를 이용해서 숫자를 원하는 포맷으로 표현할 수 있다.

[은행]

아래 출력 예와 같이 예금, 출금, 잔고 조회가 가능한 프로그램을 작성하라. 단, 잔고보다 많은 금액을 인출하려 하면 "잔고 부족" 알림과 부족한 금액을 출력하도록 하며, 한 가지 업무를 완료하면 다시 메인 메뉴로 돌아가 종료(4번)를 입력할 때까지 반복한다.
조건> do-while문과 switch-case문을 활용할 것

출력 예>
————————————— 1.예금 | 2.출금 | 3.잔고 | 4.종료 —————————————
선택> 1 예금액>10000
————————————— 1.예금 | 2.출금 | 3.잔고 | 4.종료 —————————————
선택> 2 출금액>3500
————————————— 1.예금 | 2.출금 | 3.잔고 | 4.종료 —————————————
선택> 3 잔고>6500
————————————— 1.예금 | 2.출금 | 3.잔고 | 4.종료 —————————————
선택> 2 출금액>10000 잔고 부족 부족금액 : 3500원
————————————— 1.예금 | 2.출금 | 3.잔고 | 4.종료 —————————————
선택> 3 잔고>6500
————————————— 1.예금 | 2.출금 | 3.잔고 | 4.종료 —————————————
선택> 4
프로그램 종료

Bank.java

package ch4Practice; import java.util.*; public class Bank { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 현재 금액 선언 int input = 0; int currentMoney = 0; // 조건> do-while문 사용 do { // 사용자 입력 System.out.println("--------------------------------"); System.out.println("1.예금 | 2.출금 | 3.잔고 | 4.종료"); System.out.println("--------------------------------"); System.out.printf("선택> "); input = scan.nextInt(); // 조건> switch-case문 사용 switch (input) { case 1: // 예금일 경우 System.out.printf("예금액>"); int deposit = scan.nextInt(); currentMoney += deposit; continue; case 2: // 출금일 경우 System.out.printf("출금액>"); int withdrawal = scan.nextInt(); // 잔고보다 많은 금액을 인출하려고 했을 경우 if (currentMoney < withdrawal) { System.out.println("잔고 부족"); System.out.println("부족 금액 : " + (withdrawal - currentMoney) + "원"); } else { currentMoney -= withdrawal; } continue; case 3: // 잔고일 경우 System.out.println("잔고>"+currentMoney); continue; case 4: // 종료일 경우 break; } } while (input != 4); } }

핵심 키워드

  • do-while 문을 이용해서 코드를 먼저 실행시킨 후 원하는 만큼 계속해서 반복시킬 수 있다.

결론

해당 문제들을 풀면서 조건문과 반복문을 이용한 자바 알고리즘 풀이를 익혀볼 수 있었다.
 
Share article

More articles

See more posts

👨🏻‍💻DriedPollack's Blog