객체와 자료 구조

책너두 5기 14일차 로버트 C. 마틴의 클린코드 p.123 ~ p.131 내용 정리 6. 객체와 자료 구조 디미터 법칙 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙. 즉, 객체는 조회 함수로 내부 구조를 공개하면 안된다. final String outputDir = ctxt.getoptions().getScratchDir().getAbsolutePath(); 위 코드는 디미터 법칙을 어겼다. 각 함수가 반환하는 객체의 함수를 호출하기 때문이다. 기차 충돌 위와 같은 코드를 기차 충돌(train wreck)으로 부른다. 길게 이어진 기차같은 이 코드는 다음과 같이 수정할 수 있다. ...

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

파이썬 알고리즘 : 숨바꼭질, 비밀번호, 등산

2023년 8월 15일 알고리즘 문제풀이 문제 1 백준 1697 문제 링크 1차 시도 나의 생각 처음엔 재귀나 피보나치 등 여러 방법을 고민했다. 결국 다이나믹 프로그래밍으로 푸는게 적절하다고 생각했다. 맨처음 n에서 1초후 갈 수 있는 곳은 2n, n+1, n-1 이다. 이들을 큐에 저장하고 이들까지 도달하는데 걸린 시간도 같이 저장한다. 이 큐에서 하나씩 순회하며 2배한 좌표, +1, -1 한 좌표에 시간을 업데이트하고 큐에 다시 저장하는 것을 반복했다. 하지만 예시를 입력하면 올바른 정답이 나오지 않았다. 디버깅해봐야겠다. ...

2023년 8월 15일 · 10 분 · 배준수

4. 분할정복

4.분할정복 4.3 점화식을 풀기 위한 치환 치환(Substitution)법 : 귀납 가정을 더 작은 문제에 적용할 때 추측한 해로 치환한다. 해의 모양을 추측한다. 상수들의 값을 찾아내기 위해 수학적 귀납법을 사용하고 그 해가 제대로 동작함을 보인다. 이 책에서는 결과로 나올 해의 모양을 추측하여 치환하는 것에 대한 설명이 많다. 하지만 실제로 양 변에서 공통된 모양을 추출하여 새로운 수열로 치환함으로서 풀 수 있는 점화식 이많다. 예시

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

형식 맞추기(3)

책너두 5기 13일차 로버트 C. 마틴의 클린코드 p.111 ~ p.122 내용 정리 5. 형식 맞추기 들여쓰기 계층에서 각 수준은 이름을 선언하는 범위이자 선언문과 실행문을 해석하는 범위이다. 들여쓰는 정도는 계층에서 코드가 자리잡은 수준에 비례한다. 들여쓰기한 파일은 구조가 한눈에 들어온다. 변수, 생성자 함수, 접근자 함수, 메서드가 금방 보인다. 들여쓰기 무시하기 한 행에 범위를 뭉뜽그린 코드를 피해야 한다. 간단한 if 문, 짧은 while 문 등에서도 마찬가지. 가짜 범위 빈 while문이나 for문은 피해야 한다. 필요하다면 빈 블록을 올바로 들여쓰고 괄호로 감싸야 한다. ...

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

파이썬 알고리즘 : 특정 거리의 도시 찾기, 미로 탐색, 사다리

2023년 8월 12일 알고리즘 문제풀이 문제 1 백준 18352 문제 링크 1차 시도 나의 생각 도시까지의 최단거리만 생각해야 하므로, bfs를 통해 도착한 도시에 얼마나 걸렸는지를 표시하고, 이를 방문표시로 이용하면 되겠다는 생각을 했다. 출발한 도시 와 도착지가 같을때는 0으로 표시하게 되는데, 이것 때문에 아직 방문처리하지 않은 것으로 취급되어 여러가지로 헷갈렸다. 따라서 제자리 거리를 1로 표시하여 모든 도시의 거리를 구하고 모두 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 import sys from collections import deque n, m, k, x = map(int, sys.stdin.readline().split()) graph = [[]for _ in range(n+1)] for _ in range(m): a, b = map(int, sys.stdin.readline().split()) graph[a].append(b) ans = [] visited = [0 for _ in range(n+1)] def bfs(s): visited[s] = 1 arr = deque() arr.append(s) while arr: now = arr.popleft() for next in graph[now]: if not visited[next]: arr.append(next) visited[next] = visited[now]+1 bfs(x) ans = [] if k == 0: print(x) else: for i in range(1, n+1): visited[i] -= 1 if i == x: continue if visited[i] == k: print(i) ans.append(i) if not ans: print(-1) 문제 2 백준 2178 문제 링크 ...

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

형식 맞추기(2)

책너두 5기 12일차 로버트 C. 마틴의 클린코드 p.103 ~ p.110 내용 정리 5. 형식 맞추기 종속 함수 한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 가능하면 호출하는 함수를 호출되는 함수보다 먼저 배치한다. 상수를 알아야 마땅한 함수에서 실제로 사용하는 함수로 상수를 넘겨주는 방법은 좋다. 개념적 유사성 개념적인 친화도가 높은 함수는 가까이 배치한다. 한 함수가 다른 함수를 호출해 생기는 직접적인 종속성, 변수와 그 변수를 사용하는 함수, 비슷한 동작을 수행하는 일군의 함수 등. ...

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

파이썬 알고리즘 : 다리 놓기, D-DAY, 그룹 단어 체커

2023년 8월 11일 알고리즘 문제풀이 문제 1 백준 1010 문제 링크 1차 시도 나의 생각 결국 서쪽에 있는 사이트는 모두 사용 되야 하므로 첫번째 사이트부터 고를 수 있는 상황에 대해 dfs를 적용하고 모든 다리가 결정될 때마다 카운트하는 방법을 생각했다. 그런데 가만 생각해보니 다리끼리 교차될 수 없으므로 동쪽의 사이트 중 서쪽의 사이트의 갯수만큼 선택하면 다리가 연결되는 경우의 수는 한개 뿐이다. 따라서 조합(Combination)을 사용하면 되겠다고 판단했다. 모듈을 까먹어서 그냥 직접 구현했다. 결과 정답 ...

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

형식 맞추기(1)

책너두 5기 11일차 로버트 C. 마틴의 클린코드 p.95 ~ p.102 내용 정리 5. 형식 맞추기 처음 코드를 봤을 때 깔끔하고 일관적이며 꼼꼼한 코드로 보여야 한다. 그러기 위해선 규칙을 따라야 한다. 형식을 맞추는 목적 분명히 코드 형식은 중요하다. 오늘 구현한 기능이 다음 버전엣 ㅓ바뀔 확률은 아주 높다. 따라서 오늘 작성한 코드의 가독성은 미래에도 영향을 끼친다. 적절한 행 길이를 유지하라 파일의 세로 길이가 조금만 차이나도 실제 파일의 크기는 크게 달라진다. 비교적 적은 줄의 파일로도 커다란 시스템을 구축할 수 있다. 반드시는 아니지만 바람직한 규칙이다. ...

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

주석(3)

책너두 5기 10일차 로버트 C. 마틴의 클린코드 p.84 ~ p.94 내용 정리 함수나 변수로 표현할 수 있다면 주석을 달지 마라 명명법을 올바르게 사용하여 주석의 필요성을 없애자. 위치를 표시하는 주석 // Actions //////////// 같은 배너 아래에 모아두는 것은 필요할 때도 있지만 극히 드물게 사용해야 한다. 닫는 괄호에 다는 주석 차라리 함수를 줄이는데 시간을 쓰자 저자를 표시하는 주석 준수가 작성함은 소스 코드 관리 시스템이 있는 한 무의미한 주석이다. 주석으로 처리한 코드 내가 주석으로 처리하면, 다른 사람은 지우기를 주저 한다. 이전의 기록은 소스 코드 관리 시스템이 한다. 지금 필요없으면 지우자. 기록은 존재한다. ...

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

파이썬 알고리즘 : 연산자 끼워넣기, 빙산, 구슬 찾기

2023년 8월 10일 알고리즘 문제풀이 문제 1 백준 14888 문제 링크 1차 시도 나의 생각 각 경우에 알맞은 연산을 처리한 후 재귀를 탔다. 정의한 dfs 재귀 함수는 몇번의 재귀를 탔는지, 각 연산이 몇번 남아있는지를 parameter로 받도록 정의하였다. 나눗셈은 음수일때는 양수로 변환한 후 결과에 음수를 다시 붙이도록 하였다. 결과 정답 코드 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 57 58 59 60 61 import sys n = int(sys.stdin.readline()) nums = list(map(int, sys.stdin.readline().split())) plus, minus, multiple, division = map(int, sys.stdin.readline().split()) arr = [] def dfs(tmp, cnt, a, b, c, d): if cnt == n: arr.append(tmp) return if a: tmp += nums[cnt] a -= 1 cnt += 1 dfs(tmp, cnt, a, b, c, d) cnt -= 1 a += 1 tmp -= nums[cnt] if b: tmp -= nums[cnt] b -= 1 cnt += 1 dfs(tmp, cnt, a, b, c, d) cnt -= 1 b += 1 tmp += nums[cnt] if c: tmp *= nums[cnt] c -= 1 cnt += 1 dfs(tmp, cnt, a, b, c, d) cnt -= 1 c += 1 tmp = tmp // nums[cnt] if d: if tmp >= 0: tmp = tmp//nums[cnt] else: r_tmp = abs(tmp)//nums[cnt] tmp = -1 * r_tmp d -= 1 cnt += 1 dfs(tmp, cnt, a, b, c, d) cnt -= 1 d += 1 if tmp >= 0: tmp = abs(tmp)*nums[cnt] else: r_tmp = abs(tmp)*nums[cnt] tmp = -1 * r_tmp dfs(nums[0], 1, plus, minus, multiple, division) print(max(arr)) print(min(arr)) 문제 2 백준 2573 문제 링크 ...

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