[python 기초] 백준: if문(2525, 2480) /증감식, list와 set을 활용한 필터링

EMMA·2022년 2월 14일
0

[python] 백준 시리즈

목록 보기
2/14
post-thumbnail

백준 if문 set중에서 내가 가장 큰 깨달음(!)을 얻은 문제들을 정리했다.

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)

추가로, listset 의 특징을 활용해서 구하는 방법을 알았다. 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)




문제 출처: 백준

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글