얕고 낮은 지식과 고민

Today I Learned 날짜 2023년 12월 18일 월요 내용 데모 어드민 페이지 만들기 지난 주에 했던 회고대로, 데모로 설정할 어드멘 계정을 환경변수로 설정할 이유가 없었다. 슈퍼관리자 페이지에 데모 계정을 설정 하는 기능을 만들고자 하였다. 그런데 내가 생각을 너무 얕게 했었다. 이 기능은 결국 DB에 현재 누가 데모 계정인지를 저장해야 한다. 이에 따라 두가지 방법이 떠올랐다. 데모 계정을 표시하는 새로운 테이블을 생성한다. 기존 계정(혹은 샵)이 저장된 테이블에 데모임을 표시하는 새로운 Column을 추가한다. 두 경우 모두 일이 생각보다 많이 커질 것 같았다.. 데모 계정 하나를 등록하자고 새로운 테이블을 만드는 것도 비효율적이라고 생각했고, 기존에 존재하는 Table을 수정하는 것은 더 최악으로 느껴졌다. 괜히 내가 잘 할 자신이 없어서 겁 먹은 건지, 진짜 이 방법들이 효용성이 떨어지는 지 확인받았다. ...

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

파이썬 알고리즘 : 숫자의 표현

2023년 12월 18일 알고리즘 문제풀이 문제 숫자의 표현 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 def solution(n): answer = 1 if n == 1 or n == 2: return answer tmp = 3 while tmp <= n: if not n%tmp: answer += 1 tmp += 2 return answer 처음엔 DP로 생각했다. 생각하다보니, DP 라면 이전 것들이 계속 더해지는 형태라는 의미인데, 결국 숫자가 너무 커질 것이라는 생각이 들었다. 따라서 DP를 이용하는 문제라면 어떤 수로 나눈 나머지를 기록하도록 문제가 나왔을거라고 생각이 들어서 DP가 아닌 규칙성을 찾기로 하였다. 홀수의 경우 절반으로 나눈 몫과 그 몫의 1을 더한 경우가 항상 존재한다. 예를 들어, 15일 때 절반으로 나눈 몫은 7임. 1은 더한 값 8과 함께 7+8=15 로 표현될 수 있다. 이 규칙은 모든 홀수에게 적용되지만, 모든 짝수에게는 적용될 수 없다. 연속된 두 개의 수는 하나는 홀수고 하나는 짝수기 때문에 결과가 홀수로만 나타나기 때문이다. 그래서 홀수 일 떄만 생각하면 된다고 판단하였다. 짝수일 떄는 0일 것이라고 생각했지만, 연속된 수는 1개만 있어도 되기 떄문에, 어떤 자연수든 자기 자신 1개로만 표현될 수 있다고 생각하여 짝수일 때는 항상 1을 반환하게 만들었다. 그 외의 홀수는 홀수로 나누면 된다고 생각했다. 예시에서 15는 4가지 경우가 있다. 15, 7+8, 4+5+6, 1+2+3+4+5 이 중 앞에 15와 7+8은 예외적인 경우로 따져서 규칙성에서 배제하였다. 1개로 나타내는 수는 앞서 말했듯 누구에게나 적용되는 규칙이고, 7+8은 홀수라면 무조건 적용되는 규칙이기 때문이다. 즉 4+5+6과 1+2+3+4+5 가 15가 가지는 규칙인데, 총 더해지는 숫자의 갯수가 홀수개라고 생각했다. 가운데 수를 기준으로 양쪽에 하나씩, 두개씩, 세개씩 붙는 규칙이라고 파악했다. (2n+1)로 나누었을떄 나누어 떨어지면 된다. 15는 3,5로 나누어떨어지니 저 2개가 규칙이 생긴 것이다. 같은 논리로, 17과 19는 그 다음 홀수인 7로 나누어 떨어지지 않기 떄문에 15와 같은 갯수를 가질 것이다. 반면 21은 7로 나누어 떨어지기 떄문에 한 가지 경우가 추가될 것이고, 그 이후 9로 나누어 떨어지는 수가 나타나면 또 추가될 것이다. 여기서 일부 예외가 발생하였는데, 짝수를 배제한 것이 잘못되었다. 예를 들어 1+2+3은 6이다. 내가 세운 가설에 의하면 6은 연속된 수를 6 자기 자신을 제외하곤 없지만, 막상 실제로는 존재한다. 따라서 짝수 홀수와 상관없이 (2n+1)로만 나누어지면 내가 만든 규칙에 적용될 수 있다고 생각하여 짝수, 홀수를 따지지 않았더니 해결되었다. ...

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

백운산 등반

생각보다 짧은 광교산 등반에 기고만장해져서 백운산까지 가보기로 했다. 계획대로만 됐다면 큰 무리는 아니었겠지만 예상외의 상황으로 몹시 힘들었다… 이 표지판을 보며 참 많은 고민을 했다.. 1.8KM… 까짓꺼 댕겨와보자 하는 마음으로 출발. 가는 길에 본 노루목 대피소. 안에 계신 부부가 간식을 드시고 계셨는데 보기 참 좋았다. 중간중간 표지판을 확인하며 계속 나아갔다. 내려가는 길이지만 기쁘지 않았다. 다시 올라와야 하잖아… 가을이라 그런지 확실히 을씨년스럽기도 하고, 분위기도 있고.. 낙엽이 참 많았다. ...

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

코드싸개

Today I Learned 날짜 2023년 12월 15일 금요일 내용 진행중인 Task가 마무리된듯 마무리 되지 않고 있다. 일사천리가 드문게 당연지사지만, 내가 미연에 방지할 수 있었을 텐데 그러지 못했다는게 문제다. 데모 사이트 만들기 이번주에 데모 관련된 작업을 마무리 하려고 했지만 다 못했다.. 형식상으론 마무리 되긴 했지만..? 어제 로딩페이지 관련된 CSS도 마무리 해서 테스트 서버에서 확인했는데, 코드와 관련해서 추가적으로 고칠 필요가 있었다. 우선 중복된 코드가 존재했다. 기존에 있던 로그인과 내가 새로 만든 데모용 로그인은 검증 성공시(엄밀히 말하면 데모 로그인엔 검증이 없지만) 똑같은 로직이었다. 복붙으로 만든 것이니 당연한 말이지만.. 따라서 성공 시 처리되는 로직을 새로운 함수로 분리시켰다. 5~6줄 정도 되는 짧은 로직이지만 그런 것들이 모여 전체 코드를 더럽게 만드는 거니까.. ...

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

파이썬 알고리즘 : 바탕화면 정리

2023년 12월 15일 알고리즘 문제풀이 문제 바탕화면 정리 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def solution(wallpaper): answer = [] files_x = [] files_y = [] n = len(wallpaper) m = len(wallpaper[0]) for i in range(n): for j in range(m): if wallpaper[i][j] == '#': files_x.append(i) files_y.append(j) answer.append(min(files_x)) answer.append(min(files_y)) answer.append(max(files_x)+1) answer.append(max(files_y)+1) return answer 처음엔 보고 조금 겁먹었지만 의외로 한번에 풀려버렸다. 존재하는 파일들을 모두 포함하는 드래그 중 가장 거리가 짧은 것을 찾기 위해 DFS나 BFS를 이용해야하나? 라는 생각을 했었다. 하지만 결국 존재하는 파일들의 x 좌표 값중 최솟값과 최댓값, y 좌표 중 최솟값과 최댓값만 찾으면 해결되는 문제였다. 조금 유의할 것은, 최댓값의 좌표에는 +1을 해주어야 한다. 파일의 좌측 상단 모서리를 기준으로하기 때문에 파일을 포함시키기 위해선 파일의 우측 하단 모서리까지 포함해야 한다. ...

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

파이썬 알고리즘 : 나머지가 1이 되는 수 찾기

2023년 12월 14일 알고리즘 문제풀이 문제 나머지가 1이 되는 수 찾기 난이도 Lv.1 코드 1 2 3 4 5 def solution(n): answer = 0 for i in range(2,n): if not (n-1)%i: return i

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

프론트 쫄보

Today I Learned 날짜 2023년 12월 14일 목요일 내용 테스트 서버에 데모버전 어드민 페이지 기능이 배포되었다. 환경변수 이전 TIL에서도 언급했듯, 유저에게 체험할 기회를 줄 데모 쇼핑몰과 데모 어드민 사이트는 우리가 환경변수로 계정 정보를 설정해야 했다. 이 계정 정보가 Shopify인지, 알파리뷰인지가 헷갈렸다. local에서 입력했던 정보로 알파리뷰와 Shopify 에서 각각 로그인했을 때, Shopify에서만 로그인이 되길래 Shopify 계정 정보라고 생각했다. 그런데, “우리가 Shopify 계정을 검증할 수 없는데 왜 받아야 하는가?”에 대해 대답할 수 없었다. 관련 코드를 열심히 찾다가 내가 간과했던 사실을 깨달았다. 데모버전 로그인에서는 비밀번호에 대한 검증 로직을 지웠다! 계정 정보를 우리가 설정한다는 이유로 지웠던 기억이 이제야 났다. 내가 테스트 했던 계정은 같은 ID로 알파리뷰와 Shopify에 모두 가입되어있다보니 헷갈렸던 문제였다. ...

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

이메일 송신 관련 로직

Today I Learned 날짜 2023년 12월 14일 수요일 내용 데모버전 어드민 페이지 생성과 관련된 PR의 머지를 기다리던 중, 새로운 Task를 받아 파악하고 있었다. Notification Email Activation 문제 인지 우리 서비스에선 소비자에게 보내는 메일이 다양한데, 이 중 하나가 무언가 통지하는 이메일이다. 3가지로 분류되는데, 회원이 아닌 사람이 작성한 리뷰에 인증(Verification)을 요구하기 위해 보내는 메일이 그 중 하나이다. 다른 2가지와는 다르게 이 기능에만 활성화(activation) 조절 기능이 없는 상황이라 만들어야 한다. 여기에, 활성화 조절 시 현재 발송될 예정인 메일들에 대한 조치를 묻는 과정도 추가해야 한다. ...

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

Session 이용하기

Today I Learned 날짜 2023년 12월 12일 화요일 내용 Session 현재까지 데모버전으로 로그인을 한다는 것은 우리가 원하는 계정(데모 스토어를 위한 계정)에 자동으로 로그인 해주는 것 외에는 딱히 차이가 없었다. 해당 스토어를 체험을 위해 잘 구성하기만 하면 되겠다고 생각했다. 하지만 어드민 페이지에서 기타 store나 account에 대한 setting을 변경할 수 있다는 문제를 인지했다. 꼭 critical 하지 않은 정보들도 있겠지만, 쇼핑몰의 위젯이나 리뷰 관련된 컨텐츠들만 제공해야할 데모 버전이기 떄문에 불필요한 수정을 방지하는 것이 필요하다고 생각했다. 내가 탐색해본 결과, 알파리뷰 어드민 페이지에서 Settings에 들어가는 버튼은 2곳에 있다. 좌 하단과 우측 상단 user 아이콘을 클릭하면 나타나는 버튼. 데모버전에서는, 이 둘을 무력화해야했다. ...

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

파이썬 알고리즘 : 멀리 뛰기

2023년 12월 12일 알고리즘 문제풀이 문제 멀리뛰기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 def solution(n): answer = 0 dp = [0 for _ in range(n+1)] for i in range(1,n+1): if i == 1: dp[i] = 1 elif i == 2: dp[i] = 2 else: dp[i] = (dp[i-1] + dp[i-2])%1234567 answer = dp[n] return answer n번째 칸은 ...

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