본문 바로가기

🔅코딩테스트 공부🔅/❗백준138

[백준] 18352번 특정 거리의 도시 찾기(python) https://www.acmicpc.net/problem/18352 18352번: 특정 거리의 도시 찾기 첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개 www.acmicpc.net 1. 난이도 실버2 2. 내가 작성한 풀이 from collections import deque import sys input = sys.stdin.readline INF = int(1e9) n, m, k, x = map(int, input().rstrip().split()) distance = [INF] * (n+1) #최.. 2023. 3. 20.
[백준] 1377번 버블 소트(python) https://www.acmicpc.net/problem/1377 1377번: 버블 소트 첫째 줄에 N이 주어진다. N은 500,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 A[1]부터 A[N]까지 하나씩 주어진다. A에 들어있는 수는 1,000,000보다 작거나 같은 자연수 또는 0이다. www.acmicpc.net 1. 문제 해결 과정 n의 크기가 500,000이기 때문에 버블 정렬 알고리즘을 코드로 구현해 풀면 시간초과가 발생한다.(버블 정렬은 O(N^2)) 따라서 index를 이용한 아이디어를 이용해 문제를 풀어야한다. 오른쪽에 작은 수가 있는 경우, 한 번의 loof에서 1만큼의 인덱스가 왼쪽으로 이동한다. 이 경우에 (정렬 전 index) - (정렬 후 index)를 하면 양수.. 2023. 3. 8.
[백준] 17298번 오큰수(python) https://www.acmicpc.net/problem/17298 17298번: 오큰수 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다. www.acmicpc.net 1. 난이도 골드 4 2. 문제 해결 방법 시간초과, 메모리초과 난사로 멸망당하고 구글링을 해서 풀었다. answer이라는 배열을 -1로 모두 저장해놓은 후, stack에 값이 있고, num[index] > stack[top] 인 경우 인덱스를 이용해 정답 배열에 오큰수를 저장한다. 위의 과정이 끝나면 현재 인덱스를 스택에 저장하고 다음 인덱스로 넘어간다. import sys input = sys.stdin.. 2023. 3. 7.
[백준] 11003 최솟값 찾기(python) https://www.acmicpc.net/problem/11003 11003번: 최솟값 찾기 N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다. www.acmicpc.net 1. 난이도 플레티넘 5 이 문제의 데이터의 범위는 0 ~ 5,000,000이기 때문에 정렬(O(nlogn))을 이용해서 풀면 시간초과가 발생한다. 따라서 deque를 이용해 정렬을 진행해야한다. 문제를 해결하는 알고리즘은 1. deque의 마지막에 있는 값들부터 현재 들어올 값보다 크면 최솟값이 아니기 때문에 모두 pop을 시킨다. 2. dequq의 마지막에 현재.. 2023. 3. 6.
[백준] 12891번 DNA 비밀번호(python) https://www.acmicpc.net/problem/12891 12891번: DNA 비밀번호 평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. 예를 들어 “ACKA” www.acmicpc.net 1. 난이도 실버2 (🥈) 2. 문제 해결 방법 부분문자열의 크기가 1,000,000으로 크기 때문에 시간복잡도 O(n) 으로 해결해야한다. 따라서 슬라이딩 윈도우 + 딕셔너리를 이용해서 문제를 해결했다. (다른 푼들이 푸는 코드를 보니 단순하게 if elif를 사용하는게 더 이득이었던 거 같음,,) 1. DNA라는 딕셔너리를 선언해주고, 첫 start 부터 end까지의 염.. 2023. 3. 5.
[백준] 1005번 ACM Craft(python) https://www.acmicpc.net/problem/1005 1005번: ACM Craft 첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부 www.acmicpc.net 1. 난이도 골드 3 2. 문제 해결 방법 건물을 짓는 순서가 정해져 있으며, 가장 빨리 지을 때까지의 최소시간을 알아내야한다. 따라서 순서가 정해져 있는 작업을 차례대로 수행할 때 사용되는 알고리즘인 위상정렬을 이용해 문제를 해결했다. value라는 새로운 list를 만들고, value에는 그 건물을 짓기 위한 시간을 누적해 저장한다. value 가 0인 경우는 아직 시간 측정이 안 된 건.. 2023. 3. 4.
[백준] 21921번 블로그(python) https://www.acmicpc.net/problem/21921 21921번: 블로그 첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다 www.acmicpc.net 1. 난이도 실버 3 2. 문제 해결 방법 넓이 구간이 고정되어 있으면 슬라이딩 윈도우를 이용하고, 유동적이면 투 포인터를 이용하면 된다. 처음에 sum 함수를 while문 속에 넣어서 문제를 풀었는데 O(N^2)가 되어 시간초과가 발생했다. (sum함수의 시간복잡도는 O(N)) 두 번째로는 투 포인터 방식을 이용했는데, 구간이 유동적이지 않아 굳이 이 방법을 사용할 필요가 없다는 걸 깨달.. 2023. 3. 3.
[백준] 1940번 주몽(python) https://www.acmicpc.net/problem/1940 1940번: 주몽 첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고 www.acmicpc.net 1. 난이도 실버 4 2. 문제 해결 방법 투 포인터를 이용하면 된다. 데이터의 크기가 작기 때문에 sort를 이용해 정렬한 후, start + end 의 값이 m과 같을 경우 카운팅해줬다. 3. 내가 작성한 코드 n = int(input()) #재료의 개수 m = int(input()) #번호 합 material = list(map(int, input().split()).. 2023. 3. 3.
[백준] 2018 수들의 합(python) https://www.acmicpc.net/problem/2018 2018번: 수들의 합 5 어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한 www.acmicpc.net 1. 난이도 실버5 (🥈) 2. 문제 해결 방법 투 포인터를 이용해 문제를 해결했다. 투 포인터란 list를 순차적으로 접근할 때 start 와 end라는 두 점으로 각각 기록하는 알고리즘이다. 3. 내가 작성한 코드 Version1 n = int(input()) num = [i for i in range(1,n+1)] interval_sum = 0 cnt = 0 end = .. 2023. 3. 3.