상세 컨텐츠

본문 제목

주민등록번호 분석기

어금니 주의! 프로그래밍/파이썬

by 문과생 노랑연필 2020. 4. 20. 16:49

본문

학교에서 입학 수업으로 파이썬을 가르쳐 주었다. 전문적인 것은 아니고 아주 기본적인 명령어셋만 가르쳐 주었다. 오래전부터 프로그래밍에 관심이 있었고, 한번 도전해보고 싶었지만, 선뜻 도전하지 못했었다. 따라서 이번에 학교에서 가르쳐준다고 했을 때 내심 기대가 됐다.

 

파이썬은 대체로 쉬웠다. 교수님이 자꾸 중간단계를 빼먹으시고 활용을 하셔서 조금 불편하긴 했지만, 구글에 들어가서 찾아보면 되니 딱히 어려운 부분은 없었다. 오히려 구글에서 찾아보는 편이 다양한 방법과 예시를 볼 수 있어서 좋았다. 그렇게 강의를 보던 도중, 생일 (YYMMDD형식의 6자리 숫자)을 입력하면 연도와 월, 일을 분리하는 예제를 보여주시고 만들어보라고 하셨다. 그때 나는 문득 '이렇게 시시한 거 말고 주민등록번호 분석기를 만들어보면 어떨까?'라는 생각이 들어서 나의 짧은 파이썬 지식과 구글의 도움을 받아 간단한 프로그램을 짜봤다. 물론 스파게티 코드라서 파이썬을 배운 사람이라면 뒷목을 잡고 쓰러질 것이다. (왜냐면 이게 헬로 월드를 제외하고 첫 파이썬 프로그램이거든...ㅎ)

 

다음은 내가 작성한 코드이다:

id = input("주민등록번호를 입력하십시오: ")

yy = str(id[0:2])
mm = str(id[2:4])
dd = str(id[4:6])
cen = str(id[7])
usc = str(id[-7:])

if (int(cen) % 2) == 0:
    gen = "f"
else:
    gen = "m"

if mm > "12":
    print("오류: 올바르지 않은 생년월일입니다.")

if dd > "31":
    print("오류: 올바르지 않은 생년월일입니다.")

if cen <= "2":
        print("생년월일: 19" + yy + "년" + mm + "월" + dd + "일")

if cen >= "3":
    if cen <= "4":
        print("생년월일: 20" + yy + "년" + mm + "월" + dd + "일")

if cen >= "5":
    if cen <= "6":
        print("생년월일: 21" + yy + "년" + mm + "월" + dd + "일")

if cen >= "7":
    if cen <= "8":
        print("생년월일: 22" + yy + "년" + mm + "월" + dd + "일")
    else:
        print("오류: 올바르지 않은 주민등록번호입니다.")


print("주민등록번호: " + usc)

if gen == "f":
    print("성별: 여성")
elif gen == "m":
    print("성별: 남성")

 

먼저 입력형식은 YYMMDD-GXXXXXX이다. (YY: 년, MM: 월, DD: 일, G: 성별, X: 번호)

 

아직 내 프로그램은 매우 멍청해서 대시("-")를 빠뜨리거나 글자 수가 다르면 오류를 마구 뿜어낸다. 즉 오류검증 코드가 포함돼있지 않다.

 

id = input("주민등록번호를 입력하십시오: ")

먼저 input() 함수를 사용해 사용자가 주민등록번호를 입력할 수 있도록 하였다.

 

yy = str(id[0:2])
mm = str(id[2:4])
dd = str(id[4:6])
cen = str(id[7])
usc = str(id[-7:])

그다음 (이름은 모르겠지만) id[a:b]를 통해 id라는 변수에서 a번째 문자에서 b번째 문자 이전의 문자를 떼어내는 기능을 통해 주민등록번호를 조각내었다. 참고로 파이썬에서 첫 번째 자리는 0인 듯하다. 교수님께서 이를 언급하지 않으셔서 문제를 파악하는데 꽤나 어려움(?)이 있었다.

 

파이썬의 데이터 종류에는 정수(integer), 실수(float-point), 문자열(string) 등이 있다. 자세한 정보는 아래링크에서 확인할 수 있다.

https://snscrawler.wordpress.com/2017/06/26/2-%EB%B3%80%EC%88%98variable%EC%99%80-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%ED%98%95data-type-%EC%B2%98%EB%A6%AC/

 

2. 변수(variable)와 파이썬 자료형(data type) 처리

컴퓨터로 어떠한 일을 수행하려면 데이터를 입력 받아야 한다. 이러한 데이터는 숫자나 문자, 때로는 여러 개의 데이터 조합일 수 있다. 이렇게 입력 받은 데이터는 어딘가에 저장해 놓고 필요한 경우에 읽어 오거나 수정할 수 있어야 한다. 프로그래밍에 있어서 이렇게 데이터를 저장해 놓을 수 있는 공간(메모리의 일정 구역)을 할당하고 특별한 이름을 부여하는 …

snscrawler.wordpress.com

이때 input 함수를 통해 입력된 변수의 종류가 string이 아니라 float이라서 꽤나 고생을 했다. (지금은 재현을 해보려고 해도 재현이 안된다... 도대체 왜지?) 따라서 floar형식을 string형식으로 변환해 주기 위해서 str()을 붙였다.

 

그다음에 성별을 구하기 위해 주민등록번호의 7번째 숫자(G부분)를 2로 나누어 보았다. 주민등록번호의 7번째 숫자의 경우 여성의 경우는 짝수, 남성의 경우는 홀수이기 때문이다. 또한 2000년 전에 태어난 사람의 7번째 숫자는 1 또는 2이고, 2000년 이후에 태어난 사람은 3 또는 4이다. 따라서 우리는 7번째 숫자(G)를 통해 성별뿐만 아니라 태어난 세기 또한 알 수 있다.

 

요약하자면 이렇다:

1: 1900년~1999년에 태어난 남성

2: 1900년~1999년에 태어난 여성

3: 2000년 이후에 태어난 남성

4: 2000년 이후에 태어난 여성

...

 

따라서 나는 다음과 같은 코드를 통해 성별을 구했다:

if (int(cen) % 2) == 0:
    gen = "f"
else:
    gen = "m"

이때 또 데이터 형식이 나를 괴롭혔다. 이번에는 str을 나눌 수 없어서 int()함수를 통해 정수(integer)로 변환했다. 그다음 2로 나눈 '나머지'가 0이면 (즉, 짝수이면) 여성, 그렇지 않으면 남성으로 분류를 했다.

 

 

그리고 다음의 코드를 통해 태어난 시기를 구분했다:

if cen <= "2":
        print("생년월일: 19" + yy + "년" + mm + "월" + dd + "일")

if cen >= "3":
    if cen <= "4":
        print("생년월일: 20" + yy + "년" + mm + "월" + dd + "일")

if cen >= "5":
    if cen <= "6":
        print("생년월일: 21" + yy + "년" + mm + "월" + dd + "일")

if cen >= "7":
    if cen <= "8":
        print("생년월일: 22" + yy + "년" + mm + "월" + dd + "일")
    else:
        print("오류: 올바르지 않은 주민등록번호입니다.")

G값(변수는 cen)이 2보다 작으면 1900(현실적으로 주민등록번호 체계 특성상 G가 음수가 될 수 없으니 G는 항상 0이상을 유지할 것이다.), 5~6은 (아직 태어나지 않은) 2100년대, 7~8은 2200년대, 그 이상은 의미가 없어서 pass~

(만약에 올바르지 않은 주민등록번호라고 출력되는 사람이 있다면 꼭! 만나보고 싶다. 물어보고 싶은 것이 한두가지가 아니다. 생활상, 알려지지 않은 역사, 기술 등)

 

여기서 <=는 작거나 같음(이하)를 뜻하며, >=는 크거나 같음(이상)을 뜻한다. 

 

print("주민등록번호: " + usc)

if gen == "f":
    print("성별: 여성")
elif gen == "m":
    print("성별: 남성")

나머지는 쉽다. 주민등록번호 란은 사용자가 입력한 원래 값을 그대로 출력하고, 성별의 경우는 위에서 계산한 결과를 그대로 출력하면 된다.

 

일단 몇번 테스트를 한 결과 입력 형식을 제대로 지킨다는 전제 하에 납득할 수 있는 결과가 나왔다.

IDE화면과 IDE내 콘솔의 출력 결과

... 뭐 첫 프로그래밍 프로젝트 치고는 나쁘지 않지 않을까? 물론 (쓰레기 쉘 언어인) 윈도의 배치파일을 가지고 몇 가지 간단한 스크립트를 만들어 본 적은 있으나, 제대로 된 프로그래밍 언어는 이번이 처음이다. 많은 노력을 했으나, 역시 제대로 배우지 않은 상태로 만드니 코드가 꼬이는 것 같다... 잘못된 부분이나 개선사항이 있으면 댓글란에 지적을 해주셨으면 좋겠습니다.

 

미흡하지만 제대로된 첫 포스트 읽어주셔서 감사합니다!

댓글 영역