프로그래밍

프로그래밍

API, 서비스, 도메인 테스트 및 TDD 에서의 기어비

API, 서비스, 도메인 테스트 및 TDD 에서의 기어비 테스트 필요 이유 테스트가 있으면 시스템 변경에 두려움이 적어진다. 하지만, 너무 많은 테스트는 코드 변경마다 테스트 코드도 같이 변경되어야 하는 문제가 있다. 테스트의 목적은 코드 변경에서 시스템의 특성을 강제로 유지하기 위해서다. API 테스트를 작성하면 도메인 모델을 변경할 때 테스트 코드 변경의 양을 줄일 수 있다. 테스트 종류에 따른 얻는 것 구분 API 테스트 서비스 테스트 도메인(모델) 테스트 피드백 적음 - 많음 변경 장벽 낮음 - 높음 테스트 영역 넓음 - 한정 도메인(모델) 테스트 코드와 더 밀접하게 연관되어 작업시 높은 피드백을 받을 수 있다. 테스트 코드를 통해서 도메인에 대한 이해도를 높일 수 있다. API 테스트 더 높은 ..

프로그래밍/알고리즘

[백준] 4963 파이썬(python)

문제 https://www.acmicpc.net/problem/4963 4963번: 섬의 개수 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도 www.acmicpc.net 문제 풀이 import collections import sys dx = [-1, 0, 1, 1, 1, 0, -1, -1] dy = [-1, -1, -1, 0, 1, 1, 1, 0] def bfs(graph, y, x): graph[y][x] = 0 queue = collections.deque([(y, x)]) while queue: yy, xx = queue.popleft() for..

프로그래밍/알고리즘

[백준] 2468 파이썬(python)

문제 https://www.acmicpc.net/problem/2468 2468번: 안전 영역 재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 www.acmicpc.net 문제 풀이 import collections import sys dx = [0, 1, 0, -1] dy = [-1, 0, 1, 0] N = int(sys.stdin.readline().strip()) MAX_VALUE, MIN_VALUE = 0, 0 maps = [] for _ in range(N): case = list(map(int, sys.stdin.readline().split())) MIN..

프로그래밍/알고리즘

[백준] 1697 파이썬(python)

문제 https://www.acmicpc.net/problem/1697 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net 문제 풀이 import sys from collections import deque n, k = map(int, sys.stdin.readline().split()) MAX = (10 ** 5) def bfs(root, find): distance = [0] * (MAX+1) queue = deque([root]) while queue: x = queue.pople..

프로그래밍/알고리즘

[백준] 11403 파이썬(python)

문제 https://www.acmicpc.net/problem/11403 11403번: 경로 찾기 가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 풀이 import sys N = int(sys.stdin.readline()) maps = [list(map(int, sys.stdin.readline().split())) for _ in range(N)] for k in range(N): for y in range(N): for x in range(N): if maps[y][k] and maps[k][x]: maps[y][x] = 1 for m in maps: print(' ..

프로그래밍/알고리즘

[백준] 9372 파이썬(python)

문제 https://www.acmicpc.net/problem/9372 문제 풀이 import collections import sys T = int(sys.stdin.readline()) def bfs(graph, i, visited, count): # visited[i] = 1 queue = collections.deque([i]) while queue: node = queue.popleft() if visited[node] == 0: visited[node] = 1 count += 1 queue.extend(graph[node]) return count for _ in range(T): N, M = map(int, sys.stdin.readline().split()) graph = [[] for _..

프로그래밍/알고리즘

[백준] 7569 파이썬(python)

문제 https://www.acmicpc.net/problem/7569 7569번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, www.acmicpc.net 문제 풀이 import collections import sys M, N, H = map(int, sys.stdin.readline().split()) tomato = [[] for _ in range(H)] queue = collections.deque([]) for h in range(H): for y in range(N): temp = list(map(int, s..

프로그래밍/알고리즘

[Python] 백준 11724 - 연결 요소의 개수

문제 https://www.acmicpc.net/problem/11724 11724번: 연결 요소의 개수 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 노드별로 방문 결과에 대해 방문결과 값을 업데이트 하고 방문결과가 있는 노드는 skip 하고 방문 안한 노드는 방문해서 총 몇번 반복 되는지 문제 풀이 import sys from collections import deque N, M = map(int, sys.stdin.readline().st..

프로그래밍/알고리즘

[Python] 백준 7576 - 토마토

문제 https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능하다. 입력 조건으로 토마토는 1개이상이 들어갈수 있기 때문에 bfs 실행 전에 토마토의 위치를 큐에 넣어줘야 한다. 그 이후에 bfs 함수에서 인접열 방문시에 0(익지않은 토마토) 값이라면 기준열 토마토가 익는데 걸리시간에서 +1일을 해준다. bfs 종료 후 만약 graph 내에 0이 아닌 값이 있다면 -1로 인해서 인접열 방문 실패한 경우..

프로그래밍/알고리즘

[Python] 백준 1012 - 유기농 배추

문제 https://www.acmicpc.net/problem/1012 1012번: 유기농 배추 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 graph[y][x] == 1 인 곳에서 검색을 시작하여 인접한 부분을 모두 0으로 변경한 뒤에 count++ 문제 풀이 import sys from collections import deque T = int(sys.stdin.readline().strip()) dx = [0, 0, 1, -1] dy = [1, -1, 0, 0] for _ in range(T): M, ..

프로그래밍/알고리즘

[Python] 백준 2667 - 단지번호붙이기

문제 https://www.acmicpc.net/problem/2667 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 graph[i][j] 가 1인 곳에서 검색을 시작해서 인접한 부분을 찾고 종료시 count return 문제 풀이 import sys from collections import deque N = int(sys.stdin.readline().strip()) boards = [] for _ in range(N): boards.append(list(map(int,..

프로그래밍/Clean Code

[Clean Code] 11-1 Concern

시스템 Concern (관심사) 시작 단계는 모든 앱이 풀어야하는 관심사(Concern) 이다. 관심사 분리는 오래된 가장 중요한 기법이다. 대다수의 앱은 시작 단계라는 관심사를 분리 하지 않고 준비 과정 코드를 주먹구구로 구현하고 심지어 런타임 로직하고도 섞인다. 다음은 대표적인 예다. class SomethingMain(object): ... def get_service() -> Service: if not self._service: self._service = MyService() return self._service def main(): ... service = self.get_service() ... ... 위는 초기화 지연 (Lazy Initialization) 혹은 계산 지연 (Laze Ev..

프로그래밍/Clean Code

[Clean Code] 10-2 응집도

응집도 클래스는 인스턴스 변수 수가 적어야 한다. 각 메소드는 클래스 인스턴스 변수를 하나 이상 사용해야 한다. 일반적으로 메소드가 인스턴스 변수를 더 많이 사용 할수록 메소드와 클래스는 응집도가 높다. 모든 인스턴스 변수를 메소드마다 사용한다면 응집도가 가장 높은 경우이다. 응집도가 높은 클래스는 바람직 하지 않지만 많은 개발자들이 응집도가 높은 클래스를 작성한다. 응집도가 높다는 말은 변수와 메소드가 서로 논리적으로 묶여 있다는 의미이기 때문이다. 아래는 클래스의 응집도가 매우 높은 케이스다. class Stack(object): _top_of_stack = 0 _elements = [] def size(self) -> int: return self._top_of_stack def push(self,..

프로그래밍/Clean Code

[Clean Code] 10-1 클래스

클래스 클래스 체계 클래스에서 static, public 변수는 위에 다음으로 private 변수 마지막으로 private object 가 나와야 한다. 클래스의 변수와 메소드는 가능한 공개하지 않는 편이 좋지만 때로는 접근을 허용해야 하는 경우가 있다. 따라서 그런 경우에는 protected 로 하거나 패키지내 공개 해야 한다. 하지만 가능한 그렇지 않게 작성 해야 한다. 클래스 이름 이름은 해당 클래스의 책임을 기술해야 한다.(명사로) 간결한 이름이 떠올리지 않는다면 책임이 많을 확률이 높다. 단일 책임 원칙(Single Responsibility Principle) 단일 책임 원칙은 모듈을 변경할 이유가 단 하나뿐이어야 한다는 원칙. 매우 지키기 쉽지만 많은 개발자들이 안지키는 원칙이다. 어떤 개발..

프로그래밍/Clean Code

[Clean Code] 9-3 깨끗한 테스트

단위 테스트 깨끗한 테스트 1. 테스트틑 빨라야 한다. 테스트가 느리면 테스트를 자주 못하고 자주 돌리지 못하면 결국 문제가 발생해도 코드 정리가 힘들어져 코드 품질이 망가지기 시작한다. 2. 독립적 각 테스트는 서로 독립적이여야 한다. 한 테스트가 다음 테스트가 실행될 한경을 기다려서는 안 된다. 테스트가 서로 의존하면 하나가 실패하면 연달아 실패하므로 결함 찾기가 힘들다. 3. 반복 가능 테스트는 Test, QA, Production 모두 사용 가능 해야 한다. 4. 자가 검증 테스트는 Boolean 으로 결과를 내야 한다. 즉 성공 아니면 실패 로 해야 한다. 5. 적시에 단위 테스트는 실제 코드 작성 전 구현해야 한다. 실제 코드를 구현하고 테스트 코드 작성시에는 테스트 코드로 작성하기가 어려울 ..

프로그래밍/Clean Code

[Clean Code] 9-2 도메인 특화 테스트

단위 테스트 도메인 특화 테스트 앞서 9-1 에서 구현간 기법으로 주로 API 위에다 함수와 유틸리티를 구현한 후 테스트 코드를 작성함으로 코드작성과 높은 가독성을 가진다. 테스트 코드는 쉽고 간결하고 이해하기 쉽게 해야하지만 효율성의 측면에서는 효율적일 필요는 없다. 온드가 급격하게 떨어지면 경보, 온풍기, 송풍기가 모두 가동 되는지 확인하는 코드. func TestTurnOnLoTempAlramAtThreashold(t *testing.T) { hardware.SetTemp(WayTooCold) controller.Tic() tests.AssertEqual(t, hardware.HeaterState(), true) tests.AssertEqual(t, hardware.BlowerState(), tru..

프로그래밍/Clean Code

[Clean Code] 9-1 TDD

단위 테스트 TDD, Test Driven Development 첫째, 실패하는 단위 테스트를 작성할 때까지 서비스 코드를 작성하지 마라. 둘째, 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성 하라. 셋째, 현재 실패하는 테스트를 통과할 정도의 서비스 코드를 작성 하라. 이렇게 일을 하면 테스트 수천개의 케이스가 생기는데 이를 전부 다 방치를 하면 서비스 코드와 맞먹을 정도의 규모가 되는데 이는 심각한 관리문제를 야기한다. 깨끗한 테스트 코드 테스트 코드는 가독성이 중요하다. 변경 전은 addPage와 assertSubString를 부르는라 중복되는 코드가 매우 많다. 자질구레한 사항은 없애고 테스트 코드 표현의 중점하자. public void testGetPageHieratch..

프로그래밍/Clean Code

[Clean Code] 7-1 예외처리

예외처리 함수 깔끔하게 하기 호출자 코드와 오류 코드 처리 코드를 분리한다. 1안 class DeviceController: def shutdown(self): try: self.try_shutdown() except (DeviceControllerError, DeviceShutdownError) as e: ... logger.error() def try_shutdown(self): device = self.get_handle() device.pause() device.clear_queue() device.close() def get_handle(self, device_id: int): ... raise DeviceControllerError('Invalid device handle') 2안 def ca..

프로그래밍/Clean Code

[Clean Code] 6-2 객체지향 절차지향 2

객체와 자료구조 디미터 법칙 모듈은 자신이 조작하는 객체의 속을 몰라야 한다는 법칙이다. 객체는 조회 함수로 내부 구조를 공개한다면 안 된다는 의미 (내부 구조를 노출하는 셈) C 클래스의 f 메소드는 다음과 같은 객체의 메소드만 호출 해야 한다. 클래스 C f가 생성한 객체 f로 넘어온 인수 클래스 C 인스턴스 변수 객체 디미터 법칙을 어긴 예시 같은 객체가 아닌 서로 다른 객체를 가지고 서로 연결해서 작성한 이런 코드를 기차 충돌 이라고 부른다. 일반적으로 조잡하니 지향하는 편이 좋다. outputDir := cTxt.GetOptions().GetScratchDir().GetAbsolutePath() 변경 예시 opts := cTxt.GetOptions(); scratchDir := opts.GetS..

프로그래밍/Clean Code

[Clean Code] 6-1 객체지향 절차지향

객체와 자료구조 객체 지향적 과 절차 지향적의 차이 절차 지향적인 코드는 기존 자료구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면 객체 지향적인 코드는 변경점이 생기면 기존 함수를 변경해야 하는 부분이 생길 수 있다. 모든 것을 객체 지향적인것 보다는 때로는 단순한 것이 적합한 상황이 있을 수 있다. 절차 지향적 class Squre(object): x: float y: float side: float class Rectangle(object): x: float y: float width: float height: float class Circle(object): x: float y: float radius: float def get_arae(figure: object) -> float: if ..

상쾌한기분
'프로그래밍' 카테고리의 글 목록