파이썬 알고리즘 : 다음 큰 숫자

2023년 12월 05일 알고리즘 문제풀이 문제 다음 큰 숫자 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 def solution(n): num = str(bin(n)[2:]) cnt = num.count('1') while True: n += 1 tmp = str(bin(n)[2:]) if tmp.count('1') == cnt: break answer = n return answer 생각보다 쉬웠다. 기수법 관련해서는 문자열로 처리하는 경우가 꽤 많이 나오는 것 같다. ...

2023년 12월 5일 · 1 분 · 배준수

파이썬 알고리즘 : 개인정보 수집 유효기간

2023년 12월 04일 알고리즘 문제풀이 문제 개인정보 수집 유효기간 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 def solution(today, terms, privacies): answer = [] today_y, today_m, today_d = today.split('.') today_y = int(today_y) today_m = int(today_m) today_d = int(today_d) def check(y,m,d,t): ans = True m += t while m > 12: y += 1 m -= 12 if y > today_y: ans = False elif y == today_y: if m > today_m: ans = False elif m == today_m: if d > today_d: ans = False return ans arr = dict() for x in terms: term_type, term_months = x.split() arr[term_type] = int(term_months) for i in range(len(privacies)): privacy_date, privacy_type = privacies[i].split() privacy_y, privacy_m, privacy_d = privacy_date.split('.') tmp = check(int(privacy_y),int(privacy_m),int(privacy_d),arr[privacy_type]) if tmp: answer.append(i+1) return answer 기존에는 check() 함수 내의 while문이 존재하지 않았고, if 문을 통해 한번만 로직을 거치도록 했다. 하지만 유효기간이 2년 이상 된다면 12를 여러번 빼서 해를 몇번 넘겨야 할 수도 있기 때문에, 반복문이 필요했다. 유효기간을 더해봤자 2년 이하 일 것이라고 생각한 것이 실수였다. ...

2023년 12월 4일 · 1 분 · 배준수

파이썬 알고리즘 : 가장 큰 정사각형 찾기

2023년 12월 03일 알고리즘 문제풀이 문제 가장 큰 정사각형 찾기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def solution(board): answer = 1 p = len(board) q = len(board[0]) dp = [[0 for _ in range(q)] for _ in range(p)] dp[0] = board[0] for i in range(p): dp[i][0] = board[i][0] for a in range(p): for b in range(q): if a-1>=0 and b-1>=0 and board[a][b]==1: dp[a][b] = min(dp[a-1][b-1],dp[a-1][b],dp[a][b-1])+1 answer = max(answer,dp[a][b]) return answer*answer 위 코드는 정확성은 통과했지만 효율성에서 문제를 겪었다. 이 로직은 board 상 1인 좌표마다 검사를 해 가장 큰 사각형의 한 변의 길이가 몇인지 모두 탐색한다. board의 좌표 갯수는 1000000 인데, 이를 평균적으로 500개씩 탐색하면 500000000(5억)이나 수행해야 한다. 결국 아래처럼 고쳐 통과되었다. ...

2023년 12월 3일 · 2 분 · 배준수

파이썬 알고리즘 : 짝수와 홀수

2023년 12월 02일 알고리즘 문제풀이 문제 짝수와 홀수 난이도 Lv.1 코드 1 2 3 4 5 6 def solution(num): if num%2: answer = 'Odd' else: answer = 'Even' return answer

2023년 12월 2일 · 1 분 · 배준수

파이썬 알고리즘 : 3 x n 타일링

2023년 11월 28일 알고리즘 문제풀이 문제 3 x n 타일링 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def solution(n): dp = [0 for _ in range(5001)] dp[2] = 3 dp[4] = 11 for i in range(1,n+1): if n%2: return 0 if i%2: continue else: if not dp[i]: tmp = 2 tmp += dp[i-2]*dp[2] for x in range(2,i//2): tmp += dp[i-2*x]*2 dp[i] = tmp%1000000007 return dp[n] 진짜 어렵다. 홀수는 나올수 없으므로 무조건 0이라는 것은 일찍 발견했다. 하지만 일반항을 위한 점화식을 구하기가 어려웠다. 처음에 한 추론은 다음과 같다. ...

2023년 11월 28일 · 2 분 · 배준수

파이썬 알고리즘 : 공원산책

2023년 11월 27일 알고리즘 문제풀이 문제 공원산책 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 def solution(park, routes): H = len(park) W = len(park[0]) a = 0 b = 0 for i in range(H): for j in range(W): if park[i][j] == 'S': a = i b = j def check(p,q,x,y): for i in range(1,q+1): if p == 'N': if x-i < 0 or park[x-i][y] == 'X': return False elif p == 'S': if x+i >= H or park[x+i][y] == 'X': return False elif p == 'E': if y+i >= W or park[x][y+i] == 'X': return False elif p == 'W': if y-i < 0 or park[x][y-i] == 'X': return False if p == 'N': return x-q,y elif p == 'S': return x+q,y elif p == 'E': return x,y+q elif p == 'W': return x,y-q i = 0 while i < len(routes): way_to_go, distance_to_go = routes[i].split() if not check(way_to_go,int(distance_to_go), a,b): i += 1 continue a,b = check(way_to_go,int(distance_to_go), a,b) i += 1 return [a,b] 어렵진 않은데 좀 귀찮고.. 그렇다. 그래도 이런 문제 많이 풀어서 어렵진 않다. 레벨이 1인 이유는 문제에서 따져야 하는 경우를 모두 설명해줘서 그런듯 하다. ...

2023년 11월 27일 · 2 분 · 배준수

파이썬 알고리즘 : 2 x n 타일링

2023년 11월 17일 알고리즘 문제풀이 문제 2 x n 타일링 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 def solution(n): dp = [0 for _ in range(60001)] x = 1 while x <= n: if x == 1: dp[x] = 1 elif x == 2: dp[x] = 2 else: dp[x] = (dp[x-1] + dp[x-2])%1000000007 x += 1 return dp[n] 많이 볼 수 있는 DP문제이다. 2 x n 일땐 이전 조합들을 합친 것만으로도 다음 갯수를 산출할 수 있어서 크게 어렵지 않다. 수가 커지기 때문에 나머지로 표시해야 한다는 사실을 잠시 잊었다.. ...

2023년 11월 17일 · 1 분 · 배준수

파이썬 알고리즘 : X만큼 간격이 있는 n개의 숫자

2023년 11월 16일 알고리즘 문제풀이 문제 X만큼 간격이 있는 n개의 숫자 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 def solution(x, n): answer = [] d = x num = x while len(answer) < n: answer.append(num) num += d return answer 크게 어려울 것 없는 문제였다. 문제에 제한 조건이 주어지는데 while문에 추가하면 마지막 테스트 케이스에서 틀린다. 문제가 알아서 제한하여 준다는 뜻이니 걸지 말것. ...

2023년 11월 16일 · 1 분 · 배준수

파이썬 알고리즘 : 124 나라의 숫자

2023년 11월 14일 알고리즘 문제풀이 문제 124 나라의 숫자 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 def solution(n): nums = [] while n: a = n%3 if a: n = n//3 nums.append(str(a)) else: n = n//3 -1 nums.append('4') nums.reverse() answer = ''.join(nums) return answer 코드 자체는 단순해보이지만 해결하는데 정말 어려운 문제였다. 등장할 수 있는 숫자가 3개(1,2,4)였기 때문에 3진법을 이용하면 될 것 같다는 생각 자체는 바로 떠올렸다. 하지만 답을 유추해내기 쉽지 않았는데 추가적인 조건이 있기 때문이다. 아래 표를 통해 설명하겠다. ...

2023년 11월 14일 · 2 분 · 배준수

파이썬 알고리즘 : 신고 결과 받기

2023년 11월 13일 알고리즘 문제풀이 문제 신고 결과 받기 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def solution(id_list, report, k): n = len(id_list) answer = [0 for _ in range(n)] table = [[0 for _ in range(n)] for _ in range(n)] for x in report: sender, receiver = x.split() a = id_list.index(sender) b = id_list.index(receiver) table[b][a] = 1 for i in table: if sum(i) >= k: for j in range(len(i)): if i[j]: answer[j] += 1 return answer 어떤 배열들을 만들어야 하는지 헷갈렸지만 크게 어려운 문제는 아니었다. ...

2023년 11월 13일 · 1 분 · 배준수