본문 바로가기

BackEnd/Java

[java] 메서드, 재귀메서드를 이용한 심화 문제 풀이

728x90
반응형
심화 문제1


문제) 양의 정수 내에 있는 숫자 0의 개수를 구하려고 한다. 예를 들면 102030에 있는 숫자 0의 개수는 3이다. 
먼저 주어진 양의 정수 내에 있는 숫자 0의 개수를 반복을 사용해 구하는 메서드를 작성하라.
다음으로  주어진 양의 정수 내에 있는 숫자 0의 개수를 재귀를 사용하여 구하는 메서드를 작성하라.

 

힌트) 양의 정수 내에 있는 숫자 0의 개수를 다음과 같이 구할 수 있다.
(a) 양의 정수가 10보다 작다면 숫자 0의 개수는 0이다.
(b) 양의 정수가 10이상이라면 숫자 0의 개수는 다음과 같다.
1) 마지막 숫자가 0이라면 마지막 숫자를 제거한 나머지 정수 내의 숫자 0의 개수에 1을 더한 값이다.
2) 마지막 숫자가 0이 아니라면 마지막 숫자를 제거한 나머지 정수 내의 숫자 0의 개수이다.

예를 들면 102030에 있는 숫자 0의 개수는 마지막 숫자가 0이므로
102030에 있는 숫자의 개수 (2)에 1을 더한 값인 3이다.

양의 정수를 입력하세요 : 102030
반복 결과 : 3개
재귀 결과 : 3개

102030 : 제일 마지막 숫자 : 0
10203 : 제일 마지막 숫자 : 3
1020 : 제일 마지막 숫자 : 0
102 : 제일 마지막 숫자 : 2
10 : 제일 마지막 숫자 : 0
1 : 1

마지막으로 사용자로부터 하나의 양의 정수를 입력받아 그 정수 내의 숫자 0의 개수를 위해서
작성한 메서드를 호출하여 출력하는 프로그램을 작성하라.

 

package java1212;

import java.util.Scanner;

public class methodEx04 {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int number; //양의 정수
		Scanner scan = new Scanner(System.in);
		
		// 양의 정수를 입력 받는다.
		// 여기에 코드를 삽입하세요.
		number = scan.nextInt();
		
		System.out.println("반복 결과 : " + getNumberOfZeroIter(number) + "개");
		
		//getNumberOfZerosRecur 메서드를 호출하여 양의 정수 내에 있는 숫자 0의 개수를 구한다.
		System.out.println("반복 결과 : " + getNumberOfZerosRecur(number) + "개");
		//여기에 코드를 삽입하세요.
					
	}
	
	
	public static int getNumberOfZeroIter(int N) {
		
		int count = 0;
		
		while(N >= 10) {
			if(N % 10 == 0) {
				count++;
			}
			N /= 10;
		}
		
		return count;
	}
	
	
	public static int getNumberOfZerosRecur(int N) {
		if(N <= 10) {
			return 0;                               //마지막 숫자가 0이 아니다.
		} else if(N % 10 == 0) {
			return getNumberOfZerosRecur(N/10) + 1; //마지막 숫자가 0이면 마지막 숫자를 제거한 나머지 정수내의 숫자 0의 개수에 1을 더한다. count++
		} else {
			return getNumberOfZerosRecur(N/10);     //마지막 숫자가 0이 아니면 마지막 숫자를 제거한 나머지 정수내의 숫자 0의 개수를 구한다.
		}
	}
}

 

숫자를 입력하면 해당 숫자의 0의 개수를 출력할 수 있어요!

메서드를 이용해 보았구요, for, 재귀함수를 이용해 결과를 출력할 수 있었어요!

재귀의 방법을 생각해내지 못해서 주변의 도움을 많이 받았네요,,,ㅎㅎ 

 

 

심화 문제2

 

문제) 대학교 내에 방문객을 위한 주차장의 주차요금을 계산하는 메서드를 작성하라. 주차 요금은 이용 시간에 따라 다음과 같이 계산된다.


첫 1시간 : 1,000원
1시간을 초과하는 각 시간 혹은 각 시간의 일부 : 500원
하루 최대요금 : 10,000원

예를 들면 3시간 20분의 주차 요금은 다음과 같이 계산된다.
첫 1시간 : 1,000원
다음 2시간 : 500원 x 2 = 1,000원
다음 20분 : 500원
총 주차요금 = 1,000 + 500 x 2 + 500 = 2,500원

차는 한번에 하루 넘게 주차할 수 없다고 가정한다. 주차장을 이용하는 차가 들어온 시간과 나간 시간이 주어지면 그에 따라 요금이 계산된다. 이 시간들은 0~24 사이의 실수 값으로 주어진다. 작성된 메서드를 사용하여 각 방문객에 대한 주차 요금을 계산하는 프로그램을 작성하라. 한 방문객의 주차 시간이 주어지면 주차 요금을 계산하여 출력한다. 다음으로 계속하기를 원하는지 물어보고 계속하겠다면 같은 일을 반복한다. 그렇지 않다면 종료한다.

출력)
들어온 시간을 입력하세요 : 3.7
나간 시간을 입력하세요 : 5.2
주차 요금은 1500.0원 입니다.
계속 하기를 원하세요? 그렇다면 y를 아니면 n을 입력하세요 : y
들어온 시간을 입력하세요 : 9.5
나간 시간을 입력하세요 : 14.8
주차 요금은 3500.0원 입니다.
계속하기를 원하세요? 그렇다면 y를 아니면 n을 입력하세요 : n

 

package java1212;

import java.util.Scanner;

public class methodEx05 {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Scanner scan = new Scanner(System.in);
		
		double inTime;
		double outTime;
		String yn = "y";
		
		do {
			if(yn.equals("y")) {
				
				do {
					System.out.print("들어온 시간을 입력하세요 : ");
					inTime = scan.nextDouble();
				}while(inTime > 24 || inTime < 0);

				do {
					System.out.print("나간 시간을 입력하세요 : ");
					outTime = scan.nextDouble();
				}while(outTime > 24 || outTime < 0);
				
				System.out.println("주차 요금은 " + parkingFee(inTime, outTime) + "원 입니다.");
				
			}else if(yn.equals("n")) break;
			
			System.out.print("계속 하기를 원하세요? 그렇다면 y를 아니면 n을 입력하세요 : ");
			yn = scan.next();
			yn = yn.toLowerCase();	
		
		}while(true);
	}
	
	public static double parkingFee(double inTime, double outTime) {
		
		double fee = 0;
		
		if((outTime-inTime) <= 1) {
			fee = 1000;
		} else {
			fee = 1000 + Math.ceil(outTime-inTime-1) * 500;
			if(fee >= 10000) fee = 10000;
		}
		return fee;
	}
}

 

이 문제는 메서드를 이용해서 해결해보았습니다. 다른 분들이 하신 것을 보니 메서드에 굳이 변수를 두개 지정하지 않고 main함수에 parkTime이라는 변수를 지정해 주차한 시간만 계산하니 더 간략하게 나타낼 수 있네요!

 

 

 

심화 문제3

 

문제) 두 개의 정수를 입력 받아 사칙 연산을 수행하는 메서드를 작성하여 프로그램을 만드시오.

nPlu(a, b) : 더하기

nMin(a, b) : 빼기

nTim(a, b) : 곱하기

nDiv(a, b) : 나누기

 

package java1212;

import java.util.Scanner;

public class methodEx06 {
	
	public static void main(String[] args) {
		// 사칙연산 메소드 : 두 수를 입력 받아 사칙 연산 결과 출력
		
		Scanner scan = new Scanner(System.in);
		
		int num1;
		int num2;
		
		System.out.print("두 개의 정수를 입력해주세요(10 20) : ");
		num1 = scan.nextInt();
		num2 = scan.nextInt();
		
		nPlu(num1, num2); //합
		nMin(num1, num2); //차
		nTim(num1, num2); //곱
		nDiv(num1, num2); //나누기
	}
	
	public static void nPlu(int a, int b) {
		int sum;
		sum = a + b;
		System.out.println("두 수의 합은 : " + sum);
	}
    
//		public static int nPlu(int a, int b) {
//		return a + b;
//	}   → 위의 함수와 동일하고 int, void만 다르다.
	
	public static void nMin(int a, int b) {
		int sub;
		sub = a - b;
		System.out.println("두 수의 차는 : " + sub);
	}
	
	public static void nTim(int a, int b) {
		int mul;
		mul = a * b;
		System.out.println("두 수의 곱은 : " + mul);
	}
	
	public static void nDiv(int a, int b) {
		int div;
		div = a / b;
		System.out.println("두 수의 나눗셈은 : " + div);
	}
}

 

사칙연산(+, -, *, /)의 개수만큼 메서드를 지정해서 결과 값을 출력할 수 있도록 했습니다.

메서드에서 void를 이용하면 return이 필요없고, 다른 int, double 등을 이용하면 return을 해서 값을 보내줘야 하네요!

 

 

 

심화 문제4

 

두개 또는 3개의 정수를 입력하여 사칙 연산이 수행하게 메서드를 작성하여 프로그램을 만드시오.

 

메서드(30, 20);

두 수에 대한 합 : 50

두 수에 대한 차 : 10

두 수에 대한 곱 : 600

두 수에 대한 나누기 : 1.5

 

메서드(40, 20, 10);

두 수에 대한 합 : 70

두 수에 대한 차 : 10

두 수에 대한 곱 : 8000

두 수에 대한 나누기 : 0.2

 

package java1212;

import java.util.Scanner;

public class methodEx07 {
	
	public static void main(String[] args) {
		// 사칙연산 메소드 : 두 수를 입력 받아 사칙 연산 결과 출력
		
		Scanner scan = new Scanner(System.in);
		
		int n;
		
		System.out.print("몇 개의 정수를 입력할 것인지 선택해주세요(2 or 3) : ");
		n = scan.nextInt();
		
		int[] arr = new int[n];
		
		if(n == 2) {
			System.out.print("두 수를 입력하세요 : ");
		} else {
			System.out.print("세개의 수를 입력하세요 : ");
		}
		
		for(int i=0; i < arr.length; i++) {
			arr[i] = scan.nextInt();
		}
		
		if(arr.length >= 2) {
			nPlu(arr[0], arr[1]); //합
			nMin(arr[0], arr[1]); //차
			nTim(arr[0], arr[1]); //곱
			nDiv(arr[0], arr[1]); //나누기
			
			if(arr.length > 2) {
				nPlu(arr[0], arr[1], arr[2]); //합
				nMin(arr[0], arr[1], arr[2]); //차
				nTim(arr[0], arr[1], arr[2]); //곱
				nDiv(arr[0], arr[1], arr[2]); //나누기
			}			
		}
		scan.close();
	}
	
	public static void nPlu(int a, int b) {
		int sum;
		sum = a + b;
		System.out.println("두 수의 합은 : " + sum);
	}
	
	public static void nMin(int a, int b) {
		int sub;
		sub = a - b;
		System.out.println("두 수의 차는 : " + sub);
	}
	
	public static void nTim(int a, int b) {
		int mul;
		mul = a * b;
		System.out.println("두 수의 곱은 : " + mul);
	}
	
	public static void nDiv(int a, int b) {
		double div;
		div = (double)a / b;
		System.out.println("두 수의 나눗셈은 : " + div);
	}
	
	public static void nPlu(int a, int b, int c) {
		int sum;
		sum = a + b + c;
		System.out.println("두 수의 합은 : " + sum);
	}
	
	public static void nMin(int a, int b, int c) {
		int sub;
		sub = a - b - c;
		System.out.println("두 수의 차는 : " + sub);
	}
	
	public static void nTim(int a, int b, int c) {
		int mul;
		mul = a * b * c;
		System.out.println("두 수의 곱은 : " + mul);
	}
	
	public static void nDiv(int a, int b, int c) {
		double div;
		div = (double)a / b / c;
		System.out.println("두 수의 나눗셈은 : " + div);
	}
}
package java1212;

import java.util.Scanner;

public class methodEx07_01 {
	
	public static void main(String[] args) {
		// 사칙연산 메소드 : 두 수를 입력 받아 사칙 연산 결과 출력
		
		Scanner scan = new Scanner(System.in);
		
		System.out.print("두 개 또는 3개의 정수를 입력해주세요 : ");
		
		String str1;
		str1 = scan.nextLine();
		
		String[] str = str1.split(" ");
		
		int arr[] = new int[str.length];
		
		for(int i=0; i<arr.length; i++) {
			arr[i] = Integer.parseInt(str[i]);
		}
		
		if(arr.length >= 2) {
			nPlu(arr[0], arr[1]); //합
			nMin(arr[0], arr[1]); //차
			nTim(arr[0], arr[1]); //곱
			nDiv(arr[0], arr[1]); //나누기	
			
			if(arr.length == 3) {
				nPlu(arr[0], arr[1], arr[2]); //합
				nMin(arr[0], arr[1], arr[2]); //차
				nTim(arr[0], arr[1], arr[2]); //곱
				nDiv(arr[0], arr[1], arr[2]); //나누기
			}
		}
		scan.close();
	}
	
	public static void nPlu(int a, int b) {
		int sum;
		sum = a + b;
		System.out.println("두 수의 합은 : " + sum);
	}
	
	public static void nMin(int a, int b) {
		int sub;
		sub = a - b;
		System.out.println("두 수의 차는 : " + sub);
	}
	
	public static void nTim(int a, int b) {
		int mul;
		mul = a * b;
		System.out.println("두 수의 곱은 : " + mul);
	}
	
	public static void nDiv(int a, int b) {
		double div;
		div = (double)a / b;
		System.out.println("두 수의 나눗셈은 : " + div);
	}
	
	public static void nPlu(int a, int b, int c) {
		int sum;
		sum = a + b + c;
		System.out.println("두 수의 합은 : " + sum);
	}
	
	public static void nMin(int a, int b, int c) {
		int sub;
		sub = a - b - c;
		System.out.println("두 수의 차는 : " + sub);
	}
	
	public static void nTim(int a, int b, int c) {
		int mul;
		mul = a * b * c;
		System.out.println("두 수의 곱은 : " + mul);
	}
	
	public static void nDiv(int a, int b, int c) {
		double div;
		div = (double)a / b / c;
		System.out.println("두 수의 나눗셈은 : " + div);
	}
}

 

이번에는 두가지  방법으로 코드를 실행해보았습니다. 똑같은 함수를 사용하더라도 자바에서는 변수를 다르게 지정할 수 있습니다.

첫 번째 방법 : 변수의 개수 및 배열 값을 입력 받아 결과 값을 출력

두 번째 방법 : String으로 입력을 받고 split을 이용해 숫자를 분리하고 정수형 변수로 바꿔서 배열에 저장했습니다.

 

이렇게 이름이 같은 메서드를 여러개 정의 하는 것을 오버로딩(overloading)이라고 합니다.

 

 

심화 문제5

 

문제) 양의 정수 내에 있는 짝수 숫자들의 개수를 구하는 문제를 고려한다.

예를 들면 12345에 있는 짝수 숫자들의 개수는 2이다. 0은 짝수이다.

(a) 주어진 양의 정수 내에 있는 짝수 숫자들의 개수를 반복을 사용하여 구하는 메서드를 설계하고 작성하라.
(b) 주어진 양의 정수 내에 있는 짝수 숫자들의 개수를 재귀를 사용하여 구하는 메서드를 설계하고 작성하라.

(c) 사용자로 부터 하나의 양의 정수를 입력 받아 그 정수내의 짝수 숫자들의 개수를 (a)번과 (b)번에서 작성한 메서드를 이용하여 구한후 출력하는 완전한 프로그램을 설계하고 작성하라.

 

힌트 : 양의 정수 내에 있는 짝수 숫자들의 개수를 다음과 같이 구할 수 있다.
1) 양의 정수가 10보다 작다면 짝수 숫자들의 개수는 양의 정수를 2로 나눈 나머지가 0이면 1이고 아니면 0이다.
2) 양의 정수가 10 이상이라면 짝수 숫자들의 개수는 다음과 같다.
    (1) 마지막 숫자를 2로 나눈 나머지가 0이라면 마지막 숫자를 제거한 나머지 정수 내의 짝수 숫자들의 개수에
          1을 더한 값이다.
    (2) 마지막 숫자를 2로 나눈 나머지가 1이라면 마지막 숫자를 제거한 나머지 정수 내의 짝수 숫자들의 개수이다.

예를 들면, 102030에 있는 짝수 숫자들의 개수는 마지막 숫자인 0을 2로 나눈 나머지가 0이므로 10203에 있는 짝수 숫자들의 개수(3) 에 1을 더한 값인 4 이다.
(c) 사용자로 부터 하나의 양의 정수를 입력 받아 그 정수내의 짝수 숫자들의 개수를    (a)번과 (b)번에서 작성한 메서드를 이용하여 구한후 출력하는 완전한 프로그램을 설계하고 작성하라.

 

package java1212;

import java.util.Scanner;

public class methodEx08 {
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		
		int num;
		
		System.out.print("양의 정수를 입력하세요 : ");
		num = scan.nextInt();
		
		System.out.println("반복 결과 : " + evenCountRepeat(num) + "개");
		System.out.println("재귀 결과 : " + evenCountRecure(num) + "개");

		scan.close();
	}
    
	public static int evenCountRepeat(int a) {
		
		int cnt = 0;
		
		while(a > 0) {
			if(a % 2 == 0) {
				cnt++;
				a /= 10;
			} else {
				a /= 10;
			}
		}
		
		return cnt;
	}
	
	public static int evenCountRecure(int a) {
				
		if(a == 0) return 0;
		else {
			if(a % 2 == 0) {
				return evenCountRecure(a/10) + 1;
			} else {
				return evenCountRecure(a/10);
			}
		}
	}
	
//	public static int evenCountRecure2(int a) {
//		
//		int cnt = 0;
//		
//		if(a == 0) cnt = 0;
//		else {
//			if(a % 2 == 0) {
//				cnt = evenCountRecure(a/10) + 1;
//			} else {
//				cnt = evenCountRecure(a/10);
//			}
//		}
//		return cnt;
//	}
}
양의 정수를 입력하세요 : 123456789
반복 결과 : 4개
재귀 결과 : 4개

 

위의 코드는 재귀 방법을 두가지로 나타내었습니다. a = 0일때를 따로 지정해주지 않으니 반복해서 수행하므로 오류가 나타나게 됩니다. 따라서 재귀를 사용할 때 최소 기준이 정해져 있어야 한다는 것이 중요합니다!!

 

머리가 터질거 같아요,,ㅎㅎ

 

오늘은 메서드, 재귀메서드 심화문제들을 풀어보았는데 아직 가야할 길이 머네요,,ㅎㅎ

그래도 힘내서 전진해야겠어요!!

 

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

 

728x90
반응형

'BackEnd > Java' 카테고리의 다른 글

[java] 자바의 클래스(class)란?  (0) 2022.12.13
[java] 22.12.12 심화 문제 풀이  (0) 2022.12.13
[java] 반복문(for, while, do~while)  (0) 2022.12.13
[java] 메서드(method 기능)  (1) 2022.12.13
[java] 2022.12.09 연습 문제 풀이  (1) 2022.12.13