파이썬 알고리즘 : 숫자의 표현

2023년 12월 18일 알고리즘 문제풀이 문제 숫자의 표현 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 def solution(n): answer = 1 if n == 1 or n == 2: return answer tmp = 3 while tmp <= n: if not n%tmp: answer += 1 tmp += 2 return answer 처음엔 DP로 생각했다. 생각하다보니, DP 라면 이전 것들이 계속 더해지는 형태라는 의미인데, 결국 숫자가 너무 커질 것이라는 생각이 들었다. 따라서 DP를 이용하는 문제라면 어떤 수로 나눈 나머지를 기록하도록 문제가 나왔을거라고 생각이 들어서 DP가 아닌 규칙성을 찾기로 하였다. 홀수의 경우 절반으로 나눈 몫과 그 몫의 1을 더한 경우가 항상 존재한다. 예를 들어, 15일 때 절반으로 나눈 몫은 7임. 1은 더한 값 8과 함께 7+8=15 로 표현될 수 있다. 이 규칙은 모든 홀수에게 적용되지만, 모든 짝수에게는 적용될 수 없다. 연속된 두 개의 수는 하나는 홀수고 하나는 짝수기 때문에 결과가 홀수로만 나타나기 때문이다. 그래서 홀수 일 떄만 생각하면 된다고 판단하였다. 짝수일 떄는 0일 것이라고 생각했지만, 연속된 수는 1개만 있어도 되기 떄문에, 어떤 자연수든 자기 자신 1개로만 표현될 수 있다고 생각하여 짝수일 때는 항상 1을 반환하게 만들었다. 그 외의 홀수는 홀수로 나누면 된다고 생각했다. 예시에서 15는 4가지 경우가 있다. 15, 7+8, 4+5+6, 1+2+3+4+5 이 중 앞에 15와 7+8은 예외적인 경우로 따져서 규칙성에서 배제하였다. 1개로 나타내는 수는 앞서 말했듯 누구에게나 적용되는 규칙이고, 7+8은 홀수라면 무조건 적용되는 규칙이기 때문이다. 즉 4+5+6과 1+2+3+4+5 가 15가 가지는 규칙인데, 총 더해지는 숫자의 갯수가 홀수개라고 생각했다. 가운데 수를 기준으로 양쪽에 하나씩, 두개씩, 세개씩 붙는 규칙이라고 파악했다. (2n+1)로 나누었을떄 나누어 떨어지면 된다. 15는 3,5로 나누어떨어지니 저 2개가 규칙이 생긴 것이다. 같은 논리로, 17과 19는 그 다음 홀수인 7로 나누어 떨어지지 않기 떄문에 15와 같은 갯수를 가질 것이다. 반면 21은 7로 나누어 떨어지기 떄문에 한 가지 경우가 추가될 것이고, 그 이후 9로 나누어 떨어지는 수가 나타나면 또 추가될 것이다. 여기서 일부 예외가 발생하였는데, 짝수를 배제한 것이 잘못되었다. 예를 들어 1+2+3은 6이다. 내가 세운 가설에 의하면 6은 연속된 수를 6 자기 자신을 제외하곤 없지만, 막상 실제로는 존재한다. 따라서 짝수 홀수와 상관없이 (2n+1)로만 나누어지면 내가 만든 규칙에 적용될 수 있다고 생각하여 짝수, 홀수를 따지지 않았더니 해결되었다. ...

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

파이썬 알고리즘 : 바탕화면 정리

2023년 12월 15일 알고리즘 문제풀이 문제 바탕화면 정리 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def solution(wallpaper): answer = [] files_x = [] files_y = [] n = len(wallpaper) m = len(wallpaper[0]) for i in range(n): for j in range(m): if wallpaper[i][j] == '#': files_x.append(i) files_y.append(j) answer.append(min(files_x)) answer.append(min(files_y)) answer.append(max(files_x)+1) answer.append(max(files_y)+1) return answer 처음엔 보고 조금 겁먹었지만 의외로 한번에 풀려버렸다. 존재하는 파일들을 모두 포함하는 드래그 중 가장 거리가 짧은 것을 찾기 위해 DFS나 BFS를 이용해야하나? 라는 생각을 했었다. 하지만 결국 존재하는 파일들의 x 좌표 값중 최솟값과 최댓값, y 좌표 중 최솟값과 최댓값만 찾으면 해결되는 문제였다. 조금 유의할 것은, 최댓값의 좌표에는 +1을 해주어야 한다. 파일의 좌측 상단 모서리를 기준으로하기 때문에 파일을 포함시키기 위해선 파일의 우측 하단 모서리까지 포함해야 한다. ...

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

파이썬 알고리즘 : 나머지가 1이 되는 수 찾기

2023년 12월 14일 알고리즘 문제풀이 문제 나머지가 1이 되는 수 찾기 난이도 Lv.1 코드 1 2 3 4 5 def solution(n): answer = 0 for i in range(2,n): if not (n-1)%i: return i

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

파이썬 알고리즘 : 멀리 뛰기

2023년 12월 12일 알고리즘 문제풀이 문제 멀리뛰기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 def solution(n): answer = 0 dp = [0 for _ in range(n+1)] for i in range(1,n+1): if i == 1: dp[i] = 1 elif i == 2: dp[i] = 2 else: dp[i] = (dp[i-1] + dp[i-2])%1234567 answer = dp[n] return answer n번째 칸은 ...

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

파이썬 알고리즘 : 땅따먹기

2023년 12월 11일 알고리즘 문제풀이 문제 땅따먹기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def solution(land): n = len(land) answer = 0 dp = [[0 for _ in range(4)] for _ in range(n)] dp[0] = land[0] def check(next_row,next_col): arr = [] for i in range(4): if i == next_col: continue arr.append(dp[next_row-1][i]) return max(arr) x = 1 while x < n: for i in range(4): dp[x][i] = check(x,i) + land[x][i] x += 1 answer = max(dp[-1]) return answer 각 행에는 4개의 열이 있다. 각 열에 올 수 있는 방법의 경우는 3가지이다. 예를 들어 2행 0열에 오는 방법은 2행 1열, 2행 2열, 2행 3열에서 오는 것이다. 이러한 원리를 바탕으로 DP를 설정했다. ...

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

파이썬 알고리즘 : 로또의 최고 순위와 최저 순위

2023년 12월 08일 알고리즘 문제풀이 문제 로또의 최고 순위와 최저 순위 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 def solution(lottos, win_nums): def translate(p): if p >=2: return 7-p else: return 6 answer = [] cnt = 0 unknown = 0 for num in lottos: if not num: unknown += 1 continue if num in win_nums: cnt += 1 continue max_match = cnt + unknown min_match = cnt answer.append(translate(max_match)) answer.append(translate(min_match)) return answer 확실한 것을 통해 최저 순위를 확정지을 수 있고 정해지지 않은 수가 모두 맞는다고 가정하면 최고 순위도 알 수 있다. ...

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

파이썬 알고리즘 : 문자열을 정수로 바꾸기

2023년 12월 07일 알고리즘 문제풀이 문제 문자열을 정수로 바꾸기 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 def solution(s): if s[0] == '-': answer = int(s[1:]) * -1 elif s[0] == '+': answer = int(s[1:]) else: answer = int(s) return answer

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

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

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 분 · 배준수