문제 풀이를 했던 Python 100 문제 중,
코드의 효율성과 가독성을 개선할 필요성이 있는 두 가지 문제를 선정하여,
기존 코드와 이를 보완한 새로운 코드에 대한 각각의 설명을 작성하였다.
문제 1 - 24
이 코드는 현재 시간과 임무 시작 시간 간의 차이를 계산하여,
남은 시간을 시, 분, 초 형식으로 출력하는 코드이다.
# 현재 시간 입력
current_time = input().split(':')
current_hour = int(current_time[0])
current_minute = int(current_time[1])
current_second = int(current_time[2])
# 임무 시작 시간 입력
start_time = input().split(':')
start_hour = int(start_time[0])
start_minute = int(start_time[1])
start_second = int(start_time[2])
# 현재 시간
current_seconds = current_hour * 3600 + current_minute * 60 + current_second
# 임무 시작 시간
start_seconds = start_hour * 3600 + start_minute * 60 + start_second
# 남은 시간 계산
remaining_seconds = (start_seconds + 86400 - current_seconds) % 86400
# 남은 시간을 시, 분, 초로 변환
remaining_hour = remaining_seconds // 3600
remaining_minute = (remaining_seconds % 3600) // 60
remaining_second = remaining_seconds % 60
print('{:02d}:{:02d}:{:02d}'.format(remaining_hour, remaining_minute, remaining_second))
1. 이 코드는 먼저 두 줄의 입력을 받으며, 입력된 두 줄은 모두 콜론 (:) 구분자로 분리된다.
2. 계산을 단순화하기 위해, 현재 시간과 시작 시간을 총 '초'로 변환하였다.
3. 임무의 남은 시간은, 시작 시간에 하루의 총 초 수를 추가한 다음, 현재 시간을 뺌으로써 계산된다.
이것은 임무 시작 시간이 (현재 시간보다) 나중인 경우를 고려한다. (즉, 임무가 다음 날에 시작됨)
4. 남은 초는 다시 시간, 분 및 초로 변환된 뒤, 남은 시간이
"HH:MM:SS" 형식으로 문자열 서식화되어 출력된다.
보완된 버전
def seconds(time_str): # 시간 입력 받기 함수 (map 사용)
hours, minutes, seconds = map(int, time_str.split(':'))
return hours * 3600 + minutes * 60 + seconds
# 시간 출력 함수
def format_time(seconds):
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60
return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
current_time = input()
start_time = input()
# 시간들을 초 단위로 변환
current_seconds = seconds(current_time)
start_seconds = seconds(start_time)
# 남은 시간 계산 (24시간을 기준으로 순환)
remaining_seconds = start_seconds - current_seconds
# 남은 시간이 음수이면 하루를 더해 양수로 만듦
if remaining_seconds < 0:
remaining_seconds += 86400
print(format_time(remaining_seconds))
1. seconds 함수는 map 함수를 사용하여 입력된 시간을 초로 변환합니다.
2. remaining_seconds가 음수일 경우, 그 값에 하루(86400초)를 더해 양수로 만든다.
문제 2 - 피보나치 수 2
피보나치 수열은 이전 두 개의 항을 더해서 구하는 규칙을 가지고 있다.
이를 재귀적으로 구현한 코드이다.
효율적인 알고리즘을 위해 중복되는 계산을 피했으며,
아래는 반복적인 방식으로 피보나치 수열을 구하는 함수이다.
N = int(input())
# 0, 1, 1, 2, 3, 5, 8...
def fibonacci(n):
# 피보나치 수 리스트 생성
fi= [0, 1]
# n = 0 또는 1일 때, 각각 0과 1을 반환
if n == 0:
return 0
elif n == 1:
return 1
# 피보나치 수 계산
for i in range(2, N + 1):
fi.append(fi[i - 1] + fi[i - 2])
return fi[N]
# 피보나치 수 출력
print(fibonacci(N))
1. 리스트 fi 를 사용하여 각 피보나치 수를 계산한다.
2. 초기값으로 fi 에 0, 1을 넣어주고, 반복문을 통해
n 번째까지의 피보나치 수를 계산하여 리스트에 저장한다.
3. 마지막으로 리스트에서 n번째 값을 반환하고, 주어진 숫자 n 에 해당하는 피보나치 수를 출력한다.
보완된 버전
N = int(input())
# 피보나치 수열의 N번째 항을 계산하는 함수
def fibonacci(N):
if N == 0:
return 0
elif N == 1:
return 1
# 피보나치 수열의 첫 두 항 초기화
a, b = 0, 1
# 2부터 N까지 반복하여 피보나치 수 계산
for _ in range(2, N + 1):
# a는 이전 항, b는 현재 항
a, b = b, a + b
# N번째 피보나치 수 반환
return b
print(fibonacci(N))
1. 리스트의 append 메서드를 사용하지 않고,
if 문과 for 문만을 활용하여 코드를 작성하였다.