BOJ 8

[Python] 백준 2476 용액

2467번: 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 - www.acmicpc.net 투포인터 : 정렬되어 있기 때문에 포인터 2개가 양쪽 끝에서 부터 만날때까지 조여오면된다. sum_waters에 넣고 마지막에 정렬하려했는데, min_water에 최솟값 1개만 저장하면되기 때문에 sort를 사용안했다. 전체코드 import sys input = sys.stdin.readline N = int(input()) waters = list(map(int, input().split())) # print(N, waters) sum_waters = [..

[Python] 백준 14567 선수과목 (Prerequisite)

14567번: 선수과목 (Prerequisite) 3개의 과목이 있고, 2번 과목을 이수하기 위해서는 1번 과목을 이수해야 하고, 3번 과목을 이수하기 위해서는 2번 과목을 이수해야 한다. www.acmicpc.net 위상정렬 : 다이나믹 프로그래밍도 사용해야 한다. 처음 진입차수 0을 큐에 넣을때, DP값을 1로 초기화 해준다. 이건 곧바로 이수할 수 있는 과목이기때문에 1을 넣는 것이다. DP[i]값 업데이트는 이전 노드의 DP값 + 1 또는 원래 DP[i]값 중 최댓값을 택하면 된다. 전체코드 import sys import collections input = sys.stdin.readline N, M = map(int, input().split()) inDegree = [0 for _ in ran..

[Python] 백준 2623 음악프로그램

2623번: 음악프로그램 첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한 www.acmicpc.net 위상정렬 : 위상정렬의 핵심은 그래프와 진입차수 같다. 여기 입력이 꼬여버리면 복잡해진다. 마지막에 주의할 점은 가수 순서를 못만들때를 고려해 주어야 한다. result의 길이로 판별을 했다. 전체코드 import sys import collections input = sys.stdin.readline N, M = map(int, input().split()) inDegree = [0 for _ in range(N + 1)] graph = c..

[Python] 백준 2056 작업

2056번: 작업 수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해 www.acmicpc.net 위상정렬 마스터를 해야지 이런 느낌으로 위상정렬 문제만 풀고있다. 전체적으로는 비슷한 문제여서 백준 티어 경험치작을 하고싶다면 위상정렬 문제를 푸는게 어떨까 추천한다. 어차피 티어는 자기만족이니깐.. 위상정렬 : DP를 사용해서 작업시간을 업데이트 시켜준다. 주의할 점은 작업이 가장 오래걸린 것을 출력해야한다. 1로 출발해서 N으로 끝나는 작업이 예시로 들어왔지만, 그렇지 않은 경우도 있기 때문에 max값을 출력해주면 된다. 전체코드 import sys..

[Python] 백준 1766 문제집

1766번: 문제집 첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주 www.acmicpc.net 위상정렬 : 위상정렬에 우선순위 큐를 사용해야 한다. 파이썬은 힙큐가 있기 때문에 너무 쉽다. 하지만 좀 막막할 수가 있다. 힙큐 쓰는 것을 솔직히 알고리즘 분류 클릭해보고 나서 알았다. 전체코드 import sys import heapq import collections input = sys.stdin.readline N, M = map(int, input().split()) inDegree = [0 for _ in range(N..

[Python] 백준 1516 게임 개발

1516번: 게임 개발 첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부 www.acmicpc.net 위상정렬 : 위상정렬 문제를 두번째 푸는 건데 느낌이 비슷한 것 같다. inDegree에 진입차수를 집어넣는게 핵심이다. 진입차수가 0이면 큐에 집어넣고 돌려준다. DP값에는 조건에 맞게 값을 넣어주면 된다. 전체코드 import sys import collections input = sys.stdin.readline N = int(input()) times = [0 for _ in range(N + 1)] dp = [0 for _ in range(N..

[Python] 백준 2011 암호코드

2011번: 암호코드 나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다. www.acmicpc.net 다이나믹 프로그래밍 : 한번에 이해하기 어려웠다. 왜 i - 2인덱스에 접근해야 할까. 특정한 상황이 아니면 DP[i] = DP[i - 1] 이다. 하지만 뒤에 수를 가져다 붙여서 두자리 수 and 26이하의 수를 만들 수 있다면 DP[i - 2]를 추가해주어야 한다. i - 2에 접근하는 이유는 갖다 붙일 수 있는 상태의 수이기 때문이다. DP[3] (2, 5, 1), (25, 1) DP[4] (2, 5, 1, 1), (25, 1, 1), (2, 5, 11), (25, 11) ..

[Python] 백준 15663 N과 M (9)

15663번: N과 M (9) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 백트래킹 : 중복되는 수열을 제외해야한다. 2 4 4가 있고 길이가 2이면 2 - 4(첫번째 4) 2 - 4(두번째 4)가 중복된다. 주어진 수를 제거하면 안되는게 2 4 4에서 중복되는 4를 제거하면 2 4가 되어 4 - 4 수열을 체크 못한다. 그래서 중복되는 값을 없애야하고 자연스럽게 in을 사용했지만, in은 시간복잡도가 list와 tuple일때 O(N)이지만 set, dict일때 O(1)이다. 그래서 set을 사용했다. 전체코드 import sys im..