Skip to content
CatBus

Posts

All the articles I've posted.

TROUBLESHOOTINGjenkins
    ...
    		stages {
            stage('Checkout Code') {
                steps {
                    // 내장 checkout 단계를 사용합니다. Jenkins가 모든 것을 처리하도록 합니다.
                    checkout([$class: 'GitSCM',
                              branches: [[name: '*/release']], // 또는 '*/main' 등
                              extensions: [],
                              userRemoteConfigs: [[credentialsId: 'gitlab-token',
                                                   url: 'gitlab-url']]])
                }
            }
    ...
    ```

jenkins에서 git pull 사용시 발생하는 문제

Jenkins 의 sh 단계에서 부른 git pull 이 checkout 이 설정한 자격 증명을 상속하지 못해 Access denied. 내장 checkout 으로 대체했다.

2025.03.24·2분·jenkins
BOJ1244SILVER 4
def toggle_switch(switches, N, gender, num):
    if gender == 1:
        # 남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다.
        for i in range(num - 1, N, num):
            switches[i] = (switches[i] + 1) % 2
    else:
        # 여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다.
        num -= 1
        switches[num] = (switches[num] + 1) % 2

        i = 1
        while num - i >= 0 and num + i < N:
            if switches[num - i] != switches[num + i]:
                break

            switches[num - i] = (switches[num - i] + 1) % 2
            switches[num + i] = (switches[num + i] + 1) % 2
            i += 1
    return switches

N = int(input())
switches = list(map(int, input().split()))

M = int(input())
for _ in range(M):
    gender, num = map(int, input().split())
    switches = toggle_switch(switches, N, gender, num)

for i in range(N // 20 + 1):
    print(*switches[i*20:(i + 1)*20])

스위치 켜고 끄기

백준 1244번 '스위치 켜고 끄기' (실버 4) 문제 풀이. implementation, simulation 로 접근했다.

2025.03.20·6분·implementation
BOJ15591GOLD 5

첫째 줄에 동영상의 개수 N (1 ≤ N ≤ 5,000)과 질문의 개수 Q (1 ≤ Q ≤ 5,000)가 주어진다.

다음 N-1개의 줄에는 두 동영상을 연결하는 간선 정보 p, q, r이 주어진다. 이는 동영상 p와 동영상 q가 연관도 r로 연결되어 있음을 의미한다. (1 ≤ r ≤ 1,000,000,000)

다음 Q개의 줄에는 k, v가 주어진다. 이는 유사도가 k 이상인 동영상을 동영상 v를 기준으로 찾는 질의이다.

출력

Q개의 줄에 각 질문에 대한 답변을 출력한다.

이 문제는 트리 구조에서 특정 노드로부터 도달 가능한 노드들 중 경로상의 최소 가중치가 특정 값 이상인 노드의 개수를 세는 문제이다.

두 동영상 간의 유사도는 경로상의 최소 연관도이다. 따라서 시작 노드에서 BFS/DFS를 수행하며, 각 노드까지의 경로에서의 최소값을 유지하면서 탐색한다.

풀이 1: BFS를 이용한 방법

각 쿼리마다 BFS를 수행하여 유사도가 k 이상인 노드를 센다.

MooTube (Silver)

백준 15591번 'MooTube (Silver)' (골드 5) 문제 풀이. graph theory, graph traversal, bfs 로 접근했다.

2025.03.19·7분·graph theory
PROGRAMMERS151141SQL
  • 테이블 2회 JOIN 으로 두 테이블을 연결
  • WHERE 로 조건에 맞는 행만 남김
  • ORDER BY 로 정렬 (내림차순 포함)
  • 서브쿼리를 사용
  • CASE WHEN 으로 조건에 따라 값을 분기
  • 사용한 함수: IFNULL(), ROUND()

자동차 대여 기록 별 대여 금액 구하기

DATEDIFF+1 로 대여 일수를 구하고 CASE 로 90일·30일·7일 구간을 나눠 요금제와 조인한다. 할인율을 적용해 대여 금액을 계산하는 문제.

2025.03.19·3분·sql
PROGRAMMERS299310SQL
SELECT year(differentiation_date) AS YEAR,
(
    SELECT MAX(size_of_colony) FROM ecoli_data
    WHERE year(differentiation_date) = year
) - size_of_colony AS YEAR_DEV,
ID
FROM ECOLI_DATA
ORDER BY YEAR, YEAR_DEV

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

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

연도별 대장균 크기의 편차 구하기

상관 서브쿼리로 같은 연도의 MAX(size_of_colony) 를 가져와 각 개체 크기와의 차를 구한다.

2025.03.19·1분·sql
BOJ16234GOLD 4

첫째 줄에 N, L, R이 주어진다. (1 ≤ N ≤ 50, 1 ≤ L ≤ R ≤ 100)

둘째 줄부터 N개의 줄에 각 나라의 인구수가 주어진다. r행 c열에 주어지는 정수는 A[r][c]의 값이다. (0 ≤ A[r][c] ≤ 100)

인구 이동이 발생하는 일수가 2,000번 보다 작거나 같은 입력만 주어진다.

출력

인구 이동이 며칠 동안 발생하는지 첫째 줄에 출력한다.

이 문제는 시뮬레이션과 BFS를 결합한 문제이다. 매일 국경선이 열리는 나라들을 찾아 연합을 만들고, 인구를 재분배하는 과정을 반복해야 한다.

인구 이동이 일어나는 하루는 다음과 같은 과정을 거친다:

  1. 연합 찾기: BFS를 사용하여 국경선이 열리는 나라들의 연합을 찾는다.
  2. 인구 재분배: 각 연합의 평균 인구수를 계산하고 재분배한다.
  3. 종료 조건 확인: 어떤 연합도 만들어지지 않으면 인구 이동 종료.

1. 연합 찾기 (open 함수)

인구 이동

백준 16234번 '인구 이동' (골드 4) 문제 풀이. implementation, graph theory, graph traversal 로 접근했다.

2025.03.12·8분·implementation
BOJ1388SILVER 4
N, M = map(int, input().split())

floor = [list(input()) for _ in range(N)]

def search_tiles(start, visited, tile_shape):
    # 타일 모양에 따라 탐색 방향 설정
    if tile_shape == '-':
        dy, dx = 0, 1
    else:
        dy, dx = 1, 0

    q = deque([start])
    while q:
        y, x = q.popleft()

        ny, nx = y + dy, x + dx

        # 범위 벗어났을 경우
        if not (0 <= ny < N) or not (0 <= nx < M):
            return 1
        # 이미 방문했을 경우
        if visited[ny][nx]:
            return 1
        # 타일 모양이 다를 경우
        if floor[ny][nx] != tile_shape:
            return 1

        q.append((ny, nx))
        visited[ny][nx] = True

visited = [[False] * M for _ in range(N)]
tile_cnt = 0

for y in range(N):
    for x in range(M):
        if visited[y][x]:
            continue
        tile_cnt += search_tiles((y, x), visited, floor[y][x])

print(tile_cnt)

바닥 장식

백준 1388번 '바닥 장식' (실버 4) 문제 풀이. implementation, graph theory, graph traversal 로 접근했다.

2025.03.12·6분·implementation
PROGRAMMERS131123SQL
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) 
IN 
(SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE ) -- 음식 종류, 즐찾 최대 개수

ORDER BY FOOD_TYPE DESC

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

  • WHERE 로 조건에 맞는 행만 남김
  • GROUP BY 로 묶어서 집계
  • ORDER BY 로 정렬 (내림차순 포함)
  • 서브쿼리를 사용
  • 사용한 함수: MAX()

즐겨찾기가 가장 많은 식당 정보 출력하기

(FOOD_TYPE, FAVORITES) 를 튜플째로 GROUP BY 결과와 IN 비교해, 음식 종류마다 즐겨찾기가 가장 많은 행을 고른다.

2025.03.11·1분·sql
PROGRAMMERS276035SQL
SELECT DISTINCT DEVELOPERS.ID, DEVELOPERS.EMAIL, DEVELOPERS.FIRST_NAME, DEVELOPERS.LAST_NAME
FROM DEVELOPERS, (SELECT CODE
                 FROM SKILLCODES
                 WHERE CATEGORY = 'Front End') as FRONTEND
WHERE DEVELOPERS.SKILL_CODE | FRONTEND.CODE = DEVELOPERS.SKILL_CODE
ORDER BY DEVELOPERS.ID

# SELECT DEVELOPERS.SKILL_CODE, FRONTEND.CODE, DEVELOPERS.SKILL_CODE | FRONTEND.CODE
# FROM DEVELOPERS, (SELECT CODE
#                  FROM SKILLCODES
#                  WHERE CATEGORY = 'Front End') as FRONTEND

FrontEnd 개발자 찾기

스킬코드를 비트마스크로 다룬다. `SKILL_CODE | CODE = SKILL_CODE` 로 프론트엔드 비트가 켜져 있는 개발자만 고른다.

2025.03.11·1분·sql