파이썬 알고리즘 : 개인정보 수집 유효기간

2023년 12월 04일 알고리즘 문제풀이 문제 개인정보 수집 유효기간 난이도 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 def solution(today, terms, privacies): answer = [] today_y, today_m, today_d = today.split('.') today_y = int(today_y) today_m = int(today_m) today_d = int(today_d) def check(y,m,d,t): ans = True m += t while m > 12: y += 1 m -= 12 if y > today_y: ans = False elif y == today_y: if m > today_m: ans = False elif m == today_m: if d > today_d: ans = False return ans arr = dict() for x in terms: term_type, term_months = x.split() arr[term_type] = int(term_months) for i in range(len(privacies)): privacy_date, privacy_type = privacies[i].split() privacy_y, privacy_m, privacy_d = privacy_date.split('.') tmp = check(int(privacy_y),int(privacy_m),int(privacy_d),arr[privacy_type]) if tmp: answer.append(i+1) return answer 기존에는 check() 함수 내의 while문이 존재하지 않았고, if 문을 통해 한번만 로직을 거치도록 했다. 하지만 유효기간이 2년 이상 된다면 12를 여러번 빼서 해를 몇번 넘겨야 할 수도 있기 때문에, 반복문이 필요했다. 유효기간을 더해봤자 2년 이하 일 것이라고 생각한 것이 실수였다. ...

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

파이썬 알고리즘 : 가장 큰 정사각형 찾기

2023년 12월 03일 알고리즘 문제풀이 문제 가장 큰 정사각형 찾기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def solution(board): answer = 1 p = len(board) q = len(board[0]) dp = [[0 for _ in range(q)] for _ in range(p)] dp[0] = board[0] for i in range(p): dp[i][0] = board[i][0] for a in range(p): for b in range(q): if a-1>=0 and b-1>=0 and board[a][b]==1: dp[a][b] = min(dp[a-1][b-1],dp[a-1][b],dp[a][b-1])+1 answer = max(answer,dp[a][b]) return answer*answer 위 코드는 정확성은 통과했지만 효율성에서 문제를 겪었다. 이 로직은 board 상 1인 좌표마다 검사를 해 가장 큰 사각형의 한 변의 길이가 몇인지 모두 탐색한다. board의 좌표 갯수는 1000000 인데, 이를 평균적으로 500개씩 탐색하면 500000000(5억)이나 수행해야 한다. 결국 아래처럼 고쳐 통과되었다. ...

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

파이썬 알고리즘 : 짝수와 홀수

2023년 12월 02일 알고리즘 문제풀이 문제 짝수와 홀수 난이도 Lv.1 코드 1 2 3 4 5 6 def solution(num): if num%2: answer = 'Odd' else: answer = 'Even' return answer

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

테스트 코드 완성!

Today I Learned 날짜 2023년 11월 30일 목요일 내용 계속해서 테스트 코드를 고쳤고 2차로 완성했다. 화요일에 완성했다고 판단하여 PR을 올렸는데, 그떄 받은 코멘트를 피드백하여 수정했다. 여러 오류들을 수정해가는 과정을 정리하였다. 모든 경우를 순환 위젯을 생성하는 함수를 테스트해야 했다. 위젯의 종류와 설치 위치에 따라 다양한 경우의 수가 존재할 수 있는데, 기존에는 무작위로 하나를 골라 테스트하고 결과를 도출시켰다. 이것을 pytest.mark.parameterize를 이용해 모든 경우의 수를 검증하도록 수정하였다. 위젯 타입에 대한 클래스가 워낙 많았고 실제로는 다르게 처리되야 할 타입들도 존재하다보니 오류가 발생하였다. 따라서 어떤 타입들이 살짞 다른 로직을 거쳐야 하는지 파악하였다. 결정적으로, 검증 대상은 위젯 타입의 이름을 포함하는 html 파일이 존재 하는가를 기준으로 성공 여부를 판단하고 있었다. ...

2023년 11월 30일 · 2 분 · 배준수

수박 겉 핥는척 하기

Today I Learned 날짜 2023년 11월 29일 수요일 내용 테스트 코드를 수정하는데 같은 곳을 맴돌고 있다. 어떤 WidgetType 들이 에러릴 일으키고 있는데, 속성에 알맞은 값을 매칭시키지 못한 것이 원인인지, 아예 생성 시 제외시켜야 할지 로직을 파악 못하니 헤매고 있다. 회고 이거 해내면 기분 진짜 날라갈듯.

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

열심히 아무것도 못하기

Today I Learned 날짜 2023년 11월 28일 화요일 내용 테스트 코드 작성을 완료하고 PR을 올렸다. 코드에 대한 리뷰를 받고 재수정에 들어갔다. Pull Request 글로벌 개발팀 내에서 지킬 규칙에 대힌 회의가 있었다. commit과 PR 형식, 코드 작성과 formatting 등등 여러가지에 관해서.. 지금 버릇을 잘 들여놔야 나중에 나도 팀원들도 고생 안하지 않을까 싶다. Test Data 테스트 코드를 작성하는데 있어서 가장 까다로운 것은 적절한 테스트 데이터를 만드는 것이다. 어떤 필드를 채워야 할지, 어떤 객체 혹은 JSON 형식을 취해야 할지 등 여러모로 참 머리아프다. 이것저것 쑤셔넣다보면 계속 같은 곳을 맴돌게 되니 차근차근 가설을 세워나가면서 해결해야겠다. ...

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

파이썬 알고리즘 : 3 x n 타일링

2023년 11월 28일 알고리즘 문제풀이 문제 3 x n 타일링 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def solution(n): dp = [0 for _ in range(5001)] dp[2] = 3 dp[4] = 11 for i in range(1,n+1): if n%2: return 0 if i%2: continue else: if not dp[i]: tmp = 2 tmp += dp[i-2]*dp[2] for x in range(2,i//2): tmp += dp[i-2*x]*2 dp[i] = tmp%1000000007 return dp[n] 진짜 어렵다. 홀수는 나올수 없으므로 무조건 0이라는 것은 일찍 발견했다. 하지만 일반항을 위한 점화식을 구하기가 어려웠다. 처음에 한 추론은 다음과 같다. ...

2023년 11월 28일 · 2 분 · 배준수

테스트 코드 만들기

Today I learned 날짜 2023년 11월 27일 월요일 내용 테스트 코드를 고쳤다. 근데 제대로 된 건지 모르겠다.. 반복 실행해서 일관성도 확인해보고, 원하는 검증이 이뤄진건지 로직도 다 확인해봐야 한다. 테스트 함수 1 TypeError 메시지로 보아 어떤 변수가 특정 함수 의 parameter로 없는 것으로 예상된다. 실제로 저 메서드를 찾아가보니 없길래 테스트 코드에서도 삭제해주었다. parameter로 들어간 값을 schemas 파일에서 Type 클래스를 가져와 그중 1개를 선택하도록 변경하였다. 메서드 내의 다른 함수의 반환 타입이 예상과 다르다는 오류가 발생했다. ...

2023년 11월 27일 · 3 분 · 배준수

파이썬 알고리즘 : 공원산책

2023년 11월 27일 알고리즘 문제풀이 문제 공원산책 난이도 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 def solution(park, routes): H = len(park) W = len(park[0]) a = 0 b = 0 for i in range(H): for j in range(W): if park[i][j] == 'S': a = i b = j def check(p,q,x,y): for i in range(1,q+1): if p == 'N': if x-i < 0 or park[x-i][y] == 'X': return False elif p == 'S': if x+i >= H or park[x+i][y] == 'X': return False elif p == 'E': if y+i >= W or park[x][y+i] == 'X': return False elif p == 'W': if y-i < 0 or park[x][y-i] == 'X': return False if p == 'N': return x-q,y elif p == 'S': return x+q,y elif p == 'E': return x,y+q elif p == 'W': return x,y-q i = 0 while i < len(routes): way_to_go, distance_to_go = routes[i].split() if not check(way_to_go,int(distance_to_go), a,b): i += 1 continue a,b = check(way_to_go,int(distance_to_go), a,b) i += 1 return [a,b] 어렵진 않은데 좀 귀찮고.. 그렇다. 그래도 이런 문제 많이 풀어서 어렵진 않다. 레벨이 1인 이유는 문제에서 따져야 하는 경우를 모두 설명해줘서 그런듯 하다. ...

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

광교산 등반

2023년 10월 31일에 광교산으로 등산을 다녀왔다. 그동안 취업하느라 머리에 쌓인 것들도 내려놓을겸, 그동안 책상에 앉아있기만 했었기 때문에 몸도 한번 고생시킬겸 다녀왔다. 광교산이 가까이 있는 산 중에 제일 유명하면서, 적당한 높이에 적당히 먼 위치라서 딱 좋았다. 더 멀리, 높은 산을 가기엔 썩어버린 몸으로 무리였다. 첫 출근에 휠체어를 끌고싶지 않다. 늦잠자는 바람에 조금 늦긴했지만, 신분당선의 가장 끝인 광교역(광교 중앙역 아님)에 도착했다. 사람들을 따라 나오면 아래와 같은 표지판을 볼 수 있다. ...

2023년 11월 26일 · 2 분 · 배준수