테스트 문제를 복습해보았다.
문제는 아래와 같다.
- 흔히들 비밀번호 만들 때 대소문자 숫자가 각각 1개씩은 포함되어 있어야 한다 등의 조건이 붙는 경우가 있습니다. 그러한 조건을 구현하세요.
- 입력값을 받으면 그 입력값 안에 대문자, 소문자 그리고 숫자가 최소한 1개씩은 포함되어 있는지
여부를 알려주는 함수를 구현하세요.
문제가 두개인 것 같지만, 사실상 하나의 문제라고 보아도 될 것같다.
1번 문제에서 대.소문자와 숫자만 확인할 수 있다면 2번 문제도 쉽게 접근할 수 있을 것이다.
먼저, 입력 값은 string 형태로 지정한다.
입력 값을 bytes 로 바꾸어서 16진수 형태로 유니코드와 비교할 수 있게 만든다.
먼저 함수안에 길이를 정의하는 length 지역변수를 선언해주고 길이를 정의해준다.
그리고, pw 라는 바이트 형태 지역변수를 선언하고 바이트형으로 변환시킨 입력 값을 담아준다.
uint length;
length = bytes(_pw).length; // 길이를 정의.
bytes memory pw = bytes(_pw); // 입력 값을 담아줌.
입력 값에 대문자 소문자 숫자가 들어가는지 아닌지 판단시킬 boolean 형태 지역변수를 선언.
bool upper;
bool lower;
bool num;
입력 값을 비교하기 전, 유니코드를 확인한다.
10진수 숫자 0~9 는 유니코드 16진수의 0x30~0x39 와 같다.
알파벳 대문자 A~Z 는 유니코드 16진수의 0x41~0x5A 와 같다.
알파벳 소문자 a~z 는 유니코드 16진수의 0x61~0x7A 와 같다.
아래와 같이 for 문과 if 문을 사용하여 입력 값을 비교한다.
for(uint i; i < length; i++){
if(pw[i] >= 0x41 && pw[i] <= 0x5A){
upper = true;
}
if(pw[i] >= 0x61 && pw[i] <= 0x7A){
lower = true;
}
if(pw[i] >= 0x30 && pw[i] <= 0x39){
num = true;
}
}
입력 값의 비교가 끝났다면 require 를 이용해서 대소문자와 숫자가 들어갔는지 확인하고 true 를 반환한다.
require(upper == true && lower == true && num == true,"Please input appropriate word.");
return true;
2번 문제라면 require 를 지우고, 마지막 return 값만 바꾸면 어떤 문자가 필요한지 알 수 있다.
return (upper, lower, num);
컨트랙트를 배포해서 확인해보면, 올바른 값을 반환하는 것을 확인할 수 있다.
0 : 대문자가 없음.
0,1,2 : 대소문자와 숫자 모두 있음.
1, 2 : 소문자와 숫자가 없음.
정리하면,
간단한 문제지만, 아래 부분이 제일 중요한 것 같다.. 배열처럼 사용할 수 있다는 것.
bytes memory pw = bytes(_pw);
pw[i]