https://www.acmicpc.net/problem/16196
그냥 꼼꼼하게 조건을 고려해서 풀면되는 문제였다!!!! 고려할 게 많은데 자꾸 빠뜨려서.. 많이 틀렸다.
- 지역 코드 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
'즐거운 PS 👩💻🥰' 카테고리의 다른 글
[백준/파이썬] 2437: 저울 (0) | 2022.04.11 |
---|---|
[백준/파이썬] 1082: 방 번호 (0) | 2022.04.09 |
[백준-파이썬] 11279: 최대 힙 (0) | 2022.04.01 |
[백준-파이썬] 4948: 베르트랑 공준 (0) | 2022.04.01 |
[백준-파이썬] 11653: 소인수분해 (0) | 2022.04.01 |