Posts
All the articles I've posted.
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 을 채워 컬럼 수를 맞춘다.
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 로 접근했다.
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) 를 구한 서브쿼리를 원본 테이블과 다시 조인해, 최고가만이 아니라 그 상품의 이름까지 함께 뽑는다.
SELECT MIN(datetime) AS 시간
FROM animal_ins
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 사용한 함수: MIN()
최솟값 구하기
animal_ins 에서 MIN(datetime) 하나만 뽑는다. 가장 먼저 들어온 동물의 보호 시작 시각.
- 위 현상이 나타날 수 있는 이유
- 토크나이저 설정 오류:
- 문제: 사용하는 토크나이저가 예상과 다르게
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 이상을 넣어 임베딩 레이어의 허용 범위를 벗어난 것이 원인이었다.
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 해 개체마다 자식 수를 센다.
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 인 행만 남긴다 — 들어온 기록 없이 나간 동물.
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 로 접근했다.
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 로 접근했다.