[Javascript] 주민번호 유효성 검사

Beom J·2021년 4월 22일
0

Javascript

목록 보기
2/5

심연의 알고리즘

오늘 국비 수업은 JS로 함수, 생성자 만들기, 다양한 내장함수 써보기 위주였다.
수업 중 점점 스스로 코드 짜보는 시간이 늘어나고 있는데,
다 풀고나면 자존감이 수직 상승하다가도, 어 이게 아닌데 싶어서 쌤 답을 참고하거나 구글링을 하는 순간 머리위에 alert('나는 쓰레기야!!!'); 가 야동사이트 팝업창마냥 뜨는 것이 아니겠어요? ^^

쌤은 우선 의도한 결과가 출력되는 것의 의의를 두고, 지금 단계에선 알고리즘에 집착하지 말라고 하셨지만.... 사랑은 원래 어느정도의 집착이 필요한 것 아니겠습니까, 선생님.
제가 코딩으로 가계 재정에 이바지하려면 사랑을 좀 해야할 것 같아서요.....낭만적이죠?

오늘 스스로 코딩해보기는

  • Math.random()으로 로또 번호 생성기 만들기
  • substring(),toUpperCase(),split()...등 문자열 함수로 영어 첫글자만 대문자 만들기
  • 주민번호 유효성 검사하기

이렇게 세가지 셀프 코딩 시간이 있었다.
그 중에서 주민번호 유효성 검사가 가장 마지막 순서였고, 나름 제일 복잡...? 했었던 것 같았구요, 오늘 배운거 여러가지 짬뽕 해봤던 과제기 때문에~ 오늘의 코딩 일기 주제로 선정하였습니다 (빠밤!)

주민번호 유효성 알고리즘은 아래 링크를 참조했다 👇
https://blog.naver.com/tgjo0/30068496396


주민번호 유효성 검사 코드 : ver.혜자

const strJumin = '******-*******';

        const jumin = (strJumin) => {
            let total = 0;
            const jumin = strJumin.replace('-', '').split('');
            const lastNum = parseInt(jumin[jumin.length - 1]);
            for (let i = 0; i < jumin.length; i++) {
                if (0 <= i && i < 8) {
                    total += parseInt(jumin[i]) * (i+2);
                } else if (7 < i && i < 12) {
                    total += parseInt(jumin[i]) * (i-6);
                  } else {
                    continue;
                }
            }
            const checkNum = (11 - (total % 11)) % 10;
            return lastNum == checkNum ? '유효한 주민번호 입니다.' : '유효하지 않은 주민번호 입니다.'
        }

        console.log(jumin(strJumin));

선생님은... 코드가 한참 길어져도 좋으니 알고리즘에 집착하지 말라고 하셨지만! 학창시절 못해본 반항 지금 한번 해볼게요 쌤! 곧 죽어도 함수로 만들고 싶은데 어떡하나요!!!!! ㅠㅠ

과제 조건은 :

  • '-' 를 포함한 주민번호 13자리가 유효한 주민번호인지 검사 결과 반환하기

해결 과정 :

  • '-'를 포함한 stiring이니까, '-'를 날려버린 후 숫자들을 배열로 저장한다.
  • 각 인덱스에 담긴 숫자들을 알고리즘에 맞게 처리해서 checkNum에 저장한다.
  • 주민번호 끝자리인 lastNumcheckNum의 값이 동일하면 true, 아니면false를 반환.

그리고 아래는 내 코드를 보고 풍마가 조금 더 손봐준 코드


주민번호 유효성 검사 코드 : ver.풍마+쌤

// 객체로 만드는 방법
        const Jumin = function (strJumin) {
            this.strJumin = strJumin;
            this.checkJumin = () => {
                let jumin = this.strJumin.replace('-', '').split('');
                const bits = [2,3,4,5,6,7,8,9,2,3,4,5];
                let sum = 0;
                for (let i =0; i<bits.length; i++){
                    sum += Number(jumin[i])*bits[i];
                }
                let lastNum = Number(jumin[jumin.length-1]);
                let resultNum = (11-(sum%11))%10;

                return lastNum == resultNum ? '유효한 주민번호' : '유효하지 않은 주민번호';
            }
        }

풍마가 짜면서 알려준 코드를 짜면서 생각할 부분:

  • 남들이 보기에 깔끔하고 한눈에 이해하기 쉬워야 한다.
    for (let i = 0; i < jumin.length; i++) {
      if (0 <= i && i < 8) {
        total += parseInt(jumin[i] * (i+2));
      } else if (7 < i && i < 12) {
        total += parseInt(jumin[i]) * (i-6);
      } else {
        continue;
      }
    }

👆 이 부분을
👇 이렇게 변경함으로써

	const bits = [2,3,4,5,6,7,8,9,2,3,4,5];
		let sum = 0;
		for (let i =0; i<bits.length; i++){
 			 sum += Number(jumin[i])*bits[i];
        }
  • 코드를 보는 사람이 i의 범위를 한참 생각해보지 않아도 바로 이해하기 쉬워짐
  • 코드가 눈으로 보기에도 깔끔해짐
  • if~else가 아니라 배열로 중복을 제거하고 sum의 수식을 빨리 파악하게 함

이걸 Clean Code 라고 한다는데~~~ 나름 머리를 굴려서 짠다고 한 코드인데도 고칠점이 수두룩이쥬? ㅎㅎ 아가... 배움엔 끝이 없단다..


마무리

일단 오늘 공부 일기는 여기까지!
배웠던 내장 함수 중에 잘 이해가 안가는 부분이랑,

  • for in, for each, for of의 차이점
  • substring(), substr(), slice() 의 차이점
  • 세가지 생성자 만드는 법 & 차이점

을 따로 더 공부해둬야겠어요~~

profile
네..? 개발자요...? 아....직 일걸요...?

0개의 댓글