[멋쟁이 사자처럼 블록체인 스쿨 3기] 23-06-06

임형석·2023년 6월 6일
0

Solidity


Test

테스트 문제를 복습해보았다.

문제는 아래와 같다.

  1. 흔히들 비밀번호 만들 때 대소문자 숫자가 각각 1개씩은 포함되어 있어야 한다 등의 조건이 붙는 경우가 있습니다. 그러한 조건을 구현하세요.
  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 : 소문자와 숫자가 없음.


정리하면,

  1. 입력 값 string => bytes 변환.
  2. bytes 배열에 넣어서 입력 값 문자 하나하나를 위의 유니코드로 비교.
  3. 비교해서 입력 값에 대문자, 소문자, 숫자가 각각 하나씩 들어가 있다면 true 를 반환.

간단한 문제지만, 아래 부분이 제일 중요한 것 같다.. 배열처럼 사용할 수 있다는 것.

bytes memory pw = bytes(_pw);

pw[i]

0개의 댓글