파이썬 알고리즘 : N-Queen

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월 2일 · 9 분 · 배준수

파이썬 알고리즘 : 최솟값 만들기

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 과정 상 재귀 중에 이미 최소힙에 존재하는 최솟값을 넘어선 경우 탐색을 중단하도록 했다. 하지만 시간초과가 계속 발생했다. ...

2024년 1월 1일 · 2 분 · 배준수

우리가 빛의 속도로 갈 수 없다면

우리가 빛의 속도로 갈 수 없다면 지은이: 김초엽 출판사: 허블 감상 여러 단편소설들이 엮여있는 책으로, 책의 제목은 그 중 하나이다. 가장 처음에는 <순례자들은 왜 돌아오지 않는가>가 나오는데, 내용 중 분량도 가장 긴 느낌이고, 전체적인 세계관을 파악하는 데도 시간이 필요한 작품이였다. 그 외는 모두 물 흐르듯 자연스럽게 읽을 수 있었다. 내용이 쉽고 단순하기 보다는, 불필요한 세계관에 대한 서술없이 등장인물의 말에 깊이 빠져들게 된 덕이다. SF 소설이긴 하지만, 과학적인 느낌보다는 미래를 배경으로 한 소설을 읽는 느낌이 물씬 들어 너무 재밌게 읽은 책이었다. 가볍게, 짧으면 하루만에도 읽어버릴 수 있는 책. 독서에 에너지를 쏟고 싶지 않지만 몰입하고 싶다면 꼭 추천하는 소설이다. ...

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

CSS로 메일 양식 만들기

Today I learned 날짜 2023년 12월 29일 금요일 내용 어제 막힌 난점은 해결했다. 도커 컨테이너 내에서 스크립트를 실행하니 메일은 발송되었다. 딱히 추가로 건드려야 할 설정이나 변수는 없었다. 기존에는 안되었는데, 로직상 가져온 데이터가 없었기 떄문에 발송되지 않았던 모양이다. 로컬 DB에는 테스트를 위한 적절한 리뷰 데이터가 없기 떄문에, 메일에 담을 데이터들을 임의의 값으로 지정해주었더니 헤결됐다. 수신자를 내 이메일로 설정해서, 어떤 화면이 고객이 보게 되는지 확실히 볼 수 있었다. HTML에 데이터를 담는 것도 금방 해결되었는데, 이미 우리 서비스에 Jinja2 템플릿을 사용하고 있었기 때문이다. 그냥 양식에 맞춰 변수를 집어넣기만 해주었다. 생각지도 못한 부분에서 하루종일 고생했는데, 이메일에 담길 HTML을 로컬에서 열어보았을 떄와 메일로 받아보았을 떄가 다르다. local에선 적용된 padding이 안되있는 경우라던가, 예상 외의 상황이 많다. 이러한 특징은 각 메일 플랫폼별로 모두 다르다고 한다. 고객이 네이버, 구글, 아웃룩 등 받을 곳은 무궁무진한데 출력되는 형식이 매번 달라지니 이메일 만드는게 쉽지 않은 것 같다. 난 그냥 CSS도 못하는데… ...

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

파이썬 알고리즘 : 신규 아이디 추천

2023년 12월 29일 알고리즘 문제풀이 문제 신규 아이디 추천 난이도 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 def solution(new_id): arr = ['1','2','3','4','5','6','7','8','9','0','-','_','.'] # 1단계 new_id = new_id.lower() # 2단계 tmp = [] for i in new_id: if i.islower() == True or i in arr: tmp.append(i) new_id = ''.join(tmp) # 3단계 if len(new_id) >1: tmp = [] for i in range(len(new_id)-1): if new_id[i] == '.' and new_id[i+1] == '.': continue tmp.append(new_id[i]) tmp.append(new_id[-1]) new_id = ''.join(tmp) # 4단계 if new_id: if new_id[0] == '.': if len(new_id) == 1: new_id = '' else: new_id = new_id[1:] # 4단계 if new_id: if new_id[-1] == '.': if len(new_id) == 1: new_id = '' else: new_id = new_id[:len(new_id)-1] # 5단계 if new_id == '': new_id = 'a' # 6단계 if len(new_id) >= 16: new_id = new_id[:15] # 6단계 if new_id[-1] == '.': new_id = new_id[:len(new_id)-1] # 7단계 if len(new_id) <= 2: while len(new_id) < 3: new_id = new_id + new_id[-1] return new_id 문제에 주어진 대로, 순차적으로 해결하면 큰 어려움은 없는 문제였다. 다만 중간중간, 문자열이 존재하지 않게 되는 상황이 발생할 수 있기 때문에 이를 따로 처리하는 로직이 필요하다. 시간 많이 잡아먹는 문제라 좋은 연습이 됐다. ...

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

별개의 DB 관계 파악

Today I Learned 날짜 2023년 12월 28일 목요일 내용 매 주, shop의 review에 관해 발생한 변화들을 담은 메일을 발송해야 한다. 어제 가진 의문들에 대해 집중적으로 고민한 덕에 많이 진행됐다. 현재 발송하는 shop의 이름 각 메일에는 수신하는 shop에 대한 정보가 담겨야 한다. 그렇다면 그 샵의 정보를 통해 조회하여 담아야 하는데 어떻게 알 수 있을까에 대해 고민됐다. 조금만 고민해보니 정말 쓸데 없는 생각이었다. 모든 shop에 보내야하니 그냥 각 shop에 대해 필요한 정보를 다 가져와야 했다. ...

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

파이썬 알고리즘 : 문자열 내 p와 y의 갯수

2023년 12월 28일 알고리즘 문제풀이 문제 문자열 내 p와 y의 개수 난이도 Lv.1 코드 1 2 3 4 def solution(s): a = s.count('p') + s.count('P') b = s.count('y') + s.count('Y') return a == b 이 문제에선 p 와 y만 포함됐지만, 대문자나 소문자 자체를 어떻게 셀 지 궁금해져서 찾아보니 islower() 와 isupper() 를 사용하면 boolean 값으로 반환된다고 한다.

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

2023년 회고록

2023년 회고록 2023년이 일주일 남았다. 크리스마스 분위기가 특별히 체감되지 않기도 하고.. 내게 뜻 깊은 한해라 되돌아보며 회고하는 시간을 가졌다. 꽤 오래 WIL을 쓰면서 회고를 반복해왔고, 근래에는 TIL을 쓰고 있다. 하루를 얼마나 바쁘게, 의미있게 보냈는지를 적나라하게 볼 수 있다. 그리고 시간의 흐름을 지나고나서보면 꽤나 다르게 보인다. 정확히는, 과거의 내가 꽤나 현명하지 못했다는 생각이 많이 든다. 예를 들어, 1번부터 5번까지의 선택지를 두고 치열하게 고민한다. 내 딴에는 열심히 고민했고 최선의 결론을 내렸다고 해도 나중에는 이해가 잘 안된다. “왜 정답인 4번을 냅두고 3번을 생각했을까?”, 혹은 “왜 6번, 7번 선택지는 몰랐을까?”. 심지어는 “그 쓸데없는 걸 왜 고민했을까?“까지도. 나를 되돌아본다는 것은 분명 가치있는 일이다. 꼭 더 나은 모습을 도출해내지 못하더라도 스스로를 더 잘 알게 되는 것만으로도 말이다. ...

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

Amazon ECS 알아보기

Today I Learned 날짜 2023년 12월 27일 수요일 내용 Verification Email은 테스트서버에서도 이상이 없었다. 코드가 힘들기 보단 이해가 힘든 Task였음. Review Report Email 주 1회, 한 주간 리뷰의 추가 상황에 대해 메일을 보내줘야 한다. 가장 우선 파악해야할 것은 세 가지였다. 어떻게 정기적으로 메일을 보낼 것인가? 메일 형식은 어디에 어떻게 설정할 것인가? 메일에 데이터를 어떻게 담을 것인가? 우선 반복된 동작은 cron과 cronjob에서 처리한 다는 것은 알고 있었다. 문제는 이 코드를 누가 언제 실행하는지 였는데… 결국 ECS였다. 이에 관한 설명인 밑에서 하고, ECS에서는 특정 이벤트나 시간을 기준으로 Task를 계획할 수 있다. ...

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

Email 관련 Task 완료!

Today I Learned 날짜 2023년 12월 26일 내용 지난 주에 정리했던 대로 로직을 완성했다. 기존의 messaging_log를 처리하는 스크립트는 messaging의 비활성화 여부를 체크하지 않기 떄문에, 스크립트를 새로 생성했다. 여기서는 messaging 설정에 따라 messaging_log의 sending_status를 출력하도록 했다. ON 일땐 보내는 로직이 발생하지만 필요한 param이 모두 입력되지 않았기 떄문에 발송 오류가 발생하여 Unable로 설정되야 하고, OFF 일 때는 보내선 안되므로 CHANNEL_OFF 로 설정되야 한다. 로컬에선 문제 없이 작동한다. 회고 노로바이러스 떄문에 너무 힘들다. ...

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