Posts
All the articles I've posted.
- push X:
deque.append(X)로 큐의 뒤에 원소를 추가 - pop:
deque.popleft()로 큐의 앞에서 원소를 제거하고 반환 - size:
len(deque)로 큐의 크기 반환 - empty: 큐가 비어있는지 확인
- front:
deque[0]로 큐의 첫 번째 원소 접근 - back:
deque[-1]로 큐의 마지막 원소 접근
모든 연산에서 큐가 비어있을 때의 예외 처리를 해주어야 한다.
from collections import deque
import sys
N = int(sys.stdin.readline().strip())
q = deque()
for i in range(N):
cmd = sys.stdin.readline().strip().split()
if cmd[0] == 'push':
q.append(cmd[1])
elif cmd[0] == 'pop':
if len(q) != 0:
print(q.popleft())
else:
print(-1)
elif cmd[0] == 'size':
print(len(q))
elif cmd[0] == 'empty':
if len(q) == 0:
print(1)
else:
print(0)
elif cmd[0] == 'front':
if len(q) != 0:
print(q[0])
else:
print(-1)
elif cmd[0] == 'back':
if len(q) != 0:
print(q[-1])
else:
print(-1)큐
백준 10845번 '큐' (실버 4) 문제 풀이. data structures, queue 로 접근했다.
len_limit = min(N - 1, M - 1): 가능한 최대 정사각형의 한 변 길이 (인덱스 차이)for k in range(len_limit, -1, -1): 큰 정사각형부터 확인for x in range(M - k): 정사각형의 시작 x 좌표 (x + k가 범위를 벗어나지 않도록)for y in range(N - k): 정사각형의 시작 y 좌표 (y + k가 범위를 벗어나지 않도록)- 네 꼭짓점 비교:
rectangle[y][x](좌상),rectangle[y + k][x](좌하),rectangle[y][x + k](우상),rectangle[y + k][x + k](우하) break-else패턴: 조건을 만족하는 정사각형을 찾으면 모든 반복문을 빠져나감
최악의 경우 모든 가능한 정사각형을 확인해야 하므로 시간 복잡도는 O(N × M × min(N, M))이다.
N, M ≤ 50이므로 최악의 경우에도 50 × 50 × 50 = 125,000번의 연산으로 충분히 시간 내에 해결할 수 있다.
숫자 정사각형
백준 1051번 '숫자 정사각형' (실버 3) 문제 풀이. implementation, bruteforcing 로 접근했다.
max_h = 0
pillar_list = [0] * 1001
max_loc = 0
for _ in range(N):
loc, h = map(int, input().split())
max_h = max(max_h, h)
max_loc = max(max_loc, loc)
pillar_list[loc] = h
# 왼쪽에서 시작
i_l = -1
cur = 0
ans = 0
while cur < max_h:
i_l += 1
cur = max(cur, pillar_list[i_l])
ans += cur
# 오른쪽에서 시작
i_r = max_loc + 1
cur = 0
while cur < max_h:
i_r -= 1
cur = max(cur, pillar_list[i_r])
ans += cur
if i_r == i_l:
ans -= max_h
else:
ans += max_h * (i_r - i_l - 1)
print(ans)창고 다각형
백준 2304번 '창고 다각형' (실버 2) 문제 풀이. implementation, data structures, bruteforcing 로 접근했다.
SELECT J.FLAVOR
FROM FIRST_HALF F
INNER JOIN (SELECT FLAVOR, SUM(TOTAL_ORDER) AS JULY_TOTAL_ORDER
FROM JULY
GROUP BY FLAVOR) J
ON F.FLAVOR = J.FLAVOR
ORDER BY TOTAL_ORDER + JULY_TOTAL_ORDER DESC
LIMIT 3;
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 테이블 1회 JOIN 으로 두 테이블을 연결
- GROUP BY 로 묶어서 집계
- ORDER BY 로 정렬 (내림차순 포함)
- LIMIT 3 으로 상위 3건만 조회
- 서브쿼리를 사용
- 사용한 함수: SUM()
주문량이 많은 아이스크림들 조회하기
7월 주문을 맛별로 SUM 한 서브쿼리를 상반기 테이블과 조인하고, 두 합을 더한 값으로 정렬해 상위 3개만 남긴다.
SELECT A.ID, A.GENOTYPE, B.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA A, ECOLI_DATA B
WHERE A.PARENT_ID = B.ID AND A.GENOTYPE & B.GENOTYPE = B.GENOTYPE
ORDER BY ID
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- WHERE 로 조건에 맞는 행만 남김
- ORDER BY 로 정렬
부모의 형질을 모두 가지는 대장균 찾기
자기 조인으로 부모 행을 붙이고 `A.GENOTYPE & B.GENOTYPE = B.GENOTYPE` 비트 연산으로 부모 형질을 모두 포함하는지 판정한다.
...
dev-backend | connection.connect()
dev-backend | ~~~~~~~~~~~~~~~~~~^^
dev-backend | File "/usr/local/lib/python3.13/site-packages/redis/connection.py", line 363, in connect
dev-backend | raise ConnectionError(self._error_message(e))
dev-backend | redis.exceptions.ConnectionError: Error 111 connecting to 127.0.0.1:6379. Connection refused.
- redis가 docker에 제대로 연결되지 않아 발생하는 문제
127.0.0.1은 local에서 사용하는 것이므로 docker에 맞게 바꿔줄 필요가 있음
docker 상에서 redis가 정상적으로 연결되지 않는 문제
컨테이너의 redis 에 127.0.0.1 로 붙으려 해 연결이 안 됐다. host 를 redis 컨테이너 이름으로 바꿨다.
...
CMD ["cp", "-r", "/app/dist", "/app/frontend_build"]
```
- volume mount를 할 때 local의 상태가 덮어 쓰기 된다는 것을 명심하자
---
# 📚 Referencedocker에서 volume을 연결해도 파일이 보이지 않는 문제
이미지 안에서 만든 build 산출물이 볼륨 마운트로 비어 있는 로컬 디렉터리에 덮여 사라졌다. Dockerfile 에서 build 파일을 복사하도록 고쳤다.
...
build_backend:
tags:
- backend-runner
script:
- cd Backend
- docker build -t $IMAGE_BACKEND:$TAG -f Dockerfile.dev .
- docker push $IMAGE_BACKEND:$TAG
only:
- develop
- master
build_frontend:
tags:
- frontend-runner
script:
- cd Frontend
- docker build -t $IMAGE_FRONTEND:$TAG -f Dockerfile.dev .
- docker push $IMAGE_FRONTEND:$TAG
only:
- develop
- master
...
```gitlab ci 상에서 permission denied가 발생하는 문제
같은 stage 의 두 job 이 runner 하나를 두고 다퉈 뒤늦은 쪽이 docker daemon 권한을 얻지 못했다. tags 로 job 마다 runner 를 나눠 지정했다.
- 분명
conda activate이후 가상환경 안에서pip install을 통해 모듈을 설치했음에도 불구하고not found module이 발생하는 경우가 있다.
- pip의 경로를 확인해보면 conda 환경의 경로가 아님을 확인할 수 있다. 이 때문에 global 환경에 설치가 되어 가상환경 내에서 사용할 수 없었던 것
$ which pip
/home/user/.local/bin/pip
```
- pip를 현재 가상환경의 것으로 사용하도록 명시한다.
```bash
python -m pip install <module_name>
```
# 📚 Referenceconda 가상환경 상에서 pip install로 설치한 모듈을 찾을 수 없는 경우
conda 환경에서 pip install 한 모듈을 찾지 못했다. pip 경로가 전역을 가리켜 전역에 설치되고 있었던 것이라 가상환경의 pip 를 명시했다.