백준 문제 풀이 17

6064 카잉 달력 (python)

풀이https://devum.tistory.com/83 이 분 사진을 참고했다. while문은 x를 m씩 계속 증가시키는데, 그 값은 m*n보다 커질 수 없으니 while x이 문제는 두 가지만 이해하면 된다.1. x값을 고정시켜두고 M값을 증가시키며 해를 찾음.2. x를 10씩 올려가며 찾은 answer(x +=m)값%N - y%N == 0이 되는 값이 해다. 예를들어 M = 10, N = 12일 때, 를 찾는 문제라면,m = 10, n = 12, x = 3, y = 9x가 3이면 정답은 3, 13, 23, 33, ... 113중 있다. 그래서 x값을 고정시키고, M값을 증가시키면서 해를 찾는데y값은 증가시킨 x값들을 살펴봤을 때, answer(증가시킨 x)%n == y 값이 있다면 그게 해가 된다.-..

2606 바이러스 (python)

문제  첫 번째 풀이import sysinput = sys.stdin.readlinecomputer = int(input().strip())n = int(input().strip())connect = []for _ in range(n):    connect.append(list(map(int, input().strip().split())))virus = [0] * (computer + 1)virus[1] = 1def spread_virus(start):    queue = [start]        while queue:        current = queue.pop(0)        for a, b in connect:            if a == current and virus[b] == 0:..

2579 계단 오르기 (python)

문제 코드import sysinput = sys.stdin.readlinen = int(input())lst = [int(input()) for _ in range(n)]dp = [0]*nif len(lst) 2:    print(sum(lst))else:    dp[0] = lst[0]    dp[1] = lst[0] + lst[1]    for i in range(2, n):        # dp[i-3]+lst[i-1]과 dp[i-2]의 최댓값        # 즉 0, 2 -> 3으로 간 것과 0, 1 -> 3 간 것의 최댓값을 구함        dp[i] = max(dp[i-3]+lst[i-1]+lst[i], dp[i-2]+lst[i])    # 마지막 계단까지 최대 점수 출력    print(..

2178 미로탐색 (python)

문제 코드import sysfrom collections import dequeinput = sys.stdin.readlinen, m  = map(int, input().split())graph = []for _ in range(n):    graph.append(list(map(int, input().rstrip())))dx = [-1, 1, 0, 0]dy = [0, 0, -1, 1]def BFS(x, y):    queue = deque()    queue.append((x, y))    while queue:        x, y = queue.popleft()        for i in range(4):            nx = x + dx[i]            ny = y + dy[i]..

1931 회의실 배정 (python)

풀이import sysinput = sys.stdin.readlinen = int(input())lst = []for _ in range(n):    start_time, end_time = map(int, input().split())    lst.append([start_time, end_time])lst.sort(key=lambda x: (x[1], x[0]))solution = [lst[0]]i = 0for j in range(1, len(lst)):    if lst[j][0] >= lst[i][1]:        solution.append(lst[j])        i = jprint(len(solution))회의실 배정 문제는 수업시간에 풀어봤던 문제라 쉽게 풀었다. 알고리즘그리디 알고리즘..

1764 듣보잡 (python)

첫 번째 풀이import sysinput = sys.stdin.readlinen, m = map(int, input().split())a_lst = []b_lst = []for _ in range(n):    a = input().strip()    a_lst.append(a)for _ in range(m):    b = input().strip()    b_lst.append(b)a_lst.sort()b_lst.sort()set_a_lst = set(a_lst)set_b_lst = set(b_lst)print(len(set_a_lst.intersection(set_b_lst)))for i in set_a_lst.intersection(set_b_lst):    print(i)풀어서 정답이 나왔다.하지만..

1697 숨바꼭질 (python)

문제 알고리즘BFS 탐색을 사용해 풀 수 있다.코드import sysfrom collections import dequedef bfs(v):    q = deque([v]) # 시작점 v를 q에 추가    while q:        v = q.popleft() # 덱의 왼쪽에서 요소 제거하고 반환        if v == k: # 현 위치가 동생과 같을 때            return array[v]        # 다음 위치로 이동할 수 있는 경우의 수 확인        for next_v in (v-1, v+1, 2*v):            # 위치가 범위 내에 있고, 아직 방문하지 않은 위치라면            if 0 next_v MAX and not array[next_v]:  ..

1541 잃어버린 괄호 (python)

문제 풀이방법괄호를 가지고 연산의 최솟값을 만들기 위해서는 - 다음 덧셈 부분을 전부 묶어주면 된다.ex) 50-40+45라는 입력이 들어왔을 때, 50-(40+45)로 묶으면 된다.ex) 50+10-40+45+35-25+35라는 입력이 들어왔을 때, 50+10-(40+45+35)-(25+35) 풀이방법을 토대로 한 알고리즘이다.1. - 로 나눈다.    아까 전 50-40+45+35-25+35가 있다면 ['50+10', '40+45+35', '25+35']가 된다.2. 첫 부분은 괄호로 묶어도 의미가 없으니 첫 부분(50+10)은 전부 더한 뒤 sum에 저장한다.3. 나머지 부분(40+45+35, ...) 은 전부 더한 뒤 sum에서 빼준다. 코드import sysinput = sys.stdin.rea..

1074 Z (python)

풀이방법 DP문제이다. 2차원 배열을 4등분하기좌표 r, c가 2배가 됨에 따라 값이 4의 배수로 확장하는 규칙을 찾을 수 있음. (r % 2, c % 2)로 현재 위치 (r, c)가 속한 2x2 배열에서의 상대적인 위치를 나타냄2*(r % 2) + (c % 2)로 상대적인 위치를 기반으로 한 사분면의 인덱스를 계산재귀적으로 이전 단계로 이동:배열을 2^N x 2^N에서 2^(N-1) x 2^(N-1)로 줄임int(r / 2), int(c / 2)는 현재 위치를 절반으로 나누어 새로운 위치를 계산 현재 위치에 대한 순서 합산:4 * sol(N-1, int(r/2), int(c/2))는 이전 단계에서 얻은 순서를 현재 사분면 크기(4배)만큼 확장2*(r % 2) + (c % 2)는 현재 단계에서의 상대적인..