[TIL #6] 알고리즘 오븐시계, 삼항연산자에서의 값 변화

안떽왕·2023년 3월 24일
0

Today I Learned

목록 보기
6/76

백준 2525번 오븐시계

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

문제

현재 시간(시, 분)을 입력받고, 오븐 작동 시간(분)을 입력 받는다. 현재 시간으로부터 오븐작동이 끝났을 때의 시각을 계산하는 프로그램을 작성하라

입력: 첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.

출력: 첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)

예제입력:
14 30
20

예제출력:
19 0

결과

datetime 내장함수에 시간계산이 가능한 줄 알고 조금 찾아봤는데 시작 년도가 필요한것 같았습니다. default로 처리하고 사용해도 될 것 같지만 이 알고리즘 문제에서 요구하는 풀이 방식은 아닌 것 같아 다른 방법으로 선회하기로 결정했습니다.

hour, min = map(int, input().split())
cook_min = int(input())
last_min = min + cook_min

if last_min >= 60:
    hour_count = 0
    while last_min >= 60:
        last_min -= 60
        hour_count += 1
    hour += hour_count

if hour >= 24:
    hour -= 24

print(hour, last_min)

먼저 hour, min변수에 현재 시간을 담아옵니다. 어제는 인풋 받아오고 나중에 형변환을 했지만 오늘은 어제 깨닫게된 map함수를 사용해 인풋과 형변환을 한번에 해결했습니다. 그리고 요리 시간을 두 번째 인풋으로 받아왔습니다.

if문을 사용해 요리 시간과 현재 분을 합친 변수 last_min이 60을 넘는 경우

while문을 사용해 last_min이 60보다 큰 동안에 반복적으로 60을 차감하고 시간 임시 저장소 hour_count를 1씩 증가 시킵니다.

반복문이 종료되면 hour에서 hour_count 더해주고 if문을 한번 더 사용해 hour가 24를 넘게되면 24를 차감하는 내용을 추가했습니다.

그 후 hourlast_min을 출력했습니다.

느낀 점

제가 작성을 하면서도 뭔가 불필요한 부분이 너무 많지 않았나? 더 줄일 수 있지 않았나? 라는 생각이 계속해서 들었습니다.

그래서 다른 분들의 코드를 찾아보기 시작했습니다.

찾아보니 대부분 datetime은 사용하지 않고 알고리즘을 해결했습니다. 한 개의 예시를 가져왔습니다.

a, b = map(int, input().split())
c = int(input())
d = a+((b+c)//60)

if d <= 23:
    if b+c <= 59:
        print(a, b+c)
    else:
        print(d,(b+c)%60)
else:
    print(d%24,(b+c)%60)

input까지는 저랑 동일하지만 그 밑에 적어놓은 코드들이 저와 상이한 편입니다. 반복문을 사용해 60씩 차감하는 저와 달리 60으로 나눈 몫과 나머지를 이용해 문제를 해결하셨습니다.

알고리즘의 풀이방법은 많다지만 저 보다 코드 수도 적고 좀 더 효율적인 코드라고 보고있습니다. 아직 배울 점이 더 많다는 것을 느끼고 다음에 유사한 알고리즘이 있다면 효율적인 수식을 작성해 풀어보고자 합니다.

삼항연산자에서의 값변화

사실 삼항연산자라고 말하는 것이 맞는건지 값변화라고 적는 것도 맞는건지 잘 모르겠습니다.

하지만 실행시켜본 결과를 적고자 이름을 지었습니다.

CASE 1

a = b = None
b = 'a'
print(a)

abNone이다. 라고 선언을 해둔 상태에서 b'a' 즉 문자열a 라고 선언했을 때 a의 값도 따라 바뀔까요?

정답은 바뀌지 않는다 입니다. None은 주소 값이 아니라 값 자체를 넣어주므로 초기값만 None으로 초기화되고 b에 넣은 값은 a에 적용되지 않습니다.

a = b = None

b = 'a'

print(id(a))
print(id(b))

# 결과값
# 140736236121288
# 140736236520840

CASE 2

a = b = []
b.append(1)
print(a)

ab[] 즉 비어있는 리스트다 라고 선언해둔 상태에서 bappend함수를 사용해 1을 집어넣으면 a는 바뀔까요?

정답은 바뀐다입니다. 저도 처음 해봤을 때 놀랐습니다. 하지만 []는 주소 값을 부여하는 것이므로 a, b가 주소 값이 같기 때문에 bappend한다는 의미는 a에도 들어간다는 의미입니다.

a = b = []
b.append(1)

print(id(a))
print(id(b))

# 출력값
# 2291804939200
# 2291804939200
profile
이제 막 개발 배우는 코린이

0개의 댓글