프로그래머스 - 폰켓몬

폰켓몬 문제 바로가기 나의 풀이 def solution(nums): n_poke = len(nums) n_nums = len(set(nums)) if n_poke//2 <= n_nums: return n_poke//2 else: return n_nums CODE REVIEW 간단한 해시 문제. set()을 이용해서 종류를 구하고, (전체길이의 절반)과 비교하여 알맞게 값을 return하면 된다. collections 모듈의 Counter을 사용하면 더 편할 듯 하다.

2023-5-31 · 1 min · 46 words · Junha

백준 1463번 - 1로 만들기

백준 1463번 바로가기 나의 풀이 n = int(input()) dp = [0]*1000001 for i in range(1,n+1): dp[i] = dp[i-1] + 1 if i%2==0: dp[i] = min(dp[i],dp[i//2]+1) if i%3==0: dp[i] = min(dp[i],dp[i//3]+1) print(dp[n]-1) CODE REVIEW 문제 자체는 간단하지만 발상이 어려웠던 문제. 한번에 해결하지는 못하고, n에서 1로 내려오는 대신 1에서 n으로 접근하는 방식을 활용해보라는 힌트를 가지고 문제를 해결했다. 직접 1부터 나아가는 그래프를 그려봤는데(위의 사진 참고!) 처음에는 nums라는 dict을 만들어서 if nums in dict: pass else: nums[n]=count라는 식으로 나아갈려고 했는데, 이게 생각보다 고려할게 많아져서 포기했다. 아예 새로 코드를 짜서 문제를 해결했다. for문 안의 순서가 (+1, *2, *3) 순서인데, 3배하는 것이 최소일 확률이 높아서 그렇게 했다. index와 num을 서로 동일하게 맞추기 위해 dp = [0]*1000001으로 맞춘건 이젠 익숙하다.

2023-5-30 · 1 min · 113 words · Junha

위대한 과학 고전 30권을 1권으로 읽는 책

1장 - 과학에 푹 빠져들에 되는 재밌는 과학 명저 지동설과 천동설, 지노하론, 전자기학까지. 과학 교과서에서 접했던 여러 이론들의 배경과 뒷이야기에 대해 알 수 있었다. 튀코 브라헤의 천체 이론(Geohelicentrism = 지동설+천동설)에 대해 다루면서 만일 그가 ‘연주시차’ 관찰에 성공했더라면 그의 이론이 달라졌을수도 있다는 가능성을 내비친다. 뒤에서는 말 포퍼의 반증주의를 다루며, 반증주의가 ‘무엇이 과학인가’를 확고히 하는 동시에 오히려 반증주의 때문에 어쩌면 천동설에서 지동설로 넘어가지 못했을 수도 있다는 점을 입체적으로 보여준다. 고전과학이 발전해온 길과 그 과정에서 발생한 여러 과학,철학적 대립들이 잘 드러나있어서 역사책을 읽는 것처럼 흥미롭게 읽었다. ...

2023-5-30 · 3 min · 450 words · Junha

프로그래머스 - x만큼 간격이 있는 n개의 숫자

x만큼 간격이 있는 n개의 숫자 문제 바로가기 나의 풀이 def solution(x, n): answer = [] for i in range(n): answer.append(x*(i+1)) return answer CODE REVIEW 간단한 구현 문제. range만 잘 따져주면 된다.

2023-5-30 · 1 min · 31 words · Junha

프로그래머스 - 두 원 사이의 정수 쌍

두 원 사이의 정수 쌍 문제 바로가기 첫 번째 풀이 def solution(r1, r2): answer = 0 for i in range(-r2,r2+1): for j in range(-r2,r2+1): if r1**2 <= i**2 + j**2 <= r2**2: answer += 1 return answer 두 번째 풀이 def solution(r1, r2): answer = 0 for i in range(1,r2+1): for j in range(1,r2+1): if r1 <= (i**2 + j**2)**0.5 <= r2: answer += 1 answer = (answer + r2 - r1 + 1)*4 return answer 세 번째 풀이 from math import ceil, floor def solution(r1, r2): answer = 0 for x in range(1,r2+1): y_top = floor((r2**2-x**2)**0.5) b_bot = ceil((r1**2-x**2)**0.5) if x<=r1 else 0 answer += y_top - b_bot + 1 return answer * 4 CODE REVIEW 첫 번째 풀이에서는 일부 테스트에서 시간 초과에러가 5개에서 발생해서 실패했다. 1사분면만 구하고 4배 취해야겠다… 두 번째 풀이에서는 사분면만 먼저 계산하고 4배해주었는데 여전히 시간초과 에러가 3개 발생한다. 이중 for문이라 그런듯… 구조를 아예 바꿔야하나? 세 번째 풀이에서는 이중 for문을 피하기 위해 x값을 기준으로 최대/최소 y값을 구해서 갯수를 구했다. 결국 해결 완료! 시간 초과 쉽지 않구만 허허…

2023-5-30 · 1 min · 171 words · Junha