✅ 02 회차 모의고사 D-29일
🚀 1차 코딩테스트 대비
- 백준 1244 (스위치 켜고 끄기)
- 백준 1064 (평행사변형)
- 백준 11478 (서로 다른 부분 문자열의 개수)
- 백준 1439 (뒤집기)
- SQL 12세 이하인 여자 환자 목록 출력하기
1차 풀이
⭐ 1. 백준 1244 (스위치 켜고 끄기)
# 1. 알고(구현): 백준 1244 (스위치 켜고 끄기) - https://www.acmicpc.net/problem/1244
import sys
from io import StringIO
sys.stdin = StringIO('''8
0 1 0 1 0 0 0 1
2
1 3
2 3''')
input = sys.stdin.readline
def solve():
N = int(input())
lights = [0] + list(map(int, input().split()))
P = int(input())
for _ in range(P):
mw, num = map(int, input().split())
if mw == 1: # 남자
for i in range(num, N + 1, num):
lights[i] = 1 if lights[i] == 0 else 0
else:
start, end = num, num
while 1 < start and end < N and lights[start - 1] == lights[end + 1]:
start -= 1
end += 1
for i in range(start, end + 1):
lights[i] = 1 if lights[i] == 0 else 0
for i in range(1, N+1, 20):
print(*lights[i:i+20])
solve()⭐ 2. 백준 1064 (평행사변형)
# 2. 알고(수학): 백준 1064 (평행사변형) - https://www.acmicpc.net/problem/1064
import sys
from io import StringIO
sys.stdin = StringIO('''1 2 3 4 8 7''')
input = sys.stdin.readline
def solve():
x1, y1, x2, y2, x3, y3 = map(int, input().split())
if (x2 - x1) * (y3 - y2) == (x3 - x2) * (y2 - y1):
print(-1.0)
return
a, b, c = (x1, y1), (x2, y2), (x3, y3)
def length_two_dot(s, e):
return (s[0] - e[0])**2 + (s[1] - e[1])**2
lengths = [
length_two_dot(a, b),
length_two_dot(b, c),
length_two_dot(c, a)
]
lengths.sort()
max_value = lengths[1]**0.5 + lengths[2]**0.5
min_value = lengths[0]**0.5 + lengths[1]**0.5
print(2*(max_value - min_value))
solve()⭐ 3. 백준 11478 (서로 다른 부분 문자열의 개수)
# 3. 알고(Set): 백준 11478 (서로 다른 부분 문자열의 개수) - https://www.acmicpc.net/problem/11478
import sys
from io import StringIO
sys.stdin = StringIO('''ababc''')
input = sys.stdin.readline
def solve():
S = input().rstrip()
sub_sets = set(S)
for i in range(len(S)):
for j in range(i + 1, len(S) + 1):
sub_sets.add(S[i:j])
print(len(sub_sets))
solve()⭐ 4. 백준 1439 (뒤집기)
# 4. 알고(그리디): 백준 1439 (뒤집기) - https://www.acmicpc.net/problem/1439
import sys
from io import StringIO
sys.stdin = StringIO('''11001100110011000001''')
input = sys.stdin.readline
def solve():
S = input().rstrip()
target = S[0]
count = 0
for i in S:
if i != target:
count += 1
target = '1' if target == '0' else '0'
print((count + 1) // 2)
solve()✏️ 5. SQL 12세 이하인 여자 환자 목록 출력하기
-- 5. SQL(Lv.1): 12세 이하인 여자 환자 목록 출력하기
-- https://school.programmers.co.kr/learn/courses/30/lessons/132201
SELECT
PT_NAME,
PT_NO,
GEND_CD,
AGE,
IFNULL(TLNO, 'NONE')
FROM
PATIENT
WHERE
AGE <= 12
AND GEND_CD = 'W'
ORDER BY
AGE DESC,
PT_NAME ASC;🚀 2차 코딩테스트 대비
- 백준 14891 (톱니바퀴)
- 백준 11048 (이동하기)
- 백준 1916 (최소비용 구하기)
- 백준 2580 (스도쿠)
- SQL 카테고리 별 도서 판매량 집계하기
2차 풀이
⭐ 1. 백준 14891 (톱니바퀴)
# 1. 알고(시뮬): 백준 14891 (톱니바퀴) - https://www.acmicpc.net/problem/14891
import sys
from collections import deque
from io import StringIO
sys.stdin = StringIO('''11111111
11111111
11111111
11111111
3
1 1
2 1
3 1''')
input = sys.stdin.readline
def solve():
circles = [[0]]
for _ in range(4):
circles.append(deque(map(int, input().rstrip())))
def rotate_circle(n, d):
dirs = [0] * 5
dirs[n] = d
# 1. 왼쪽으로 전파 (n번 기준 왼쪽 확인)
for i in range(n, 1, -1):
if circles[i][6] != circles[i-1][2]:
dirs[i-1] = -dirs[i]
else:
break
# 2. 오른쪽으로 전파 (n번 기준 오른쪽 확인)
for i in range(n, 4):
if circles[i][2] != circles[i+1][6]:
dirs[i+1] = -dirs[i]
else:
break
# 회전
for i in range(1, 5):
circles[i].rotate(dirs[i])
N = int(input())
for _ in range(N):
n, d = map(int, input().split())
rotate_circle(n, d)
sum_val = 0
for i, row in enumerate(circles[1:]):
sum_val += row[0] * 2**(i)
print(sum_val)
solve()⭐ 2. 백준 11048 (이동하기)
# 2. 알고(DP): 백준 11048 (이동하기) - https://www.acmicpc.net/problem/11048
import sys
from io import StringIO
sys.stdin = StringIO('''4 3
1 2 3
6 5 4
7 8 9
12 11 10''')
input = sys.stdin.readline
def solve():
N, M = map(int, input().split())
maze = [list(map(int, input().split())) for _ in range(N)]
dp = [[0] * (M + 1) for _ in range(N + 1)]
# 대각선은 검사안해도 최대값에는 영향이 없음.
for i in range(1, N + 1):
for j in range(1, M + 1):
dp[i][j] = maze[i-1][j-1] + max(dp[i-1][j], dp[i][j-1])
print(dp[N][M])
solve()⭐ 3. 백준 1916 (최소비용 구하기)
# 3. 알고(그래프): 백준 1916 (최소비용 구하기) - https://www.acmicpc.net/problem/1916
import sys
from heapq import heappush, heappop
from io import StringIO
sys.stdin = StringIO('''5
8
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
1 5''')
input = sys.stdin.readline
def solve():
N, M = int(input()), int(input())
graph = [[] for _ in range(N + 1)]
for _ in range(M):
s, e, c = map(int, input().split())
graph[s].append((e, c))
S, E = map(int, input().split())
pq = [(0, S)] # 시작 노드 (현재 비용, 현재 위치)
INF = sys.maxsize
min_dist = [INF] * (N + 1)
min_dist[S] = 0
while pq:
cur_dist, cur = heappop(pq)
if cur_dist <= min_dist[cur]:
for nxt, cost in graph[cur]:
nxt_dist = cur_dist + cost
if nxt_dist < min_dist[nxt]:
min_dist[nxt] = nxt_dist
heappush(pq, (nxt_dist, nxt))
print(min_dist[E])
solve()⭐ 4. 백준 2580 (스도쿠)
# 4. 알고(백트래킹): 백준 2580 (스도쿠) - https://www.acmicpc.net/problem/2580
import sys
from io import StringIO
sys.stdin = StringIO('''0 3 5 4 6 9 2 7 8
7 8 2 1 0 5 6 0 9
0 6 0 2 7 8 1 3 5
3 2 1 0 4 6 8 9 7
8 0 4 9 1 3 5 0 6
5 9 6 8 2 0 4 1 3
9 1 7 6 5 2 0 8 0
6 0 3 7 0 1 9 5 2
2 5 8 3 9 4 7 6 0''')
input = sys.stdin.readline
def solve():
board = [list(map(int, input().split())) for _ in range(9)]
zeros = [(i, j) for i in range(9) for j in range(9) if board[i][j] == 0]
row_i = [[False] * 10 for _ in range(9)]
col_i = [[False] * 10 for _ in range(9)]
sqr_i = [[False] * 10 for _ in range(9)]
def get_sqr_idx(r, c):
return (r // 3) * 3 + (c // 3)
def flag(r, c, num, bool):
row_i[r][num], col_i[c][num] = bool, bool
sqr_i[get_sqr_idx(r, c)][num] = bool
for r in range(9):
for c in range(9):
num = board[r][c]
if num != 0:
flag(r, c, num, True)
def dfs(idx):
# 끝까지 오면 종료.
if idx == len(zeros):
for row in board:
print(*row)
sys.exit(0)
r, c = zeros[idx]
for num in range(1, 10):
row_check = not row_i[r][num]
col_check = not col_i[c][num]
sqr_check = not sqr_i[get_sqr_idx(r, c)][num]
if row_check and col_check and sqr_check:
flag(r, c, num, True)
board[r][c] = num
dfs(idx + 1)
board[r][c] = 0
flag(r, c, num, False)
dfs(0)
solve()✏️ 5. SQL 카테고리 별 도서 판매량 집계하기
-- 5. SQL(Lv.3): 카테고리 별 도서 판매량 집계하기
-- https://school.programmers.co.kr/learn/courses/30/lessons/144855
SELECT
CATEGORY,
SUM(S.SALES) AS TOTAL_SALES
FROM
BOOK B
JOIN
BOOK_SALES S
ON B.BOOK_ID = S.BOOK_ID
WHERE
S.SALES_DATE LIKE '2022-01%'
GROUP BY
B.CATEGORY
ORDER BY
B.CATEGORY ASC;