테스트 코드 작성

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

파이썬 알고리즘 : 가장 큰 수

2024년 4월 2일 알고리즘 문제풀이 문제 가장 큰 수 난이도 Lv.2 코드 1차 실패 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def check_first(s): if len(str(s)) == 1: return int(s) else: return int(str(s)[0]) def solution(numbers): n = len(numbers) answer = '' arr = [] for _ in range(10): arr.append([]) for num in numbers: tmp = check_first(num) arr[num].append(num) return answer 두 수 중 먼저 와야할 수는 가장 앞에 있는 수가 큰 수면 되겠다 싶었다. 그래서 모든 수를 맨 앞이 1인 수, 2인 수, … , 9인 수 까지 분류하려했다. 생각해보니 그 다음은? 그 안을 또 나누기엔 컴퓨터가 터지지 않을까? 수 두 개를 비교할 때, 길이는 중요하지 않다는 걸 파악했다. 그리고 가장 앞에 있는 수가 중요하다는 것도 캐치했다. 두번 째로 오는 수는 앞자리 수와의 비교가 중요하다. 예를 들어, 30,31,32 는 두 번째 자리가 0,1,2 로 모두 3보다 작으므로 그냥 ‘3’보다 늦게 올 애들이다. 반면 34,35 등은 3보다 더 앞에 나타나야 한다. 비교를 쉽게 하기 위해 앞자리를 복붙하면 되겠다고 생각했는데, 1000 이하이니 싹 다 3자리 짜리로 만들어주면 되겠다. ...

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

shopify 쿠폰을 위한 고객관리

Today I Learned 날짜 2024년 4월 1일 월요일 내용 리스트 디자이너는 실서버에 배포! 다음 스프린트를 진행중 쿠폰 이벤트를 완료한 인원에게 쿠폰을 제공해야 한다. Shopify Docs 를 참조하여 GraphQL을 참고하여 생성하는 과정에서 두 가지 문제에 봉착했다. 내가 기존에 계획한 로직은 스토어에서 고객이 수행해야 할 이벤트를 설정할 때, 사용 가능 인원이 지정되지 않은 쿠폰을 만들어 두는 것이었다. 좀 더 자세히는, 아무도 들어있지 않은 비어있는 고객 세그먼트를 생성한 후 , 할인 쿠폰에 배정할 계획이었다. 이 후 이벤트를 완료한 고객만 해당 세그먼트에 개별적으로 추가하여 쿠폰을 사용할 자격을 부여할 생각이었다. ...

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

파이썬 알고리즘 : n진수 게임

2024년 4월 1일 알고리즘 문제풀이 문제 n진수 게임 난이도 Lv.2 코드 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 def find_limit(a,b): # a를 b진법으로 바꿀 때 자릿수를 반환 idx = 0 while b**idx < a: idx += 1 return idx def change(k,m): # k를 m진법으로 변환하는 함수 max_val = find_limit(k,m) arr = [0 for _ in range(max_val)] for i in range(max_val): arr[i] = k//(m**(max_val-(i+1))) k -= arr[i]*(m**(max_val-(i+1))) return str(''.join(arr)) def solution(n, t, m, p): answer = '' arr = [] numbers = [str(i) for i in range(10)] + ['A', 'B', 'C', 'D', 'E', 'F'] n_numbers = numbers[:n] for i in range(m*t): num = change(i,n) print(num) return answer m명이 t개를 불러야 하므로 m*t까지 숫자를 구한다음, 모두 n진법으로 바꾸려 했다. 문자열로 조각내 배열에 담은다음 찾으면 될 듯 했다. 진법 변환을 못하겠다.. ...

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

shopify 쿠폰 만들기

Today I Learned 날짜 2024년 3월 29일 금요일 내용 스프린트 본격적으로 시작! 쿠폰 생성 이번 스프린트에서 쿠폰을 생성하는 부분을 맡았다. 아직 한 번도 다뤄본 적 없었던 부분이라 공부가 많이 될거라고 생각했는데, 역시나 머리가 흔들거린다(커서 그런거 아님). Shopify에는 PriceRule이라는 객체가 존재하는데, 이게 쿠폰의 설정모음? 같은 역할을 하는 듯하다. 내가 생성할 쿠폰들에 대한 설정이 여기에 담기고 실제 쿠폰은 DiscountCode라는 객체로 생성된다. 결론적으로, PriceRule은 쿠폰을 스토어의 입장에서 다루기 위한 객체고 DiscountCode는 고객이 받아 사용할 부분이라고 생각된다. ...

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

파이썬 알고리즘 : 다트 게임

2024년 3월 28일 알고리즘 문제풀이 문제 다트 게임 난이도 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 def solution(dartResult): idx = 0 scores = [] # while문 1회 마다 1차례의 결과를 체크 while idx < len(dartResult): # 점수 부분을 담을 변수 tmp = 0 # 문자열이 숫자 부분이라면 점수를 의미 if dartResult[idx].isdigit(): # 그 다음 문자도 숫자라면 10이라는 의미이므로 2글자 모두 담는다. if dartResult[idx+1].isdigit(): tmp = int(dartResult[idx]+dartResult[idx+1]) # 다다음 글자를 보기위해 index 증가 idx += 2 # 아니면 1자리 숫자이므로 1글자만 담는다. else: tmp = int(dartResult[idx]) # 다음 글자를 보기위해 index 증가 idx += 1 # 알파벳이 나오면 보너스를 의미 if dartResult[idx].isalpha(): if dartResult[idx] == 'D': tmp = tmp**2 elif dartResult[idx] == 'T': tmp = tmp**3 # 다음 글자를 살피기 위해 idx 증가 idx += 1 scores.append(tmp) # 옵션은 없을수도 있음 # 마지막 차례에 옵션이 없어서 더이상 글자가 없을 경우를 고려하여 예외처리가 필요 if idx >= len(dartResult): break # 옵션이 있다면 if dartResult[idx] in ['*','#']: # 스타상의 경우 가장 최근 점수의 2배 증가 if dartResult[idx] == '*': scores[-1] = 2*scores[-1] # 첫번째 다트 기회에 스타상이 나올 경우에는 그 이전 점수는 증가시키지 않음 # 따라서 그 이전 점수가 존재할때만 그것도 2배 증가 if len(scores) > 1: scores[-2] = 2*scores[-2] # 아차상은 그 전점수의 부호를 변경 else: if scores: scores[-1] = -1*scores[-1] idx += 1 return sum(scores)

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