알고리즘/백준 109

백준 21921: 블로그 (Python)

https://www.acmicpc.net/problem/21921 21921번: 블로그 첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다 www.acmicpc.net 투 포인터 이용 n, x = map(int, input().split()) visitors = list(map(int, input().split())) i = j = 0 temp = result = 0 cnt = 0 for i in range(n): # 끝 포인터 이동 while j-i < x and j < n: temp += visitors[j] j += 1 # x일 if j-i == x..

알고리즘/백준 2023.06.15

백준 16918: 봄버맨 (Python)

https://www.acmicpc.net/problem/16918 16918번: 봄버맨 첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다. www.acmicpc.net n=0일 때: 폭탄 설치 n=1일 때: 그대로 n=2일 때~: 나머지 모든 칸에 폭탄 설치 -> 폭발 반복 r*c 크기의 bombs 배열을 모두 0으로 초기화하고, 초기 상태 배열을 입력받으면서 'O'인 부분은 2로 바꿔준다. (0초 - 1초 상태) i=2부터 n+1까지 for문을 돌려주면서 1. bombs 순회하면서 값을 하나씩 감소시키고, 2. i가 짝수일 때에는 모든 칸에 폭탄 설치 -> 0인 부분을 3으로 ..

알고리즘/백준 2023.05.02

백준 12933: 오리 (Python)

https://www.acmicpc.net/problem/12933 12933번: 오리 첫째 줄에 영선이가 녹음한 소리가 주어진다. 소리의 길이는 5보다 크거나 같고, 2500보다 작거나 같은 자연수이고, 'q','u','a','c','k'로만 이루어져 있다. www.acmicpc.net 로직은 이러함.. 이때까지만 해도 쉬운 문제인 줄 알았지.. 첫 시도 (실패) sound를 차례대로 순회하면서 q -> u -> a -> c -> k 에 해당하면 넘어가고, 해당하지 않으면 temp 배열에 문자를 넣는다. 순회가 끝난 후 sound와 temp가 같다면 (q-u-a-c-k를 찾지 못한 경우) break해주고, 같지 않다면 sound = temp 후 정답을 하나씩 추가했다. sound = input() du..

알고리즘/백준 2023.04.14

백준 1766: 문제집 (Python)

https://www.acmicpc.net/problem/1766 1766번: 문제집 첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주 www.acmicpc.net 위상정렬을 이용해서 풀면 되는데 '먼저 푸는 것이 좋은 문제'에 대한 정보를 간선으로 저장하고 가능하면 쉬운 문제를 먼저 풀어야 하는데 난이도는 1번~n번 차례대로 되어 있으니 큐를 오름차순으로 정렬해서 쓰면 된다. -> 우선순위 큐 사용함 # 우선순위큐 from queue import PriorityQueue # 생성 q = PriorityQueue() q = Pr..

알고리즘/백준 2022.08.05

백준 2252: 줄 세우기 (Python)

https://www.acmicpc.net/problem/2252 2252번: 줄 세우기 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의 www.acmicpc.net import sys from collections import deque input = sys.stdin.readline n, m = map(int, input().split()) students = [[] for _ in range(n+1)] # 간선에 대한 정보 (순서 저장) indegree = [0] * (n+1) # 진입차수 for _ in ran..

알고리즘/백준 2022.08.05

백준 2887: 행성 터널 (Python)

https://www.acmicpc.net/problem/2887 2887번: 행성 터널 첫째 줄에 행성의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 다음 N개 줄에는 각 행성의 x, y, z좌표가 주어진다. 좌표는 -109보다 크거나 같고, 109보다 작거나 같은 정수이다. 한 위치에 행성이 두 개 이 www.acmicpc.net 처음에는 1774번(우주신과의 교감) 문제처럼 비용에 따른 간선을 모두 정의해주었다. 하지만 문제 조건에서 n의 수가 굉장히 크기 때문에 메모리 초과가 발생한다. import sys input = sys.stdin.readline def find(parent, x): if parent[x] != x: parent[x] = find(parent, parent[x]) ..

알고리즘/백준 2022.08.04

백준 1774: 우주신과의 교감 (Python)

https://www.acmicpc.net/problem/1774 1774번: 우주신과의 교감 (1,1) (3,1) (2,3) (4,3) 이렇게 우주신들과 황선자씨의 좌표가 주어졌고 1번하고 4번이 연결되어 있다. 그렇다면 1번하고 2번을 잇는 통로를 만들고 3번하고 4번을 잇는 통로를 만들면 신들과 선자씨끼 www.acmicpc.net 크루스칼 알고리즘에서 이미 연결된 노드들을 미리 연결해주고 노드들의 간선을 직접 정의해주면 되는 문제다 처음 생각했던 건 이미 연결된 통로들을 따로 저장하고 합친 후 그 통로들을 빼고 간선들을 모두 돌면서 union하는 거였는데 시간 초과가 떴다ㅠ def find(parent, x): if parent[x] != x: parent[x] = find(parent, pare..

알고리즘/백준 2022.08.04

백준 1197: 최소 스패닝 트리 (Python)

https://www.acmicpc.net/problem/1197 1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 www.acmicpc.net 일반적인 크루스칼 알고리즘으로 풀면 된다. 1. 간선 -> 비용 기준 오름차순 정렬 2. 사이클이 발생하지 않으면(= parent가 같지 않으면) union 한번 에러났었는데,,, 어이없게도 cost 기준으로 정렬한다는 생각에 사로잡혀서 간선에 대한 정보 a, b, c를 입력 받을 때 c, a, b로 입력받음,,ㅎ 실수하지 말자 import sys s..

알고리즘/백준 2022.07.29

백준 4195: 친구 네트워크 (Python)

https://www.acmicpc.net/problem/4195 4195번: 친구 네트워크 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진 www.acmicpc.net 입력받는 요소가 사람이름이기 때문에 숫자로 관리하기 위해 딕셔너리(people)를 선언하고 1. a, b 입력받아서 2. 딕셔너리에 존재하지 않으면 추가, parent 추가 3. union 그 후 연결되어 있는 요소들의 개수를 출력하기 위해 원래 count 함수를 썼는데 제대로 못 잡아내길래 for문을 썼다 ㅎㅎ시간초과 import sys sys.setrecursionlimit(1000..

알고리즘/백준 2022.07.28

백준 1976: 여행 가자 (Python)

https://www.acmicpc.net/problem/1976 1976번: 여행 가자 동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인 www.acmicpc.net 문제의 해결법은 쉽게 생각해낼 수 있었다. 입력된 여행 계획의 도시들이 서로 연결되어 있는지만 확인하면 된다. 도시들의 연결 정보를 입력받을 때 1이면 union해준다. 계획을 입력받은 후 시간을 줄이기 위해 리스트에서 중복 원소를 제거해주고 find를 통해 모두 같은 부모를 가지고 있는지(= 하나의 집합인지) 확인해주면 된다. def find_parent(parent, x): if parent[..

알고리즘/백준 2022.07.28