함수(2)

책너두 5기 7일차 로버트 C. 마틴의 클린코드 p.57 ~ p.66 내용정리 명령과 조회를 분리하라! 함수는 뭔가를 수행하거나 답하거나 둘 중 하나만 해야한다. public boolean set(String attribute, String value); if (set("username", "unclebob"))... 대신 1 2 3 4 if (attributeExists("username")) { setAttribute("username", "unclebob"); ... } 로 명확하게 해서 혼란을 주지 말자. 오류 코드보다 예외를 사용하라! 오류 코드를 반환하면 명령/조회 분리 규칙이 위반된다. ...

2023년 8월 7일 · 2 분 · 배준수

2023년 7월 5주차 주간 기록

주간기록 날짜 2023년 7월 31일 ~ 2023년 8월 6일 계획 매일 오전(9시 ~ 11시 30분) 알고리즘 3문제 풀기 Geek News 읽기 오후(12시 30분 ~ 17시 30분) 월 : 정글에서 배운 내용 복습 화 : CS & 백엔드 공부 수 : 정글에서 배운 내용 복습 목 : CS & 백엔드 공부 금 : 알고리즘 이론 공부 토, 일 : 미진한 내용 보충 밤(18시 30분 ~ 23시) 월, 화, 목, 금 : 원티드 프리온보딩 백엔드 과제 수 : 알고리즘 스터디 결과 오전에 Geek 뉴스를 자꾸 빼먹음 알고리즘 난이도에 따라 시간의 편차가 너무 큼 오후 공부 양이 너무 부족함 WIL 알고리즘 문제풀이 Express 와 MySQL을 연동한 로그인 네트워크의 기본 용어 알고리즘 이론 Strassen algorithm 회고 하기로 한 공부들을 한번 씩은 건드려 봤지만 이 속도로는 많이 부족할 것 같다. 알고리즘에 시간이 많이 소모되고 있지만 그렇다고 알고리즘을 많이 푸는 것 같지도 않아서 걱정이다. 언제 끝나나 생각할 시간에 오늘 하루 할 일을 다 했나 스스로 냉정하게 평가하자. 월요일부터 일요일 까지 주 7회 도서관이 여는 9시에 들어가서 닫는 10시에 나오고 있다. 앉아있는 시간에 만족하지 말고, 그 시간이 얼마나 값어치 있는지에 집중해야겠다. 언젠간 좋은날 오겠지.. ...

2023년 8월 6일 · 1 분 · 배준수

4. 분할정복

4.분할정복 4.2 행렬곱셈을 위한 스트라센 알고리즘 행렬의 곱셈은 다음과 같다 1 2 3 4 5 6 7 8 n = A.rows C는 새로운 n x n 행렬이라 하자. for i - 1 to n for j = 1 to n c_ij = 0 for k = 1 to n c_ij = c_ij + (a_ik)(b_kj) return C 3중 반복문이기 때문에 수행시간 Θ(n^3)이다. Ω(n^3)이라고 예상하지만 사실 o(n^3) 방법이 있따. ...

2023년 8월 6일 · 7 분 · 배준수

기술면접 후기

면접 결과 정리 주제 1 커리어 1. 왜 전공과 다른 개발자의 길을 걷게 되었나? 기존 전공과 관련된 업계의 분위기와 맞지 않았습니다. 우연한 기회로 시작했는데 적성에 맞는 듯 하여 재밌게 하고 있습니다. 엉덩이 오래 붙이고 앉아서 고민하고 코드로 씨름하는 것에 자신 있습니다. 2. SW 사관학교 정글은 어떻게 들어가게 되었나? 경험해본 친구의 추천이 있엇습니다. 나도 단기간 집중하여 성장에 몰입한다는 면에서 매력을 느꼇습니다. 3. 개발 공부를 시작한 이후로 가장 힘들었던 챌린지는 무엇인가? 개발 관련 공부가 되있지 않은 상태로 부트캠프에 들어가 살아남는 것 자체가 가장 어렵고 힘든 챌린지였음. 기초부터 가르쳐주는 것이 아니라 전산학과 관련된 내용들이 많다보니 남들에게 당연한 것을 새로 배우고 이해하는 것이 힘들었습니다. ...

2023년 8월 6일 · 6 분 · 배준수

함수(1)

책너두 5기 6일차 로버트 C. 마틴의 클린코드 p.46 ~ p.56 내용정리 3. 함수 함수 당 추상화 수준은 하나로! 추상화 수준이 섞이면 안된다. 위에서 아래로 코드 읽기: 내려가기 규칙 다음 함수로 나아갈 수록, 추상화 수준이 낮아져야 한다. SWITCH 문 짧게 만들기 힘들지만 최대한 적게 쓰고, 반복을 줄인다. before 1 2 3 4 5 6 7 8 9 10 11 12 13 public Money calculatePay(Employee e) throws InvalidEmployeeType { switch (e.type) { case COMMISSIONED: return calculateCommissionedPay(e); case HOURLY: return calculateHourlyPay(e); case SALARIED: return calculateSalariedPay(e); default: throw new InvalidEmployeeType(e.type); } } after ...

2023년 8월 5일 · 2 분 · 배준수

의미있는 이름(2)

책너두 5기 5일차 로버트 C. 마틴의 클린코드 p.35 ~ p.45 내용 정리 2장 의미있는 이름 의미 있는 맥락을 추가하라 state만 보고는 주소인지, 상태인지 알 수없다. addrstate면 주소에서 ‘주’를 뜻한다는 것을 파악할 수 있다. 예시) 맥락이 불분명한 함수 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 private void printGuessStatistics(char candidate, int count) { String number; String verb; String pluralModifier; if (count = 0) { number = "no"; verb = "are"; pluralModifier = "s"; } else if ( count == 1) { number = "1"; verb = "is"; pluralModifier = ""; } else { number = Integer.toString(count); verb = "are"; pluralModifer = "s"; } String guessMessage = String.format( "There %s %s %s%s", verb, number, candidate, pluralModifier ); print(guessMessage); } GuessStatisticsMessage 클래스를 만든 후 세 변수를 넣는다. ...

2023년 8월 4일 · 5 분 · 배준수

파이썬 알고리즘 : DFS와 BFS, 연결 요소의 개수, 바이러스

2023년 8월 4일 알고리즘 문제풀이 백준 1260 문제 링크 1차 시도 나의 생각 오랜만에 dfs, bfs라 당황했다. 우선 2차원 배열로 그래프를 그린 후 두 정점 사이의 간선이 있으면 1, 없으면 0으로 표현했다. 그리고 방문한 정점을 표시하기 위한 배열도 만들었다. dfs는 이동할 수 있는 다음 정점으로 재귀를 통해 확인하는 과정을 거쳤다. bfs는 현재 정점에서 이동할 수 있는 정점 모두를 deque에 담은 후 popleft하면서 각각마다 그 다음 목적지를 확인하였다. bfs를 큐로 관리하는 것이 기억해내느라 푸는데 시간이 촉박했다. ...

2023년 8월 4일 · 3 분 · 배준수

하늘과 바람과 별과 인간

하늘과 바람과 별과 인간 원자에서 인간까지 지은이: 김상욱 출판사: 바다출판사 감상 고등학교 졸업한지 10년이 지났지만 이과였고, 변리사 공부를 하면서 물리, 화학, 생물, 지구과학 공부도 했었는 지라 거진 다 아는 내용이긴 했다. 또 유튜브에서 과학 관련된 영상을 보는 것도 좋아하고.. 혹여나 과학이 생각만 해도 졸린다거나, 어려워서 머리가 아프다거나, 이해가 안된다는 걱정에 이 책을 망설인다면 추천하고 싶다. 이 책은 과학을 말해주는 책이지, 왜 그런지를 이해시키는 책이 아니기 때문이다. 전자와 관련하여 오비탈 이론이 뭐고, 양자역학이 뭐고 이해할 필요 없다. 물론 나도 그런책이였으면 안읽었을 것이긴 하지만.. ’ 아 전자라는게 그런거구만 ‘, ’ 아 전자가 거기 있구만 ’ 을 가볍게 충족시켜주는 책이다. 요즘 상식논란도 많고, 상식 퀴즈라며 몽골의 수도가 울란바토르니 어디니 하지만 이 책도 삶을 풍요롭게 헤주는 상식을 위한 책이니 권한다. ...

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

의미있는 이름(2)

책너두 5기 4일차 로버트 C. 마틴의 클린코드 p.24 ~ p.34 내용 정리 그릇된 정보를 피하라 이름을 지을 때 비슷한 이름으로 헷갈리게 하거나, 실제 List가 아닌데 list를 넣거나, 소문자l과 대문자 O 등으로 헷갈리게 해선 안된다. 의미 있게 구분하라 다른 이름을 지을 때 명확히 구분되도록 이름을 차별화해라. a1,a2,a3 라던가, customor와 customerobject처럼 어떤 차이인지 모르도록 해선 안된다. 발음하기 쉬운 이름을 사용하라 팀 프로젝트다보니 대화를 나눠야 하는데 한 글자씩 말해야 하면 불편하다. 읽고 발음할 수 있는 단어를 사용해라. ...

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

파이썬 알고리즘 : 트리 순회, 이진 검색 트리, 최소 스패닝 트리

2023년 8월 3일 알고리즘 문제풀이 백준 1991 문제 링크 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 53 54 55 56 import sys arr = [] n = int(sys.stdin.readline()) for _ in range(n): p, l, r = sys.stdin.readline().rstrip().split() arr.append([p, l, r]) front = ['A'] mid = [] back = [] def search_front(node, arr, ans): for x in arr: if x[0] == node[0]: if x[1] != '.': ans.append(x[1]) search_front(x, arr, ans) if x[2] != '.': ans.append(x[2]) search_front(x, arr, ans) def search_mid(node, arr, ans): for x in arr: if x[0] == node[0]: if x[1] != '.': search_mid(x, arr, ans) else: ans.append(x[0]) if x[2] != '.': search_mid(x, arr, ans) break def search_back(node, arr, ans): for x in arr: if x[0] == node[0]: if x[1] != '.': search_back(x, arr, ans) else: ans.append(node) if x[2] != '.': search_back(x, arr, ans) ans.append(x) ans.append(node[0]) search_front(arr[0], arr, front) search_mid(arr[0], arr, mid) search_back(arr[0], arr, back) print(front) print(mid) print(back) 2차 시도 나의 생각 정답을 위한 배열에는 항상 부모만 넣는다는 기준을 세웠다. 또 왼쪽자식과 오른쪽 자식의 탐색을 if-else 조건문을 사용하였는데 별개로 하였다. 즉 왼쪽 자식을 먼저 탐색해 존재하면 재귀를 통해 최대한 깊숙히 들어간 후 더이상 왼쪽자식이 존재하지 않을 때 그 때의 부모노드를 배열에 추가하면 전체 트리에서 가장 왼쪽에 있는 노드를 배열에 추가한 것으로 구현된다는 것을 깨달았다. 순회의 방식에 따라 왼쪽 자식 탐색, 부모노드 삽입, 오른쪽 자식 탐색의 순서만 변경해주었다. ...

2023년 8월 3일 · 9 분 · 배준수