Skip to content
CatBus

Posts

All the articles I've posted.

BOJ10845SILVER 4
  • 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 로 접근했다.

2025.03.08·5분·data structures
BOJ1051SILVER 3
  • 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 로 접근했다.

2025.03.04·4분·implementation
BOJ2304SILVER 2
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 로 접근했다.

2025.03.04·6분·implementation
PROGRAMMERS133027SQL
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개만 남긴다.

2025.03.02·1분·sql
PROGRAMMERS301647SQL
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` 비트 연산으로 부모 형질을 모두 포함하는지 판정한다.

2025.03.02·1분·sql
TROUBLESHOOTINGConnectionError
...
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 컨테이너 이름으로 바꿨다.

2025.02.16·1분·docker
TROUBLESHOOTINGdocker
    ...
    CMD ["cp", "-r", "/app/dist", "/app/frontend_build"]
    ```

- volume mount를 local의 상태가 덮어 쓰기 된다는 것을 명심하자
---

# 📚 Reference

docker에서 volume을 연결해도 파일이 보이지 않는 문제

이미지 안에서 만든 build 산출물이 볼륨 마운트로 비어 있는 로컬 디렉터리에 덮여 사라졌다. Dockerfile 에서 build 파일을 복사하도록 고쳤다.

2025.02.16·1분·docker
TROUBLESHOOTINGgitlab ci
    ...
    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 를 나눠 지정했다.

2025.02.15·4분·gitlab-ci-cd
TROUBLESHOOTINGconda
  • 분명 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>
    ```

# 📚 Reference

conda 가상환경 상에서 pip install로 설치한 모듈을 찾을 수 없는 경우

conda 환경에서 pip install 한 모듈을 찾지 못했다. pip 경로가 전역을 가리켜 전역에 설치되고 있었던 것이라 가상환경의 pip 를 명시했다.

2025.02.12·1분·python