리뷰 임포트 고치기

Today I Learned 날짜 2024년 4월 8일 월요일 내용 아마존에서 리뷰를 Import하는 기능을 열심히 고쳤다. 이미지를 사이즈별로 저장하기 2주 전 금요일이였나? 급하게 이슈 관리가 발생했었다. 아마존에서 리뷰를 가져올 때, 이미지를 사이즈 별로 원본, 중간 크기, 작은 크기, 썸네일 별 링크로 저장한다. 원본과 썸네일을 제외한 사이즈 사진이 나타나지 않았던 문제였다. 이미지의 사이즈는 파일명 가장 뒤에 숫자를 이용해 조절한다. 아마존에 있는 사진의 파일명 가장 끝은 “_SY” 가 붙어있는 형식인데 이 뒤에 숫자에 따라 크기가 조절된다. 예를 들어, 썸네일은 {파일명_SY88.jpg}, 중간 크기는 {파일명_SY300.jpg} 로 저장하면 된다. 문제가 되었던 사진은 “_SY”가 없이 숫자만 저장되어, 사진을 찾을 수 없다는 오류를 출력하고 있었다. ...

2024년 4월 8일 · 2 분 · 배준수

파이썬 알고리즘 : 전화번호 목록

2024년 4월 8일 알고리즘 문제풀이 문제 전화번호 목록 난이도 Lv. 2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 def solution(phone_book): answer = True arr =dict() for phone_number in phone_book: arr[phone_number] = True for phone_number in phone_book: temp="" for num in phone_number: temp +=num if temp in arr and temp!=phone_number: answer = False return answer

2024년 4월 8일 · 1 분 · 배준수

파이썬 알고리즘 : 옹알이 (2)

2024년 4월 6일 알고리즘 문제풀이 문제 옹알이 (2) 난이도 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 def search_index(arr,k): result = -1 if k in arr: result = arr.index(k) return result def solution(babbling): answer = 0 arr = ["aya", "ye", "woo", "ma"] for word in babbling: idx = 0 n = len(word) last_find_idx = -1 while idx <= n: if not n: answer += 1 break tmp = word[:idx+1] search_result = search_index(arr,tmp) if search_result != -1 and search_result != last_find_idx: last_find_idx = search_index(arr,tmp) word = word[idx+1:] n = len(word) idx = 0 else: idx += 1 return answer

2024년 4월 6일 · 1 분 · 배준수

일복

Today I Learned 날짜 2024년 4월 5일 금요일 내용 개발보단, 팀이 나아갈 방향에 대해 하루종일 고민했다. 리퀴드 쇼피파이에서는 리퀴드를 쓴다. 리퀴드는 루비를 기반으로한 HTML 템플릿 언어이다. 쇼피파이에 올라간 데이터들을 주고 받는게 Liquid로 작성된 앱블록에서 이루어지는데, 정말 놀랍게도 Shopify 정책상 1개의 앱이 사용할 수 있는 앱블록의 총 용량은 고작 100KB로 정해져있다. WOW 그리고 수 많은 위젯을 구현한 우리 서비스는 한계에 봉착했다. 더이상 여유 용량이 없다. 해결을 위한 여러 고민들을 더 자세히 쓰고 싶은데, 들은걸 100% 이해하지 못해서 못쓰곘다! 결론은, 새로운 앱을 만들되, 서버와 DB는 같이 쓰고, 어드민 페이지도 하나로 유지하기로 했다. 별개의 앱 사용자들이 하나의 서버와 어드민으로 들어오기 떄문에 이에 대한 여러 장치가 필요하다. 그리고 앱을 출시하는 과정 자체에 대한 공수도 필요하고.. 자연스레 할 일이 많아졌다! ...

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

파이썬 알고리즘 : 없는 숫자 더하기

2024년 4월 5일 알고리즘 문제풀이 문제 없는 숫자 더하기 난이도 Lv. 1 코드 1 2 3 4 5 def solution(numbers): answer = -1 arr = set(numbers) answer = 45 - sum(arr) return answer

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

테스트 코드 작성

Today I Learned 날짜 2024년 4월 4일 목요일 내용 고객 체크 계속 고민했던대로, 고객에 대한 데이터를 얻기 위해 수정이 필요했다. 다른쪽에서도 비슷한 결의 문제가 발생했는데, 프론트에서 유저가 받아야 할 쿠폰이 무엇인지 알 수 없었다. 쿠폰을 받기위한 이벤트의 진행 과정은 프론트에서 개별적으로 발생하는 반면, 쿠폰은 서버에서만 처리하니 둘의 싱크가 안맞아서 발생하는 문제 같았다. 결국 쿠폰을 발급할 때, 고객이 로그인하도록 과정을 추가해야 했다. 테스트 코드 약 2시간을 투자해서 테스트 코드를 작성했다. 무려 몇개월 전에 만들었던 AI 관련된 기능들에 대해서 작성했다. 리뷰의 키워드를 분석하고 횟수를 계산하는 것, 긍정과 부정을 분류하는 것, 요약을 만드는 것 3가지를 만들어주었다. ...

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

파이썬 알고리즘 : 랜선 자르기

2024년 4월 3일 알고리즘 문제풀이 문제 소수 경로 난이도 실버 2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import sys k,n = map(int,sys.stdin.readline().split()) lan = [] for _ in range(k): lan.append(int(sys.stdin.readline())) low = 0 high = 2**31-1 while low <= high: mid = (low+high)//2 cnt = 0 for thing in lan: cnt += thing//mid if cnt >= n: low = mid+1 else: high = mid-1 print((high+low)//2) 생각보다 평범한 이진탐색문제였다. ...

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

로직상 허점 찾기

Today I Learned 날짜 2024년 4월 3일 수요일 내용 오후 반차라 내용이 많이 빈약하다. 리뷰 임포트 CSV파일에서 리뷰를 임포트 해오는 것에 대한 스토어 이슈가 발생했다. 리뷰를 임포트하는 부분은 깊게 파본적이 없어서 대응하기가 어렵다.. 조만간 뜯어봐서 이해해봐야겠다. 고객 데이터 이벤트에 참여하고 쿠폰을 받은(혹은 사용한) 고객의 데이터를 언제 어떻게 받을지 모르겠다. 쿠폰 코드를 제공할 때는 회원가입(정확히는 로그인)이 필수 요건이 아니기 때문에 고객 정보를 알 수 없다. 결국 쿠폰을 사용한 사람의 데이터를 가져와 저장해야 하는데 이 부분에 대한 Shopify Docs가 찾기 힘들다. 누가 어떤 쿠폰을 사용했는지를 알려주는 app을 쇼피파이가 권하던데.. 그 말은 만들순 있다는 뜻인 것 같다. 다만, 주문 데이터에서 뽑아와야 한다면 이에 대한 공수도 분명히 고려해볼 필요가 있겠다. ...

2024년 4월 3일 · 1 분 · 배준수

파이썬 알고리즘 : 소수 경로

2024년 4월 3일 알고리즘 문제풀이 문제 소수 경로 난이도 골드 4 코드 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 import sys from heapq import heappop, heappush def check(k:int): if not k%2: return False for i in range(3,int(k**(0.5))+1): if not k%i: return False else: return True prime_numbs = [ False for _ in range(10000)] for i in range(1000,10000): if check(i): prime_numbs[i] = True def change_num(arr: list): result = [] for i in range(10): for j in range(4): tmp = arr.copy() tmp[j] = str(i) if int("".join(tmp)) > 999 and prime_numbs[int("".join(tmp))] and tmp != arr: result.append(tmp) return result t = int(sys.stdin.readline()) for _ in range(t): answer = 'Impossible' a,b = map(int,sys.stdin.readline().split()) visited = [False for _ in range(10000)] visited[a] = True q = [] a_arr = list(str(a)) b_arr = list(str(b)) heappush(q,[0,a_arr]) while q: cnt, now = heappop(q) if now == b_arr: answer = cnt break change_arr = change_num(now) for num in change_arr: if not visited[int("".join(num))]: visited[int("".join(num))] = True heappush(q,[cnt+1, num]) print(answer) 매 번 소수 여부를 체크하지 않고, 1000부터 9999까지 소수 여부를 표시한 배열을 만들었다. change_num() 함수는 특정 수에서 1자리만 바꾼 수이다. 배열에 넣을 때, 몇 번 바뀌었는지를 함께 넣고 최소힙을 이용하여 최대한 적게 바꿀때를 찾을 수 있도록 했다. ...

2024년 4월 3일 · 2 분 · 배준수

엔드유저 관점에서 로직 생각하기

Today I Learned 날짜 2024년 4월 2일 화요일 내용 엔드유저의 진입에 따라 발생해야 할 데이터와 로직들을 고민했다. 세그먼트 Shopify에서 고객들을 특정 기준에 따라 세그먼트로 묶어 관리할 수 있다. 이메일 입력 여부, 지역, 국가, 주문량 등등.. 어제의 고민은 “미션을 통과하여 쿠폰을 사용할 자격이 생긴 사람”을 세그먼트로 관리하기 부적절하다는 것이었는데, 기획에 대한 이해가 부족하여 생긴 오류였다. 내 생각의 전제조건은 쿠폰을 받은 유저가 로그인이 되있어야 한다는 것이다. 하지만 쿠폰 발급과 고객의 로그인 여부는 연관이 없다. 로그인을 요구하는 시점은, 쿠폰을 사용할 때 뿐이다. 따라서 이 쿠폰을 사용하는 사람을 한정짓는 조건은 “회원가입하여 로그인이 되어있는 사람”이다. ...

2024년 4월 2일 · 3 분 · 배준수