Posts
All the articles I've posted.
...
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 으로 대체했다.
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 로 접근했다.
첫째 줄에 동영상의 개수 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 로 접근했다.
- 테이블 2회 JOIN 으로 두 테이블을 연결
- WHERE 로 조건에 맞는 행만 남김
- ORDER BY 로 정렬 (내림차순 포함)
- 서브쿼리를 사용
- CASE WHEN 으로 조건에 따라 값을 분기
- 사용한 함수: IFNULL(), ROUND()
자동차 대여 기록 별 대여 금액 구하기
DATEDIFF+1 로 대여 일수를 구하고 CASE 로 90일·30일·7일 구간을 나눠 요금제와 조인한다. 할인율을 적용해 대여 금액을 계산하는 문제.
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) 를 가져와 각 개체 크기와의 차를 구한다.
첫째 줄에 N, L, R이 주어진다. (1 ≤ N ≤ 50, 1 ≤ L ≤ R ≤ 100)
둘째 줄부터 N개의 줄에 각 나라의 인구수가 주어진다. r행 c열에 주어지는 정수는 A[r][c]의 값이다. (0 ≤ A[r][c] ≤ 100)
인구 이동이 발생하는 일수가 2,000번 보다 작거나 같은 입력만 주어진다.
출력
인구 이동이 며칠 동안 발생하는지 첫째 줄에 출력한다.
이 문제는 시뮬레이션과 BFS를 결합한 문제이다. 매일 국경선이 열리는 나라들을 찾아 연합을 만들고, 인구를 재분배하는 과정을 반복해야 한다.
인구 이동이 일어나는 하루는 다음과 같은 과정을 거친다:
- 연합 찾기: BFS를 사용하여 국경선이 열리는 나라들의 연합을 찾는다.
- 인구 재분배: 각 연합의 평균 인구수를 계산하고 재분배한다.
- 종료 조건 확인: 어떤 연합도 만들어지지 않으면 인구 이동 종료.
1. 연합 찾기 (open 함수)
인구 이동
백준 16234번 '인구 이동' (골드 4) 문제 풀이. implementation, graph theory, graph traversal 로 접근했다.
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 로 접근했다.
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 비교해, 음식 종류마다 즐겨찾기가 가장 많은 행을 고른다.
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 FRONTENDFrontEnd 개발자 찾기
스킬코드를 비트마스크로 다룬다. `SKILL_CODE | CODE = SKILL_CODE` 로 프론트엔드 비트가 켜져 있는 개발자만 고른다.