no image
[파이썬] 백준 1010번 다리 놓기
1010번: 다리 놓기 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다. www.acmicpc.net 시간 제한 0.5초 메모리 제한 128MB 문제 재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 것을 알았다. (N ≤ ..
2022.06.11
no image
[파이썬] 백준 11051번 이항 계수 2
11051번: 이항 계수 2 첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 1,000, 0 ≤ \(K\) ≤ \(N\)) www.acmicpc.net 시간 제한 1초 메모리 제한 256MB 문제 자연수 N과 정수 K가 주어졌을 때 이항 계수 \(\binom{N}{K}\)를 10,007로 나눈 나머지를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ K ≤ N) 출력 \(\binom{N}{K}\)를 10,007로 나눈 나머지를 출력한다. 예제 입력 1 5 2 예제 출력 1 10 나의 풀이 N과 K의 범위가 크기 때문에 중복된 계산을 줄이기 위해서 memoization을 이용했다. import sys sys.setrecursion..
2022.06.10
no image
[파이썬] 백준 3036번 링
3036번: 링 출력은 총 N-1줄을 해야 한다. 첫 번째 링을 제외한 각각의 링에 대해서, 첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 기약 분수 형태 A/B로 출력한다. www.acmicpc.net 시간 제한 1초 메모리 제한 128MB 문제 상근이는 창고에서 링 N개를 발견했다. 상근이는 각각의 링이 앞에 있는 링과 뒤에 있는 링과 접하도록 바닥에 내려놓았다. 상근이는 첫 번째 링을 돌리기 시작했고, 나머지 링도 같이 돌아간다는 사실을 발견했다. 나머지 링은 첫 번째 링 보다 빠르게 돌아가기도 했고, 느리게 돌아가기도 했다. 이렇게 링을 돌리다 보니 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 도는지 궁금해졌다. 링의 반지름이 주어진다. 이때, 첫 번째 링을 한 바퀴 돌리면, 나..
2022.06.10
no image
[파이썬] Interpreter(인터프리터) 알아보기
Python(파이썬)의 Interpreter(인터프리터) 확인하기 파이썬은 인터프리터 언어라고 알려져있다. 따라서 보통 생각하는 파이썬의 실행 과정은 다음과 같을 것이다. 하지만 파이썬 인터프리터는 사실 Compiler(컴파일러)와 VM(Virtual Machine)으로 구성돼 있다! 컴파일러에 대한 오해 해결하기 컴파일러만 거치면 바로 기계어(machine code)가 생성되는 거 아닌가? 뒤에 과정은 뭐야? 라고 생각할 수도 있다. 하지만 컴파일러의 역할은 현재 언어를 low-level 언어로 변경하는 것으로 꼭 변환 대상이 기계어일 필요는 없다. 실제로 컴파일러는 변경 대상 및 결과에 따라 다음과 같이 4 가지로 나뉜다. 1. 입력 코드를 바로 기계어로 변환하는 정적 컴파일(Static Compil..
2022.06.08
no image
[파이썬] 최소 공배수, 최대 공약수 구하기
완전 탐색 활용 최대 공약수(GCD) : O(N)의 시간 복잡도 최소 공배수(LCM) : O(N*M)의 시간 복잡도 n, m = map(int, input().split()) # 최대 공약수 for i in range(max(n, m), 0, -1): if n % i == 0 and m % i == 0: print(i) break # 최소 공배수 for i in range(min(n, m), n * m + 1): if i % n == 0 and i % m == 0: print(i) break 유클리드 호제법 : 최대 공약수를 빠르게! 유클리드 호제법을 사용하면 최대 공약수를 재귀적으로 구할 수 있다. 이 경우 최대 공약수를 구하기 위해 필요한 시간 복잡도는 O(logN)이다. 유클리드 호제법은 다음과 같..
2022.06.08
no image
[파이썬] static type checker
Type Hint(타입 힌트) 점검? 타입 힌트의 필요성을 느껴 사용했다면, 이제 힌트를 제대로 적었는지 확인해야 한다. 파이썬은 Dynamic typing(동적 타이핑) 언어라서, 잘못된 힌트를 적었더라도 실행엔 아무런 이상이 없다. 그래서 힌트가 제대로 됐는지 확인할 수가 없다. 파이썬에서 타입 힌트가 제대로 됐는지 확인하려면 별도의 Type Checker(타입 체커)를 사용해야 한다. 타입 체커는 mypy, pyright, pytype 등이 있는데 이 중에서 mypy와 pyright가 많이 활용되고 있다. 주의할 점 타입 힌트가 파이썬에 도입됐지만, 타입 체커가 아직 정식으로 지원되는 것은 아니라고 한다. 따라서 전체 프로그램 코드를 모두 확인하기 보다는, 확인이 필요한 함수나 클래스만 따로 떼어서..
2022.06.07
no image
Python의 메모리 관리 방법 알아보기
Python의 모든 것은 객체다 파이썬의 메모리 관리 방법을 이해하려면, 우선 파이썬의 모든 것이 객체라는 것을 이해해야 한다. 이는 파이썬의 모든 것은 Heap 영역에 동적으로 할당된 객체를 참조하는 것이라는 말과 동일하다. 실제로 파이썬의 메모리 할당 과정은 다음과 같다. 그림에서 알 수 있듯, Heap 메모리 영역에 동적으로 할당된 객체를 모든 것(변수, 함수)들이 참조하는 구조다. 메모리가 동적으로 할당 된다는 것은, 결국 런타임 시 메모리가 할당된다는 것을 의미한다. 파이썬의 프로그램은 Byte-code(바이트 코드)를 인터프리터가 한 줄 씩 읽어가며 실행되기 때문에 동적 할당과 잘 맞다. 메모리 해제? 동적으로 메모리를 할당할 경우, 자료의 크기 등을 자유롭게 관리할 수 있어 편리하다는 장점이..
2022.06.03
no image
[Python] Global Interpreter Lock(GIL)은 왜 도입됐고, 어떤 특징이 있나요?
Global Interpreter Lock(GIL)? GIL은 문자 그대로 인터프리터에 대한 Lock이다. Lock은 인터프리터가 여러 스레드를 병렬적으로(Parallel) 실행하지 않도록 막는다. 파이썬엔 GIL이 있기 때문에, 인터프리터가 매 순간 1개의 쓰레드만 실행할 수 있다. 결국 파이썬의 멀티 스레딩은 병렬적(Parallel)으로 실행되는 대신, 동시적으로(Concurrent) 실행된다. 이때 여러 스레드 중 실행 될 1개의 스레드를 정하려면, 스레드 스케줄러가 필요하다. 하지만 파이썬은 자체적인 스케줄러가 없어서, OS의 스레드 스케줄링을 그대로 활용한다. 그래서 I/O Block이 발생할 경우 GIL도 마찬가지로 Release된다. 따라서 I/O Bound 작업의 경우, 멀티 스레딩으로 병..
2022.06.03
no image
Python의 메모리 절약법 : Object Interning(객체 재사용)
Mutable vs Immutable 파이썬의 객체는 생성 후 값을 변경할 수 있는지 여부에 따라 mutable, immutable로 나뉜다. 객체의 값을 변경할 수 있다는 것은, 그 값이 변경돼도 같은 메모리 주소를 가진다는 것을 의미한다. 그래서 mutable 객체인 List는 값을 막 바꿔봐도 id가 변하지 않는다. x = [1,2,3] y = x print(id(x)) print(id(y)) y[0] = 3 print(id(y)) print(id(x)) 2062815432192 2062815432192 2062815432192 2062815432192 하지만 immutable 객체인 int의 경우 값을 바꾸면 id가 변하게 된다. 이는 값이 변경되면서, 기존과 다른 새로운 객체를 가리키기 때문이다..
2022.06.03
no image
[파이썬] @(Decorator)란
@(Decorator)란? @staticmethod def _find_best_gt_match( thr: int, gt_matches: Tensor, idx_iou: float, gt_ignore: Tensor, ious: Tensor, idx_det: int ) -> int: """Return id of best ground truth match with current detection. https://github.com/PyTorchLightning/metrics/blob/master/torchmetrics/detection/mean_ap.py#L199-L928 파이썬으로 작성된 코드들을 보면 위와 같이 함수 위에 @로 시작하는 문구들이 있다. 위 코드에선 @staticmethod가 그렇다. 매번 함..
2022.06.01
no image
torch.take vs torch.gather
torch.take는 input tensor들을 1차원으로 생각해서 처리한다. 따라서 batch 단위 tensor를 처리할 때는 torch.gather를 사용하는 것이 좋다. Returns a new tensor with the elements of input at the given indices. The input tensor is treated as if it were viewed as a 1-D tensor. The result takes the same shape as the indices. 다음 예시를 통해 torch.take와 torch.gather의 차이점을 확인할 수 있다. 예시는 batch 유저별 label과 negative sample(100개)의 logits을 구하기 위한 과정이다. ..
2022.05.31
no image
[SQLD] 데이터 모델과 성능 파트 내용 정리
SQL 자격검정 실전문제집(노랭이)를 풀면서 정리한 내용입니다. 성능 데이터 모델링 분석 및 설계 단계부터 성능과 관련한 데이터 모델링을 수행하는 것 정규화, 반정규화 테이블 분할, 테이블 병합, 테이블 추가 컬럼 추가, PK/FK 조정 슈퍼/서브 타입 조정 성능 데이터 모델링 특징 데이터의 증가량이 클수록 성능 저하에 따른 성능 개선 비용이 증가 데이터의 크기가 문제가 되어 테이블 분할을 하게 되는 경우 이로 인해 할 일이 많아지기 때문 데이터 모델이 성능을 튜닝 하면서 변경될 수 있음 테이블 분할, 병합, 추가로 인해 데이터 모델 구조 변경 가능 데이터 모델링을 수행할 경우 성능 저하에 따른 Rework 비용을 최소화 가능(미리 고민하고 처리했으니까) 성능 데이터 모델링 수행 절차 데이터 모델링을 할..
2022.05.25