22.02.20 백준 4659번

김민혁·2022년 2월 20일
0

하루한문제

목록 보기
12/22

문제

첫번째 제출한 답

import java.util.Scanner;

public class Main {
	
	public boolean f1(String pwd) {
		char[] arr_vowels = {'a','e','i','o','u'};
		int cnt_vowel = 0;
		for (int i = 0; i < pwd.length(); i++) {
			for (int j = 0; j < arr_vowels.length; j++) {
				if(pwd.charAt(i) == arr_vowels[j]) {
					cnt_vowel++;
				}
			}
		}
		if(cnt_vowel==0) {
			return false;
		}
		return true;
	}
	
	public boolean f2(String pwd) {
		char[] arr_vowels = {'a','e','i','o','u'};
		for (int i = 0; i < pwd.length(); i++) {
			for (int j = 0; j < arr_vowels.length; j++) {
				if(pwd.charAt(i) == arr_vowels[j]) {
					pwd = pwd.replace(String.valueOf(pwd.charAt(i)), "*");
				}
			}
			for (int j = 0; j < arr_vowels.length; j++) {
				if(pwd.charAt(i) != '*') {
					pwd = pwd.replace(String.valueOf(pwd.charAt(i)), "#");
				}
			}
		}
		for (int i = 0; i < pwd.length()-2; i++) {
			if(pwd.charAt(i)==pwd.charAt(i+1)&&pwd.charAt(i)==pwd.charAt(i+2)) {
				return false;
			}
		}
		return true;
	}
	
	
	public boolean f3(String pwd) {
		for (int i = 0; i < pwd.length()-1; i++) {
			if(pwd.charAt(i)==pwd.charAt(i+1)&&(pwd.charAt(i)!='e'&&pwd.charAt(i)!='o')) {
				return false;	
			}
		}
		return true;
	}
	
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Main b = new Main();
		boolean[] arr_bool = new boolean[3];
		
		
		while(true) {
			String pwd = sc.next();
			if(pwd.equals("end")) break;
			
			arr_bool[0] = b.f1(pwd);
			arr_bool[1] = b.f2(pwd);
			arr_bool[2] = b.f3(pwd);
			
			if(arr_bool[0]&&arr_bool[1]&&arr_bool[2]) {
				System.out.printf("<%s> is acceptable.\n",pwd);
			} else {
				System.out.printf("<%s> is not acceptable.\n",pwd);
			}
			
		}
	}
}

접근방식 -> 3개의 비밀번호 조건을 검사하는 메소드(return boolean)를 만들어서 3개가 모두 true 일때, 아닐때 나눠서 결과출력

1. 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다. -> f1()
모든 모음을 포함하는 char[]를 만들어 놓고 for문과 charAt()로 모음의 갯수를 체크한다. 모음의갯수가 0이면 false, 아니면 true 리턴

2. 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다 ->f2()
모음을 * 나머지를 #으로 바꿔서 연속으로 3개 같은 문자(*** or ###)가 오면 false, 아니면 true 리턴

3. 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다. ->f3()

같은문자가 두번 연속으로 올때 && 문자가 'e'와 'o'가 아닐때
=>
(pwd.charAt(i)==pwd.charAt(i+1)) && (pwd.charAt(i)!='e'&&pwd.charAt(i)!='o'))

false리턴 아니면 true 리턴

결과 -> 정답

profile
안녕하세요 김민혁입니다.

0개의 댓글