파이썬 알고리즘 : 자연수 뒤집어 배열로 만들기
2024년 1월 18일 알고리즘 문제풀이 문제 자연수 뒤집어 배열로 만들기 난이도 Lv. 1 코드 1 2 3 4 5 def solution(n): answer = list(str(n)) answer.reverse() answer = list(map(int,answer)) return answer reverse와 map 함수의 형식이 은근히 헷갈린다.
2024년 1월 18일 알고리즘 문제풀이 문제 자연수 뒤집어 배열로 만들기 난이도 Lv. 1 코드 1 2 3 4 5 def solution(n): answer = list(str(n)) answer.reverse() answer = list(map(int,answer)) return answer reverse와 map 함수의 형식이 은근히 헷갈린다.
2024년 1월 16일 알고리즘 문제풀이 문제 행렬의 곱셈 난이도 Lv. 2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 def solution(arr1, arr2): a1 = len(arr1) b1 = len(arr1[0]) a2 = len(arr2) b2 = len(arr2[0]) answer = [[0 for _ in range(b2)] for _ in range(a1)] for i in range(a1): for j in range(b2): tmp = 0 for x in range(b1): tmp += (arr1[i][x]*arr2[x][j]) answer[i][j] = tmp return answer 마지막 tmp를 구할때 b1이나 a2나 아무거나 사용해도 상관없다. 행렬의 곱셈이 가능하다는 건 두 수가 같다는 의미이기 때문이다. ...
2024년 1월 15일 알고리즘 문제풀이 문제 피보나치 수 난이도 Lv. 2 코드 1 2 3 4 5 6 7 8 def solution(n): dp = [0 for _ in range(n+1)] dp[1] = 1 if n<2: return dp[n] for i in range(2,n+1): dp[i] = (dp[i-1]+dp[i-2])%1234567 return dp[n]
2024년 1월 12일 알고리즘 문제풀이 문제 햄버거 만들기 난이도 Lv. 1 코드 배열을 순회하면서 순서대로 필요한 재료가 나오면 만들 수 있는 갯수를 하나 추가해주고, 해당 재료들을 제거해주었다. 이 방법은 틀렸는데, 재료가 연속해서 나와야 하기 떄문이다. 연속이라고 써놓지 좀… 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def solution(ingredient): answer = 0 arr = [1,2,3,1] while True: idx = 0 for x in range(len(ingredient)): if idx ==4: answer += 1 break if ingredient[x] == arr[idx]: idx += 1 ingredient[x] = 10 else: if idx == 4: answer += 1 else: return answer 그래서 하나씩 배열로 옮기면서, 최근 옮긴 4개로 햄버거를 만들 수 있다면 만들고 제거하도록 로직을 바꾸었다. ...
2024년 1월 11일 알고리즘 문제풀이 문제 자릿수 더하기 난이도 Lv. 1 코드 1 2 3 4 5 6 def solution(n): answer = 0 arr = list(str(n)) for x in arr: answer += int(x) return answer
2024년 1월 2일 알고리즘 문제풀이 문제 N-Queen 난이도 Lv.2 코드 그 어렵다고 소문난 N-Queen 문제. 정글 때 공부했던 문제였는데 그새 까먹었나보다. 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 def solution(n): answer = 0 def check_width_row(p,q,arr): for i in range(n): if arr[i][q] == '0': arr[i][q] = False if arr[p][i] == '0': arr[p][i] = False def check_right_down(p,q,arr): i = 0 while p+i >= 0 and p+i < n and q+i >= 0 and q+i < n: if arr[p+i][q+i] == '0': arr[p+i][q+i] = False i += 1 def check_left_up(p,q,arr): i = 0 while p+i >= 0 and p+i < n and q+i >= 0 and q+i < n: if arr[p+i][q+i] == '0': arr[p+i][q+i] = False i -= 1 def check_right_up(p,q,arr): i = 0 while p-i >= 0 and p-i < n and q+i >= 0 and q+i < n: if arr[p-i][q+i] == '0': arr[p-i][q+i] = False i += 1 def check_left_down(p,q,arr): i = 0 while p+i >= 0 and p+i < n and q-i >= 0 and q-i < n: if arr[p+i][q-i] == '0': arr[p+i][q-i] = False i += 1 def check(p,q,arr): check_width_row(p,q,arr) check_right_down(p,q,arr) check_right_up(p,q,arr) check_left_up(p,q,arr) check_left_down(p,q,arr) arr[p][q] = True def search(x,arr): for i in range(n): if arr[x][i] == '0': check(x,i,arr) flag = True break else: flag = False return flag for i in range(n): w = [['0' for _ in range(n)] for _ in range(n)] w[0][i] = True check(0,i,w) k = 1 while k < n: tmp = search(k,w) if tmp: k += 1 else: break if k == n: print(w) answer += 1 return answer 보드판을 string ‘0’을 배치시켜 만들었다. 원래 숫자로 넣었는데 False일 떄와 0일때가 같이 취급되어서 따로 만들었다. 아무 선택되지 않은 좌표는 ‘0’, 공격당할 수 있기 때문에 놓을 수 없는 곳은 False, 퀸이 위치한 곳은 True로 설정하였다. 우선 임의의 좌표 (p,q)에 퀸을 놓았을 때 퀸이 공격할 수 있는 곳을 False 처리하는 코드를 작성했다. 임의의 좌표의 좌 우 대각선을 바꿔주는 함수를 각각 만들고 하나의 함수로 합쳤다(check). search는 특정 행에서 퀸을 놓을 수 있는 열을 찾아 존재하면 boolean값을 반환해주는 함수이다. ...
2024년 1월 1일 알고리즘 문제풀이 문제 최솟값 만들기 난이도 Lv.2 코드 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 from heapq import heappop, heappush def solution(A,B): n = len(A) arr_A = [False for _ in range(n)] arr_B = [False for _ in range(n)] arr = [] def dfs(tmp,arr_A,arr_B): if arr and tmp > arr[0]: return if not arr_A.count(False) and not arr_B.count(False): if not arr or tmp < arr[0]: heappush(arr,tmp) for i in range(n): if arr_A[i]: continue for j in range(n): if arr_B[j]: continue arr_A[i] = True arr_B[j] = True dfs(tmp+(A[i]*B[j]),arr_A,arr_B) arr_A[i] = False arr_B[j] = False dfs(0,arr_A,arr_B) return arr[0] 처음엔 DFS로 시도했다. 여러 case가 규칙성 없이 나타날 수 있다고 생각했기 때문이다. 하지만 시간초과가 발생했다. 불필요한 탐색을 줄이기 위해, 값을 최소힙에 저장하도록 했다. DFS 과정 상 재귀 중에 이미 최소힙에 존재하는 최솟값을 넘어선 경우 탐색을 중단하도록 했다. 하지만 시간초과가 계속 발생했다. ...
Today I Learned 날짜 2023년 12월 28일 목요일 내용 매 주, shop의 review에 관해 발생한 변화들을 담은 메일을 발송해야 한다. 어제 가진 의문들에 대해 집중적으로 고민한 덕에 많이 진행됐다. 현재 발송하는 shop의 이름 각 메일에는 수신하는 shop에 대한 정보가 담겨야 한다. 그렇다면 그 샵의 정보를 통해 조회하여 담아야 하는데 어떻게 알 수 있을까에 대해 고민됐다. 조금만 고민해보니 정말 쓸데 없는 생각이었다. 모든 shop에 보내야하니 그냥 각 shop에 대해 필요한 정보를 다 가져와야 했다. ...
Today I Learned 날짜 2023년 12월 27일 수요일 내용 Verification Email은 테스트서버에서도 이상이 없었다. 코드가 힘들기 보단 이해가 힘든 Task였음. Review Report Email 주 1회, 한 주간 리뷰의 추가 상황에 대해 메일을 보내줘야 한다. 가장 우선 파악해야할 것은 세 가지였다. 어떻게 정기적으로 메일을 보낼 것인가? 메일 형식은 어디에 어떻게 설정할 것인가? 메일에 데이터를 어떻게 담을 것인가? 우선 반복된 동작은 cron과 cronjob에서 처리한 다는 것은 알고 있었다. 문제는 이 코드를 누가 언제 실행하는지 였는데… 결국 ECS였다. 이에 관한 설명인 밑에서 하고, ECS에서는 특정 이벤트나 시간을 기준으로 Task를 계획할 수 있다. ...
Today I Learned 날짜 2023년 12월 26일 내용 지난 주에 정리했던 대로 로직을 완성했다. 기존의 messaging_log를 처리하는 스크립트는 messaging의 비활성화 여부를 체크하지 않기 떄문에, 스크립트를 새로 생성했다. 여기서는 messaging 설정에 따라 messaging_log의 sending_status를 출력하도록 했다. ON 일땐 보내는 로직이 발생하지만 필요한 param이 모두 입력되지 않았기 떄문에 발송 오류가 발생하여 Unable로 설정되야 하고, OFF 일 때는 보내선 안되므로 CHANNEL_OFF 로 설정되야 한다. 로컬에선 문제 없이 작동한다. 회고 노로바이러스 떄문에 너무 힘들다. ...