Skip to content
CatBus

Posts

All the articles I've posted.

PROGRAMMERS131537SQL
    SELECT DATE_FORMAT(sales_date,"%Y-%m-%d") AS sales_date, product_id, user_id, sales_amount
    FROM online_sale
    WHERE MONTH(sales_date) = 3
UNION
    SELECT DATE_FORMAT(sales_date,"%Y-%m-%d") AS sales_date, product_id, NULL AS user_id, sales_amount
    FROM offline_sale
    WHERE MONTH(sales_date) = 3
ORDER BY sales_date, product_id, user_id

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • WHERE 로 조건에 맞는 행만 남김
  • ORDER BY 로 정렬
  • 서브쿼리를 사용
  • 사용한 함수: DATE_FORMAT(), MONTH()

오프라인/온라인 판매 데이터 통합하기

3월치만 걸러 온라인·오프라인을 UNION 한다. 오프라인에는 user_id 가 없어 NULL 을 채워 컬럼 수를 맞춘다.

2025.04.08·1분·sql
BOJ11723SILVER 5
m = int(input())
s = 0  # 비트마스크

for _ in range(m):
    command = input().strip().split()
    
    if command[0] == 'add':
        x = int(command[1])
        s |= (1 << x)
    elif command[0] == 'remove':
        x = int(command[1])
        s &= ~(1 << x)
    elif command[0] == 'check':
        x = int(command[1])
        print(1 if s & (1 << x) else 0)
    elif command[0] == 'toggle':
        x = int(command[1])
        s ^= (1 << x)
    elif command[0] == 'all':
        s = (1 << 21) - 1
    elif command[0] == 'empty':
        s = 0

집합

백준 11723번 '집합' (실버 5) 문제 풀이. implementation, set, bitmask 로 접근했다.

2025.04.03·8분·implementation
PROGRAMMERS131116SQL
SELECT food_product.category, food_product.price AS max_price, food_product.product_name
FROM food_product, (
    SELECT category, MAX(price) AS max_price
    FROM food_product
    WHERE category IN ('과자', '', '김치', '식용유')
    GROUP BY category
) AS max_price_product
WHERE food_product.category = max_price_product.category AND food_product.price = max_price_product.max_price
ORDER BY price DESC


# SELECT category, MAX(price)
#     FROM food_product
#     WHERE category IN ('과자', '', '김치', '식용유')
#     GROUP BY category

식품분류별 가장 비싼 식품의 정보 조회하기

카테고리별 MAX(price) 를 구한 서브쿼리를 원본 테이블과 다시 조인해, 최고가만이 아니라 그 상품의 이름까지 함께 뽑는다.

2025.04.02·1분·sql
PROGRAMMERS59038SQL
SELECT MIN(datetime) AS 시간
FROM animal_ins

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • 사용한 함수: MIN()

최솟값 구하기

animal_ins 에서 MIN(datetime) 하나만 뽑는다. 가장 먼저 들어온 동물의 보호 시작 시각.

2025.04.02·1분·sql
TROUBLESHOOTINGIndexError
  • 위 현상이 나타날 수 있는 이유
    • 토크나이저 설정 오류:
      • 문제: 사용하는 토크나이저가 예상과 다르게 token_type_ids를 생성하고 있을 수 있습니다. 예를 들어, 토크나이저가 질의-응답 모델처럼 두 개 이상의 세그먼트를 처리하도록 설정되어 있거나, 잘못된 매개변수가 사용되었을 수 있습니다.
      • 해결 방법:
        • 토크나이저의 설정과 사용법을 다시 확인합니다. 특히 encode_plus 또는 __call__ 메서드의 매개변수를 주의 깊게 살펴보아야 합니다.
        • 단일 문장 분류와 같은 작업에서는 token_type_ids가 실제로 필요하지 않으므로, 토크나이저에서 이를 생성하지 않도록 설정하거나, 생성된 값을 무시해야 합니다.
        • encodings['token_type_ids'] = torch.zeros_like(encodings['input_ids']) 이 코드를 통해 모든 토큰 id를 0으로 설정하면, 위 문제를 회피할 수 있습니다.
    • 입력 데이터 형태 오류:
      • 문제: 입력 데이터가 토크나이저가 예상하는 형태와 다를 수 있습니다. 예를 들어, 질의-응답 쌍과 같은 형태의 데이터가 단일 문장으로 처리되고 있을 수 있습니다.
      • 해결 방법:
        • 입력 데이터의 형태를 확인하고, 토크나이저가 데이터를 올바르게 처리할 수 있도록 데이터를 조정합니다.
        • 문제가 되는 특정 데이터의 형태를 확인하는 것이 중요합니다.
    • 모델 또는 라이브러리 문제:
      • 문제: 드물게 모델 자체 또는 사용하는 라이브러리에 오류가 있을 수 있습니다.
      • 해결 방법:
        • 사용하는 모델과 라이브러리의 버전을 확인하고, 최신 버전으로 업데이트하거나 다른 버전으로 시도해 봅니다.
        • 허깅페이스와 같은 유명한 모델은, 버전 업데이트가 빠른 편입니다. 가능한 최신버전을 이용하는게 좋습니다.
    • 패딩의 문제점:
      • 문제: 패딩 과정에서 일부 토큰 타입 ID가 원하지 않는 값으로 설정될 수 있습니다.
      • 해결 방법:
        • 패딩 설정과 방식을 확인하고, 필요에 따라 패딩 마스크를 사용하여 패딩된 토큰을 모델이 무시하도록 합니다.

pytorch의 IndexError: index out of range in self 에러

BERT 로 예측할 때 뜬 IndexError. 토크나이저가 token_type_ids 에 2 이상을 넣어 임베딩 레이어의 허용 범위를 벗어난 것이 원인이었다.

2025.03.28·8분·pytorch
PROGRAMMERS299305SQL
SELECT ecoli1.id AS ID, COUNT(ecoli2.id) as CHILD_COUNT
FROM ecoli_data AS ecoli1
LEFT JOIN
ecoli_data AS ecoli2
ON ecoli1.id = ecoli2.parent_id
GROUP BY ecoli1.id;

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • 테이블 1회 LEFT JOIN 으로 두 테이블을 연결
  • GROUP BY 로 묶어서 집계
  • 사용한 함수: COUNT()

대장균들의 자식의 수 구하기

ecoli_data 를 자기 자신과 LEFT JOIN 해 부모-자식을 이어 붙이고, 자식 쪽을 COUNT 해 개체마다 자식 수를 센다.

2025.03.26·1분·sql
PROGRAMMERS59042SQL
SELECT outs.animal_id, outs.name
FROM animal_ins AS ins
RIGHT JOIN
animal_outs AS outs
ON ins.animal_id = outs.animal_id
WHERE ins.animal_id IS NULL

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • 테이블 1회 JOIN 으로 두 테이블을 연결
  • WHERE 로 조건에 맞는 행만 남김

없어진 기록 찾기

animal_outs 기준 RIGHT JOIN 후 입양 기록 쪽 키가 NULL 인 행만 남긴다 — 들어온 기록 없이 나간 동물.

2025.03.26·1분·sql
BOJ2606SILVER 3
class Network:

    def __init__(self, N, M):
        self.N, self.M = N, M
        self.cnt = 0
        self.visited = [False] * (N + 1)
        self.visited[1] = True
        self.network = defaultdict(list)
        self._make_network()

    def _make_network(self):
        for _ in range(self.M):
            s, e = map(int, input().split())
            self.network[s].append(e)
            self.network[e].append(s)

    def search_computer(self, node=1):
        for n_node in self.network[node]:
            if self.visited[n_node]:
                continue
            self.visited[n_node] = True
            self.cnt += 1
            self.search_computer(n_node)


def main():
    N = int(input())
    M = int(input())

    network = Network(N, M)
    network.search_computer()
    print(network.cnt)


if __name__ == "__main__":
    main()

바이러스

백준 2606번 '바이러스' (실버 3) 문제 풀이. graph theory, graph traversal, bfs 로 접근했다.

2025.03.26·7분·graph theory
BOJ4803GOLD 4
for i in range(1, n + 1):
    if not visited[i]:
        nodes = set()
        edges = set()

        # 사이클 확인
        if not dfs(i, 0, nodes, edges):
            continue

        # 사이클이 없고, 간선의 수가 노드의 수 - 1이면 트리
        if len(edges) == len(nodes) - 1:
            tree_count += 1
  • 방문하지 않은 각 연결 요소에 대해 DFS 수행
  • 사이클이 없고 간선 수 = 정점 수 - 1이면 트리로 카운트
if tree_count == 0:
    print(f"Case {case_num}: No trees.")
elif tree_count == 1:
    print(f"Case {case_num}: There is one tree.")
else:
    print(f"Case {case_num}: A forest of {tree_count} trees.")

트리

백준 4803번 '트리' (골드 4) 문제 풀이. graph theory, data structures, graph traversal 로 접근했다.

2025.03.25·9분·graph theory