공부 자료/알고리즘 116

(Python/파이썬) 백준 1766번 - 문제집

문제출처: https://www.acmicpc.net/problem/1766 1766번: 문제집 첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주 www.acmicpc.net 1. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 # 위상정렬 알고리즘 # 진입차수가 0인 정점 큐에 삽입 # 큐에서 원소 꺼내 원소 간선 제거 # 제거 이후 진입차수가 0이된 정점 큐 삽입 # 큐가 빌 ..

(Python/파이썬) 백준 2252 - 줄 세우기

문제출처: 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 1. 코드: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import sys import sys from collections import deque n,m = map(int, input().split()) graph = [[] for _ in ran..

(Python/파이썬) 백준 2644번 - 촌수계산

문제출처: https://www.acmicpc.net/problem/2644 2644번: 촌수계산 사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어 www.acmicpc.net 1. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from collections import deque import sys N= int(input()) #사람 수 a,b = map(int, input().split()) #촌 수 계산 두 번호 M = i..

(Python/파이썬) 백준 2667번 - 단지번호붙이기

문제출처: https://www.acmicpc.net/problem/2667 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여 www.acmicpc.net 1. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #dfs #인접한 곳에 1이 있으면 그 점에서 다시 인접한 곳 탐색 #탐색할 때마다 카운트 세주고, 탐색 끝나면 정답 저장 n= int(input()) graph =[] for _ in ran..

(Python/파이썬) 백준 2583번 - 영역 구하기

문제출처: https://www.acmicpc.net/problem/2583 2583번: 영역 구하기 첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오 www.acmicpc.net 1. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 from collections import deque #m = 세로, n=가로 , k= 직사각형 갯수 #bfs활용 m,n,k = map(int,..

(Python/파이썬) 백준 2553번 - 마지막 팩토리얼 수

문제출처:https://www.acmicpc.net/problem/2553 2553번: 마지막 팩토리얼 수 첫째 줄에 N이 주어진다. N은 20,000보다 작거나 같은 자연수 이다. www.acmicpc.net 1. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 n = int(input()) fact = 1 for i in range(n): fact *= i+1 fact = str(fact) for find in fact[::-1]: if find == '0': continue else: print(find) break cs 2. 해결과정 n을 입력 받고 fact 에 n! 값을 저장을 해준다. 그 후에 str로 변환시켜준다. fact 리스트를 뒤에서 부터 찾아주면서 0이면 다시 찾고, ..

(Python/파이썬) 백준 12847번 - 꿀 아르바이트

문제출처: https://www.acmicpc.net/problem/12847 12847번: 꿀 아르바이트 월세를 내기 바로 전 날 까지 인 n (0 < n ≤ 100,000) 일과 일을 할 수 있는 날 m (0 ≤ m ≤ n) 일이 주어진다. 그 다음 줄 에는 1일부터 n일 까지 일급 Ti가 순서대로 주어진다. (0 < Ti ≤ 1,000,000) www.acmicpc.net 1. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import sys input = sys.stdin.readline n,m = map(int, input().split()) money = list(map(int,input().split())) work = m #일할 수 있는 날..

(Python/파이썬) 백준 12605번 - 단어순서 뒤집기

문제출처: https://www.acmicpc.net/problem/12605 12605번: 단어순서 뒤집기 스페이스로 띄어쓰기 된 단어들의 리스트가 주어질때, 단어들을 반대 순서로 뒤집어라. 각 라인은 w개의 영단어로 이루어져 있으며, 총 L개의 알파벳을 가진다. 각 행은 알파벳과 스페이스로만 www.acmicpc.net 1. 코드 1 2 3 4 5 6 7 8 9 10 11 12 from collections import deque n = int(input()) for case in range(n): stack = deque(input().split()) print(f"Case #{case+1}: ", end='') while len(stack) > 1: print(stack.pop(), end= ' ..

(Python/파이썬) 백준 1874번 - 스택 수열

문제출처: https://www.acmicpc.net/problem/1874 1874번: 스택 수열 1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다. www.acmicpc.net 1. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import sys n = int(sys.stdin.readline()) arr =[] #입력값 순서대로 담을 배열 stack=[] #스택으로 활용 ans=..

(Python/파이썬) 백준 1158번 - 요세푸스 문제

문제출처: https://www.acmicpc.net/problem/1158 1158번: 요세푸스 문제 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) www.acmicpc.net 1. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import sys n,k = map(int, sys.stdin.readline().split()) num=[i for i in range(1,n+1)] ans = [] tmp =k-1 for i in range(n): #위치가 리스트 안넘을 때 if len(num)>tmp: ans.append(num.pop(tmp)) #tmp번째 숫자 제거, k-1..