✅ 02 회차 모의고사 D-29일

🚨 강의영상링크


🚀 1차 코딩테스트 대비

  1. 백준 1244 (스위치 켜고 끄기)
  2. 백준 1064 (평행사변형)
  3. 백준 11478 (서로 다른 부분 문자열의 개수)
  4. 백준 1439 (뒤집기)
  5. SQL 12세 이하인 여자 환자 목록 출력하기

👨‍🏫 COLAB

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차 코딩테스트 대비

  1. 백준 14891 (톱니바퀴)
  2. 백준 11048 (이동하기)
  3. 백준 1916 (최소비용 구하기)
  4. 백준 2580 (스도쿠)
  5. SQL 카테고리 별 도서 판매량 집계하기

👨‍🏫 COLAB

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;