if문 문제들 중 2525와 2480은 가독성을 높이는 코딩과 동시에 좀 더 창의적인 코딩을 연습하게 해줬다. 역시 문제를 계속 풀어봐야 그 다음엔 더 쉽고 다양하게 생각할 수 있다.
📍In a nutshell...
+=
, -=
,list
,set
)#2525번
시간(시간, 분)을 입력하고 두 번째 줄에 요리 시간(분 단위)을 입력하면, 완성 시간을 출력하는 문제다. 단, 23시 59분이 지나면 시계는 다시 0시 0분이 된다.
처음에 풀었을 때는 아주 단순하게, 입력 시간(분)+요리 시간 기준으로 if문의 case를 나누어 작성했다.
h,m = map(int,input().split())
gap = int(input())
sum = m+gap #분 끼리 add
if sum >=60: #sum이 60분을 넘긴 경우
if (h+(sum//60)) <24: #h + sum < 24인 경우 그대로 출력
print("{0} {1}" .format((h+(sum//60)),sum%60))
else: #h + sum >=24인 경우 0부터 다시 count
print("{0} {1}" .format((h+(sum//60))-24,sum%60))
else: #sum이 60분을 넘기지 않은 경우
print("{0} {1}" .format(h, sum)) #h는 그대로, m->sum으로 대체
그런데 쓰고 나서 보니 약간 길어서 좀 더 단순한 방법이 없을까 찾아보던 중 +=
,-=
을 활용한 코드를 발견했고, 여기에서 힌트를 크게 얻었다. 지금까지 if문이나 while문에서 계속 +/-1 로만 사용하다보니 요리 시간을 반영한 입력값을 구할 수 있다는 것을 생각하지 못했다.
그리고 또 한 가지 point는, 내가 기존에 복잡한 계산식을 if문에 바로 넣은 것이 아니라, 변수에 담아 더 간결하게 보여준다는 점이었다.
h,m=map(int, input().split())
gap = int(input())
h += gap//60 #h = h + 추가 시간(gap/60의 몫)
m += gap%60 #m = m + 추가 분(gap/60의 나머지)
if m >= 60: #업데이트된 m값이 60 이상인 경우
h += 1 #h에 다시 한번 추가 1시간
m -= 60 #h에 1시간이 추가되었으므로, 1시간 뺀 나머지 분 계산
#아래 if문은 시간(h) 최종 표기에 대한 것으로, 가장 마지막에 와야 한다
if h>=24: #업데이트된 h값이 24 이상인 경우
h -= 24 #24를 빼 0부터 시작하도록 리셋
print(h,m)
또 한 가지 버전은, 아예 분 단위로 통일해서 한번에 계산하는 방법이다. 가독성도 좋고, 런타임도 더 줄어든다.
h,m=map(int, input().split())
gap = int(input())
sum = h*60+m #분 단위로 환산 후, sum에 대입
sum += gap #sum 업데이트
if sum >= 1440: sum -= 1440 #24시간(1440분) 넘긴 경우 0시로 리셋
print("%d %d" %(sum//60,sum%60)) #시간 = 60으로 나눈 몫, 분 = 60으로 나눈 나머지
#2480번
주사위 3개를 던져서 3개 숫자 모두 같을 경우/2개만 같을 경우/다 다를 경우 다른 액수의 상금을 계산해서 주는 프로그램이다.
나는 입력값을 a,b,c로 받고 이 중 a를 기준으로 세워 차례대로 비교하는 방식을 사용했다.
a,b,c=map(int,input().split())
if a==b==c: #a,b,c가 모두 같을 경우
print(10000+a*1000)
else: #a=b=c를 제외한 모든 나머지 경우
if a==b or a==c: #a=b이거나, a=c인 경우
print(1000+a*100)
elif b==c: #b=c인 경우
print(1000+b*100)
else: #a,b,c 모두 다른 경우
print(max(a,b,c)*100)
추가로, list
와 set
의 특징을 활용해서 구하는 방법을 알았다. list
는 중복이 가능하지만 set
은 중복이 불가능하다. 그래서 자료형을 set
으로 바꾸면 중복 숫자가 제거된다.
x =list(map(int,input().split())) #입력값을 list형태로 만들어 x에 담는다
lst = list(set(x)) #list형태의 x를 다시 set으로 만들어서 중복 숫자 제거 후, list형태로 재반환한다
#(이것 때문에 위에서 먼저 list형태로 기본 설정을 해야 한다. 그렇지 않으면 오류가 뜬다.)
#(그리고 if문에서 변수 x를 가지고 조건을 만들어야 하기 때문에 list형이어야 한다.)
if len(lst) ==1: #3개 모두 같은 숫자여서 중복 제거 후 1개만 남은 경우
print(10000+lst[0]*1000)
elif len(lst) ==2: #3개 중 2개만 같은 숫자여서 최종 2개가 남은 경우
for i in lst:
if x.count(i)==2: #필터 전 총 개수가 2개였던 숫자의 경우
print(1000+i*100)
elif len(lst) ==3: #3개 모두 다른 숫자여서 중복 제거 후 3개 그대로 남은 경우
print(max(lst)*100)
문제 출처: 백준