[HackerRank] Strong Password

아르당·2023년 12월 20일
0

HackerRank

목록 보기
52/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

Louise는 친구들과 연락하기 위해 소셜 네트워킹 사이트에 가입했다. 회원가입 페이지는 이름과 비밀번호를 입력하는 것을 필요했다. 그러나 비밀번호는 강력해야했다. 웹사이트는 다음 기준을 충족할 때 강력한 비밀번호라고 한다.

  • 길이는 최소 6자리이다.
  • 최소 하나의 숫자를 포함한다.
  • 최소 하나의 영어 소문자를 포함한다.
  • 최소 하나의 영어 대문자를 포함한다.
  • 최소 하나의 특수문자를 포함한다. 특수문자는 !@#$%^&*()-+이다.

그녀는 길이 n의 임의의 문자열을 입력했지만 강력한 비밀번호인지 확신하지 못했다. 그녀가 입력한 문자열이 주어졌을 때, 비밀번호를 강력하게 만들기 위해 추가 해야하는 최소 문자 수를 찾을 수 있나?

문제를 해결하기 위해 사용되는 문자
numbers = "0123456789"
lower_case = "abcdefghijklmnopqrstuvwxyz"
upper_case = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
special_characters = "!@#$%^&*()-+"

Example

password = '2bbbb'

이 비밀번호는 길이가 5인 문자열이고 대문자와 특수문자가 빠져있다. 추가해야 하는 최소 문자 수는 2이다.

password = '2bb#A'

이 비밀번호는 길이가 5인 문자열이고 각 문자 타입을 하나 이상씩 가지고 있다. 추가해야 하는 최소 문자 수는 1이다.

Function Description

minimumNumber 함수를 완성해라.
minimumNumber 함수는 아래와 같은 매개변수를 가지고 있다.

  • int n: 비밀번호의 길이
  • String password: 테스트를 위한 비밀번호

Returns

  • int: 추가해야 하는 최소 문자 수

Constraints

  • 1 <= n <= 100
  • 비밀번호의 모든 문자들은 [a-z], [A-Z], [0-9],[!@#$%^&*()-+] 안에 있다.

Solved

정규표현식을 사용해서 풀었다. 패턴에 일치하는 것을 판단하지 않고 일부만 포함되어 있는지 확인했다.

각 String에 정규표현식을 사용해서 할당했다.

String numbers = ".*[0-9].*";
String lowerCase = ".*[a-z].*";
String upperCase = ".*[A-Z].*";
String specialCharacters = ".*[!@#$%^&*()+-].*";

Pattern.matches()를 통해 포함하는지 판단하여 변수에 할당한다.

boolean isNumbers = Pattern.matches(numbers, password);
boolean isLowerCase = Pattern.matches(lowerCase, password);
boolean isUpperCase = Pattern.matches(upperCase, password);
boolean isSpecialCharacters = Pattern.matches(specialCharacters, password);

boolean 값에 따라 문자가 추가되어야 하는지 판단하고 추가 되는 문자 수를 증가시킨다.

int addCharacter = 0;

if(!isNumbers){
	addCharacter++;
}

if(!isLowerCase){
	addCharacter++;
}

if(!isUpperCase){
	addCharacter++;
}

if(!isSpecialCharacters){
	addCharacter++;
}

조건문을 통해 하나 더 판단해야한다. 기존의 문자열 길이와 추가되는 문자열의 수를 더해서 최고 길이 6을 보다 작은지 판단해서 최소 길이에 맞게 반환한다. 그렇지 않으면 추가 되는 문자 수를 반환한다.

if(password.length() + addCharacter < 6){
	return 6 - password.length();
}
        
return addCharacter;

All Code

public static int minimumNumber(int n, String password) {
	String numbers = ".*[0-9].*";
	String lowerCase = ".*[a-z].*";
	String upperCase = ".*[A-Z].*";
	String specialCharacters = ".*[!@#$%^&*()+-].*";

	boolean isNumbers = Pattern.matches(numbers, password);
	boolean isLowerCase = Pattern.matches(lowerCase, password);
	boolean isUpperCase = Pattern.matches(upperCase, password);
	boolean isSpecialCharacters = Pattern.matches(specialCharacters, password);

	int addCharacter = 0;

	if(!isNumbers){
		addCharacter++;
	}

	if(!isLowerCase){
		addCharacter++;
	}

	if(!isUpperCase){
		addCharacter++;
	}

	if(!isSpecialCharacters){
		addCharacter++;
	}

	if(password.length() + addCharacter < 6){
		return 6 - password.length();
	}

	return addCharacter;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글