파이썬 알고리즘 : Longest Common Prefix

2024년 5월 16일 알고리즘 문제풀이 문제 Longest Common Prefix 난이도 Easy 코드 1 2 3 4 5 6 7 8 9 10 class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: word = strs[0] for i in range(1,len(strs)): for j in range(1,len(word)+1): if word[:j] != strs[i][:j]: word = word[:j-1] break return word Set로 풀어보려했는데, 맨 앞에서부터 공통을 찾아야 했다. 더 좋은 방법은 안 떠오르는데.. ...

2024년 5월 16일 · 1 분 · 배준수

QA 지옥

Today I Learned 날짜 2024년 5월 14일 화요일 내용 QA 제법, 아니 꽤 많이 미완성인채로 일정대로 QA가 진행됐다. 자질구레한 것 여러가지를 뜯어고쳤고, 앞으로도 뜯어 고칠게 참 많다. 앱 삭제 기능 쇼피파이에서 고객이 앱을 삭제하면 웹훅을 이용해 우리 서비스에 호출을 보낸다. 그럼 우리 서버 내에 데이터들을 삭제해주어야 한다. 이 기능이 작동을 안하고 있다. 따로 엔드포인트를 이용하면 기가막히게 삭제가 되는데… 주소가 잘못 되어있는 것 같아 수정하고, 기능이 새 앱에서는 작동되지 않도록 설정되어 있어 그 부분도 손봤는데 여전히 작동하지 않는다. elastic apm을 홗인해보니 웹훅을 처리하는 라우터 자체가 호출된 흔적이 없었다. 기존에 있던 웹훅 조회하는 함수를 조금 손봐서 새 앱에도 쓸 수 있게 해봤는데, 웹훅 조회자체가 안된다. 없을 거라 예상했는데 조회가 안되는건 예상 못했는데.. ...

2024년 5월 14일 · 3 분 · 배준수

파이썬 알고리즘 : 조이스틱

2024년 5월 14일 알고리즘 문제풀이 문제 조이스틱 난이도 Lv.2 코드 1차 55.6점 / 100점 진짜 어려웠다. A글자를 원하는 글자로 바꾸는 것은 어렵지 않았으나, 어떤 방향으로 커서를 움직이도록 설정할지가 고민됐다. 양 옆의 글자를 보고 바꾸기 위해 조작을 많이해야 하는 쪽으로 움직이도록 설정해주었다. 그래야 혹시 바꿀 필요가 없는 쪽으로 이동하지 않을 거라고 생각했다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def solution(name): def cal(x): max_val = ord("Z")+1 return min(ord(name[x])-ord(tmp[x]),(max_val-ord(name[x]))) n = len(name) name = list(name) answer = 0 idx = 0 tmp = list('A'*n) while True: if name[idx] != tmp[idx]: answer += cal(idx) tmp[idx] = name[idx] if name == tmp: break if cal((idx-1)%n) >= cal((idx+1)%n): idx = (idx-1)%n else: idx = (idx+1)%n answer += 1 return answer 2차 51.9점 / 100점 ...

2024년 5월 14일 · 4 분 · 배준수

Shopify에 앱 설치가 안되었던 이유

Today I Learned 날짜 2024년 5월 13일 월요일 내용 1 스토어 2 앱 설치 하나의 스토어에 우리 앱 2개가 설치되지 않는다. 쇼피파이에게 문의한 결과는 “개발에 관련된 질문은 받지 않으니, 개발자 커뮤니티를 이용하거나 우리 디스코드에 들어와!” 내가 안찾아봤겠냐고… 거기도 이미 답변을 다는 사람에 비해 너무 많은 질문이 올라온지 한참되버렸을 뿐더러, 내가 원하는 질문은 찾을 수도 없었다. 별 수 있나? 열심히 짱구 굴려봐야지.. 답이 없을 것 같았던 문제는, 전지전능하신 선배님의 도움으로 해결되었다. 브라우저 부스터 앱 설치를 테스트 서버로 넘기기 전에, ngrok을 이용해 내 로컬로 설치할 수 있다. 더 쉽게 말하자면, 유저가 “앱 설치할래요!” 라고 요청을 보내면, 쇼피파이와 앱 서버(여기선 우리 테스트 서버)는 검증받은 앱인지, 올바른 URL인지 기타 등등을 검증하고, 데이터를 주고 받는다. 이 과정에서 우리 서버에는 설치한 스토어의 정보가 저장되고, 새로운 손님에겐 우리가 미리 설정한 주소(온보딩 or 로그인 페이지)로 리다이렉트 시켜준다. ngrok을 이용하면 쇼피파이가 테스트 서버 대신 내 로컬과 이야기를 주고받도록 설정하는 셈이다. ...

2024년 5월 13일 · 2 분 · 배준수

죽음이 물었다, 어떻게 살 거냐고

죽음이 물었다, 어떻게 살 거냐고 지은이: 한스 할터 옮긴이 : 한윤진 출판사: 포레스트북스 감상 나는 책을 고를 때, 누군가의 추천사나 책에 대한 간략한 도입부, 소개를 읽지 않는다. 제목과 표지만으로 판단하는 이유는, 설령 내가 예상한 책 내용이 아닐지라도 온전히 나의 시각으로만 읽으면서 느낄 수 있는 점이 있다고 생각하기 때문이다. 이 방식은 앞으로도 고수할 생각이다. 이런 말을 하는 이유는, 내가 생각했던 책이 전혀 아니었기 때문이다.. 죽음에 관한 혹은 삶에 관한 누군가의 무덤덤한 수필을 기대했는데 역사적 인물들의 유언 모음집이었다. 읽은 이후에, 딱히 삶을 더 치열하게 살아야 한다거나 후회없이 살아야 한다는 욕구가 솟구치진 않는다. 역사에 남을 위대한 위인들, 죽은 이후에도 칭송될 업적을 남긴 인물들마저 자신의 죽음을 전혀 예상하지 못하는 경우도 많고, 무덤덤하게 받아들이는 경우도 많았다. 내가 가져야할 태도는 무엇일까. 무엇이 죽음 앞에 올바를 수 있을까? ...

2024년 5월 13일 · 2 분 · 배준수

파이썬 알고리즘 : H-Index

2024년 5월 13일 알고리즘 문제풀이 문제 H-Index 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def solution(citations): answer = 0 left = 0 right = 10000 while left <= right: cnt = 0 mid = (left+right)//2 for i in citations: if i >= mid: cnt += 1 if cnt < mid: right = mid -1 else: left = mid +1 answer = (left+right)//2 return answer 가능한 값 중 최솟값 혹은 최댓값을 찾는 문제는 이제 자연스레 이진탐색이 떠오른다. ...

2024년 5월 13일 · 1 분 · 배준수

두 앱의 공통 진입점 파악

Today I Learned 날짜 2024년 5월 10일 금요일 내용 프로덕트바리언트 가격 리스트디자이너 위젯에서 할인 전후 가격이 바뀌어서 나타나고 있었다. 알고보니 쇼피파이에서 보내는 데이터 상으로 compare_at_price가 할인 전 가격(높은 가격)이고 price가 할인 후 가격(낮은 가격)인데 바꾸어서 데이터로 저장하고 있었다. 애초에 변수 이름을 좀 알아보기 쉽게 짓지 거참.. 온보딩 앱 두개가 하나의 시작점을 지니도록 처리하려니 신경써야 할 부분이 한 두개가 아니다. 예를 들어, 어떤 계정이 3개의 스토어에 우리 서비스를 설치했다고 가정해보자. A 샵은 알파플러스만 사용하고, B 샵은 브라우저 부스터만 사용, C 샵은 둘 다 사용한다. 계정은 두 서비스를 다 사용한다는 변수를 프론트에게 제공하고 있고, 세션에 저장된다. 그럼 각 샵은 어떻게 처리해야할까? 어드민 페이지에서 A샵이나 B샵을 선택하면 그 샵이 설치한 앱(A샵은 알파플러스, B샵은 브라우저 부스터)에만 접근하도록 해주어야 한다. C샵은 둘 다 접근할 수 있어야 한다. 로그인 시점에 이 정보가 프론트에게 주어져야 한다. 이런 부분이 한두 개가 아니다.. 기존 알파플러스 서비스를 망가뜨리지 않고 새로운 앱을 합치다 보니 머리가 너무 복잡하다ㅏㅏㅏㅏㅏㅏ…. ...

2024년 5월 10일 · 1 분 · 배준수

파이썬 알고리즘 : 덧칠하기

2024년 5월 10일 알고리즘 문제풀이 문제 덧칠하기 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from heapq import heappop, heappush def solution(n, m, section): answer = 0 arr = [] for x in section: heappush(arr,x) idx = heappop(arr) end = idx + m -1 cnt = 1 while arr: if arr[0] <= end: heappop(arr) continue else: idx = heappop(arr) end = idx + m -1 cnt += 1 return cnt 최소힙을 사용하는 아이디어가 금방 떠올라서 쉽게 풀었다. ...

2024년 5월 10일 · 1 분 · 배준수

2앱 체제 구현

Today I Learned 날짜 2024년 5월 9일 목요일 내용 샵 디테일 수정 새로운 브라우즈 부스터 앱에서 사용할 샵 테이블을 별도로 생성했었다. 이 앱에 앞으로 다양한 서비스가 추가될 테지만, 우선은 필요한 최소한으로 구현하는게 좋다고 클린 아키텍처에서 배웠다. 알파플러스 앱에선 쇼피파이에서 보내주는 데이터는 샵 테이블에, 우리 서비스에서 사용하기 위해 필요한 정보들을 담는데는 샵 디테일 테이블을 사용한다. 우선 브라우저 부스터 앱은 샵 디태일을 별도로 만들지지 않았다. 배운대로 했다는 뿌듯함을 느꼈다. 브라우저 부스터 앱을 설치해도, 알파플러스와 동일한 온보딩 및 회원가입 과정을 겪어야 해서 샵 데이테일 테이블이 필요하다는 것을 꺠달았다. 바로 샵 디테일을 만들었다. 난 생각의 범위가 참 좁다. ...

2024년 5월 9일 · 2 분 · 배준수

파이썬 알고리즘 : two-sum

2024년 5월 9일 알고리즘 문제풀이 문제 two-sum 난이도 Easy 코드 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 class Solution: def twoSum(self, nums, target: int): board = dict() idx_arr = dict() answer = [] for i in range(len(nums)): if nums[i] not in board: board[nums[i]] = 1 else: board[nums[i]] += 1 for i in range(len(nums)): if nums[i] not in idx_arr: idx_arr[nums[i]] = [i] else: idx_arr[nums[i]].append(i) for i in range(-target,target+1,1): if i in board and target-i in board: if i != target-i: answer = [idx_arr[i][0],idx_arr[target-i][0]] break else: if board[i] >= 2: answer = [idx_arr[i][0], idx_arr[i][1]] break return answer 다 조회하면 시간이 초과될 것 같아, dictionary를 이용하려 했다. target이 0일 떈 조합을 찾는 반복문이 제대로 작동하지 않아 오답처리되었다. ...

2024년 5월 9일 · 1 분 · 배준수