백준 10101번 - 삼각형 외우기

백준 10101번 바로가기 나의 풀이 angle = [] for _ in range(3): angle.append(int(input())) if sum(angle) != 180: print('Error') else: if len(set(angle)) == 1: print('Equilateral') elif len(set(angle)) == 2: print('Isosceles') else: print('Scalene') 고수의 풀이 print(['Error','Equilateral','Isosceles','Scalene'][(sum(c:=[*map(int,open(0))])==180)*len({*c})]) 출처 CODE REVIEW 위 코드 모두 논리는 같다. 1) 세각의 합이 180도인지 확인 2) 각 list를 set로 바꿔서 길이에 따라 정삼각형/이등변삼각형/일반삼각형 구분하기! 다만 고수의 풀이에서 볼 수 있듯이 if else 조건문을 압축해서 한 줄로 표현할 수도 있긴 하다. print(['a','b','c','d'][@])라고 할 때 @에 들어가는게 False이면 0번째 요소, True이면 1번째 요소, True*n이면 n번째 요소를 출력해준다. 이를 이용하면 간단하게 식이 바뀐다. 굳이 필요없어보이기도 하지만 if else 조건문 분기가 많아지게 되면 써먹을만 할 것 같다.

2023-5-15 · 1 min · 105 words · Junha

백준 5073번 - 삼각형과 세 변

백준 5073번 바로가기 백준 10101번과 매우 유사한 문제. 1) 입력의 형태, 2) 변이 주어진다는 점을 제외하면 풀이가 동일하다. 나의 풀이 import sys for s in sys.stdin: if s == '0 0 0\n': break else: s=[int(i) for i in s.split()] if max(s) >= sum(s) - max(s): print('Invalid') else: print(['','Equilateral','Isosceles','Scalene'][True*len(set(s))]) 고수의 풀이 for i in[*open(0)][:-1]:a,b,c=sorted(map(int,i.split()));print(['Invalid','Equilateral','Isosceles','Scalene'][(a+b>c)*len({a,b,c})]) 출처 CODE REVIEW 위 코드 모두 논리는 같다. 1) 삼각형의 결정조건 확인 2) 각 list를 set로 바꿔서 변에 따라 정삼각형/이등변삼각형/일반삼각형 구분하기! if else 조건문을 압축해서 한 줄로 표현했다. print(['a','b','c','d'][@])라고 할 때 @에 들어가는게 False이면 0번째 요소, True이면 1번째 요소, True*n이면 n번째 요소를 출력해준다. True자리에 삼각형 결정조건을 넣었으면 더 깔끔한 코드가 되었을 것 같다.

2023-5-15 · 1 min · 106 words · Junha

백준 10798번 - 세로읽기

백준 10798번 바로가기 나의 풀이 ipt = [] for _ in range(5): ipt.append(list(input())) ans=[] for i in range(80): try: ans.append(ipt[i%5].pop(0)) except: pass print(*ans, sep='') CODE REVIEW 먼저 input을 받아서 list 안의 list 형태로 놓고, for 문을 돌리면서 하나씩 pop()으로 빼내는 방식을 택했다. ans list에 들어있는 요소들을 깔끔하게 출력하기 위해 print(*ans, sep='')로 해결했다. 다른 코드들의 경우 이중 for문을 돌려서 input을 받고, 조건에 따라 문자열에 추가하는 방식이었는데 가독성이 아무래도 떨어지는건 사실이다. 그래서 메모리를 더 사용하더라도 난 list의 pop()기능을 활용하는걸 선호하는 편이다!

2023-5-14 · 1 min · 79 words · Junha

백준 11005번 - 진법 전환(2)

백준 11005번 문제 바로가기 내 제출 num, base = map(int, input().split()) def convert(num, base): ref = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' q, r = divmod(num, base) return convert(q, base) + ref[r] if q else ref[r] print(convert(num, base)) 고수의 풀이 n,b=map(int,input().split()) r='' while n>0: n,m=divmod(n,b) if m>9:m=chr(m+55) r+=str(m) print(r[::-1]) CODE REVIEW divmod() 함수를 사용하면 몫(q)와 나머지(r)을 쉽게 구할 수 있다. 재귀함수를 이용해서 몫(q)이 존재하면 다시 convert()에 넣어서 n진법 각 자리를 찾아나간다. base을 거듭제곱해가면서 범위 설정하고 빼는 방식도 있겠지만, 매우 번거롭고 시간도 오래 걸린다. 고수의 풀이를 보면 chr() 함수를 볼 수 있는데, 이는 아스키코드 변환 함수로 ref 없이도 r에 해당하는 문자를 구할 수 있게 해준다.

2023-5-14 · 1 min · 99 words · Junha

백준 11050번 - 이항 계수 1

백준 11050번 바로가기 나의 풀이 n, k = map(int, input().split()) ans = 1 for i in range(k): ans *= (n-i) ans /= (k-i) print(round(ans)) python 내장 math 라이브러리 comb() 함수 사용하기 import math print(math.comb(*map(int,input().split()))) 출처 CODE REVIEW python 내장 라이브러리 math에 있는 comb() 함수를 이용하면 바로 combination을 구할 수 있지만, 이번에는 구현해보기로 했다. 이항정리에 대한 내용은 위키를 참고! 처음에 round() 대신에 int()로 변환했을 때에는 정답률 50%에서 실패했는데 원인을 살펴보니 곱하고 나누는 과정에서 55.9999999… 처럼 소수 끝자리가 잘리는 경우에 오류가 발생했다. 따라서 round()을 사용해서 그러한 오류를 제거해줘야한다. 이런 문제는 factorial() 함수 만들어 $(n)!\over (r)!(n-r)!$을 계산하면 발생하지 않는 오류이기도 하다. 반례 입력: 8 3, 출력: 55, 정답: 56 -> int로 변환할 때 오류 생김.

2023-5-14 · 1 min · 112 words · Junha