즐거운 PS 👩‍💻🥰

[백준/파이썬] 16196: 중국 신분증 번호

dalin❤️ 2022. 4. 8. 22:48

https://www.acmicpc.net/problem/16196

 

16196번: 중국 신분증 번호

첫째 줄에 신분증 번호가 주어진다. 신분증 번호는 18자리이고, 처음 17자리는 0부터 9까지 숫자로만 이루어져 있다. 마지막 1자리는 0부터 9까지 숫자이거나 'X'이다. 둘째 줄에는 올바른 지역 코

www.acmicpc.net

그냥 꼼꼼하게 조건을 고려해서 풀면되는 문제였다!!!! 고려할 게 많은데 자꾸 빠뜨려서.. 많이 틀렸다.

- 지역 코드 6자리 -> 가능한 지역 코드를 리스트에 저장한 후 in으로 판단함

- 생일 코드 -> 년, 월, 일 따로 처리.
일을 처리할 때 그 달이 몇 일까지 있는지(30 or 31), 2월인 경우 윤년인지 체크해야 함

- 순서 코드 -> 000은 안된다. 짝수이면 여자, 홀수이면 남자

- 체크 섬 - 그냥 계산하면 된다..!
사실 처음에는 "x + A1×217 + A2×216 + A3×215 + ... + A16×22 + A17×21 ≡ 1 (mod 11)" 식이 뭔지 못 알아들었다.. ≡ 은 뭐고 (mod 11)은 뭔지...
≡은 찾아보니 위키백과에서 항등식을 뜻한다고 한다. 항등식은 또 뭐였지? 나무위키에서 항상 성립하는 식이라고 했다.
근데 왜 = 안쓰고 ≡ 인거지..? 항상 등식이라는 걸 강조하는 건가? 암튼 (x + A1×217 + A2×216 + A3×215 + ... + A16×22 + A17×21) % 11 == 1인지 체크해주라는 것 같아서 그렇게 했더니 됐다!

틀렸던 코드 👩‍💻

import sys

input = sys.stdin.readline

n = input().rstrip()
N = int(input())
area_codes = [input().rstrip() for _ in range(N)]


def sol():
    # 지역 코드 체크
    if n[:6] not in area_codes:
        return 'I'

    gender = 'X'
    # 순서 코드 체크
    if n[14:17] == '000':
        return 'I'
    elif int(n[14:17]) % 2:  # 남
        gender = 'M'
    else:  # 여
        gender = 'F'

    # 생일 코드 체크 (1900.01.01-2011.12.31 & 윤년 체크)
    year = n[6:10]
    month = n[10:12]
    date = n[12:14]

    if 1900 <= int(year) <= 2011:
        pass
    else:
        return 'I'

    if 1 <= int(month) <= 12:
        pass
    else:
        return 'I'

    # 30일까지 있는 달
    if month == '04' or month == '06' or month == '09' or month == '11':
        if 1 <= int(date) <= 30:
            pass
        else:
            return 'I'

    # 31일까지 있는 달
    if month == '01' or month == '03' or month == '05' or month == '07' or month == '08' or month == '10' or month == '12':
        if 1 <= int(date) <= 31:
            pass
        else:
            return 'I'

    # 2월
    if month == '02':
        tmp_year = int(year)
        if tmp_year % 4:
            if tmp_year % 400:  # 평년
                if 1 <= int(date) <= 28:
                    pass
                else:
                    return 'I'
            elif tmp_year % 100:  # 윤년
                if 1 <= int(date) <= 29:
                    pass
                else:
                    return 'I'

            else:  # 윤년
                if 1 <= int(date) <= 29:
                    pass
                else:
                    return 'I'

    # 체크섬 코드 계산(x는 0~10. 10이면 X)
    tmp_num = 0
    for i in range(17):
        tmp_num += (int(n[i])) * (2 ** (17 - i))

    check_sum = n[-1]
    if check_sum == 'X':
        if (10 + tmp_num) % 11 == 1:
            return gender
        else:
            return 'I'
    else:
        if (int(check_sum) + tmp_num) % 11 == 1:
            return gender
        else:
            return 'I'


print(sol())

드디어 맞은 코드 🌸

import sys

input = sys.stdin.readline

n = input().rstrip()
N = int(input())
area_codes = [input().rstrip() for _ in range(N)]


def sol():
    # 지역 코드 체크
    if n[:6] not in area_codes:
        return 'I'

    # 생일 코드 체크 (1900.01.01-2011.12.31 & 윤년 체크)
    year = n[6:10]
    month = n[10:12]
    date = n[12:14]

    if 1900 <= int(year) <= 2011:
        pass
    else:
        return 'I'

    if 1 <= int(month) <= 12:
        pass
    else:
        return 'I'

    # 30일까지 있는 달
    if month == '04' or month == '06' or month == '09' or month == '11':
        if 1 <= int(date) <= 30:
            pass
        else:
            return 'I'

    # 31일까지 있는 달
    if month == '01' or month == '03' or month == '05' or month == '07' or month == '08' or month == '10' or month == '12':
        if 1 <= int(date) <= 31:
            pass
        else:
            return 'I'

    # 2월
    if month == '02':
        tmp_year = int(year)

        if tmp_year % 400 == 0:  # 윤년
            if 1 <= int(date) <= 29:
                pass
            else:
                return 'I'
        elif tmp_year % 100 == 0:  # 평년
            if 1 <= int(date) <= 28:
                pass
            else:
                return 'I'

        elif tmp_year % 4 == 0:  # 윤년
            if 1 <= int(date) <= 29:
                pass
            else:
                return 'I'
        else:  # 평년
            if 1 <= int(date) <= 28:
                pass
            else:
                return 'I'

    # 체크섬 코드 계산(x는 0~10. 10이면 X)
    check_sum = n[17]
    if check_sum == 'X':
        check_sum_tmp = 10
    else:
        check_sum_tmp = int(check_sum)

    for i in range(17):
        check_sum_tmp += (int(n[i])) * (2 ** (17 - i))
        check_sum_tmp %= 11

    if (check_sum_tmp) % 11 == 1:
        # 순서 코드 체크
        if n[14:17] == '000':
            return 'I'
        elif int(n[14:17]) % 2:  # 남
            return 'M'
        else:  # 여
            return 'F'
    else:
        return 'I'


print(sol())
728x90