본문 바로가기

BackEnd/Java

[java] 22.12.12 심화 문제 풀이

728x90
반응형
심화 문제6

 

문제)인터넷 뱅킹을 위한 암호를 입력 받아 유효 여부를 확인하는 문제를 고려한다.

 

(a) 주어진 문자열내의 숫자들의 개수를 반복을 이용하여 구하는 메소드를 설계한 후 작성하라. 예를 들면 주어진 문자열이 "year2016"이라면 숫자들의 개수는 4개이다.
(b) 주어진 문자열내의 영문자(대문자와 소문자 포함)들의 개수를 구하는 재귀 메소드를 설계한 후 작성하라. 예를 들면 주어진 문자열이"Year2016"이라면 영문자들의 개수는 4이다.
(c) 인터넷 뱅킹을 위한 암호를 입력 받아 유효 여부를 확인하는 프로그램을 설계한 후 작성하라. 이 프로그램은 반드시 (a)와 (b)에서 작성한 메소드들을 이용해야 한다. 암호는 영문자(대문자와 소문자 포함)와 숫자를 혼용하여 이루어져야 하며 암호의 길이는 10 이상이어야 한다. 사용자로부터 암호를 키보드를 통해 입력 받아야 한다. 유효한 암호가 입력되면 "암호가 유효합니다"라는 메시지를 출력하고 종료해야 한다. 유효하지 않은 암호가 입력되면 "암호가 유효하지 않습니다"라는 메시지와 유효하지 않은 이유를 모두 출력하고 다시 암호를 입력 받아야 한다. 다음은 모범 출력이다. 프로그램은 아래와 같은 포맷으로 출력해야 한다.

 

출력 ]
암호를 입력하세요: 12345
입력된 암호: 12345

암호가 유효하지 않다.
이유: 암호의 길이가 10보다 작다.
이유: 암호 내에 영문자가 없다.

암호를 입력하세요: asdfghjk
입력된 암호: asdfghjk

암호가 유효하지 않다.
이유: 암호의 길이가 10보다 작다.
이유: 암호 내에 숫자가 없다.

암호를 입력하세요: @#$%^&*()
입력된 암호: @#$%^&*()

암호가 유효하지 않다.
이유: 암호의 길이가 10보다 작다.
이유: 암호 내에 숫자가 없다.
이유: 암호 내에 영문자가 없다.

암호를 입력하세요: asdfg12345
입력된 암호: asdfg12345

암호가 유효하다.

 

package JAVA1213;

import java.util.Scanner;

public class ex06 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Scanner scan = new Scanner(System.in);
		
		String password;
		
		do {
			System.out.print("암호를 입력하세요 : ");
			password = scan.next();
			
			if(password.length() < 10) {
				System.out.println("암호가 유효하지 않다.");
				System.out.println("이유 : 암호의 길이가 10보다 작다.");
				
				if(numCount(password, password.length()) == 0) {
					System.out.println("이유 : 암호 내에 숫자가 없다.");
				}
				
				if(enCount(password, password.length()) == 0) {
					System.out.println("이유 : 암호 내에 영문자가 없다.");
				}
			} else {
				System.out.println("암호가 유효하다.");
				break;
			}
		} while(true);
		
		scan.close();
		
	}
	
	public static int numCount(String a, int num) {
		
		int cnt = 0;
		
		if(num <= 0) {
			cnt = 0;
		} else if(a.charAt(num-1) >= 49 && a.charAt(num-1) <= 57) {
				cnt = numCount(a, num-1) + 1;
		} else {
			cnt = numCount(a, num-1);
		}
		return cnt;
	}
	
	public static int enCount(String a, int num) {
		int cnt = 0;
		
		if(num <= 0) {
			cnt = 0;
		} else if(a.charAt(num-1) >= 65 && a.charAt(num-1) <= 90) {
			cnt = enCount(a, num-1) + 1;
		} else if(a.charAt(num-1) >= 97 && a.charAt(num-1) <= 122){
			cnt = enCount(a, num-1) + 1;
		} else {
			cnt = enCount(a, num-1);
		}
		return cnt;
	}
}

 

재귀 함수에서 if(num <= 0)의 조건을 따로 사용하지 않고 if(num > 0)일때 중첩 if문을 사용해서 a.charAt의 조건을 비교해 주어도 됩니다. charAt(n)은 charAt(0)부터 시작입니다. 따라서 헷갈리지 않도록 주의하셔야합니다!!

 

오류때문에 한참 애먹었네요,,ㅎㅎ

그래도 힘내봅시다!!

 

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

 

728x90
반응형