본문 바로가기

알고리즘/백준

(61)
백준 [1748] 수 이어 쓰기 1(Java) 문제 링크 : https://www.acmicpc.net/problem/1748 1748번: 수 이어 쓰기 1 첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다. www.acmicpc.net 완전 탐색 1부터 N까지의 수를 문자형 형태로 만들어 이어붙인뒤, 그 길이를 구한다. 하지만, 제한 시간이 c++ 기준 0.15초 이내로 풀어야 하고 메모리 제한도 128MB이기 때문에, 시간과 메모리 초과가 발생한다. 완전 탐색 최적화 - N의 탐색 범위 최소화 수를 나열해보면 다음 결과를 도출할 수 있다. - 1부터 N 까지의 수는 모두 일의 자리를 가지고 있다. - 만약, N이 10 이상이면, N - 9 개의 십의 자리를 가지고 있다. (1 ~ 9 총 9개) - 만약, N이 100 이상이면 N - ..
백준 [10986] 참외밭(Python3) 문제 링크 : https://www.acmicpc.net/problem/2477 2477번: 참외밭 첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지 www.acmicpc.net 완전 탐색 선에서 해결할 수 있는 문제. 처음엔 ㄱ 형태를 통해 만들어진 온갖 형태를 고려해야 하나 걱정했는데 지문에서 6각형이고, 이동한 순서대로 입력이 들어온다고 써져있어 쉽게 풀 수 있었다. 파이썬이 인덱스 처리에 관대하기 때문에 파이썬을 쓴다면 생각보다 쉽게 풀 수 있다. 먼저 큰 직사각형의 넓이를 구한 뒤, 공백이 생기는 작은 사각형의 넓이를 구해 빼는 식으로 문제를 해결..
백준 [2477] 수열의 합(Python3) 문제 링크 : https://www.acmicpc.net/problem/1024 1024번: 수열의 합 첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다. www.acmicpc.net 수학적 사고가 요구되는 문제. 뭔가 누적합을 사용할 수 있을 거 같아서 여기에 대해 1시간 정도 고민하다 도저히 안 돼서 풀이를 봤다. 완전 탐색 1부터 1,000,000,000까지 돌면서 각 지점에서 2부터 L까지의 합을 구한다. 총 시간 복잡도 O(N * (L - 2))로, N과 L이 최대 값일 때 시간 초과 완전 탐색 최적화 - 누적합 사용. 1부터 1,000,000,000까지의 누적합을 구한 뒤, 한 지점을 정하고 ..
백준 [10986] 나머지 합(Python3) 문제 링크 : https://www.acmicpc.net/problem/10986 10986번: 나머지 합 수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) www.acmicpc.net 지문 해석 연속된 부분 구간의 합을 보고 바로 누적합을 써야 한다는 것을 알았다. 완전 탐색 누적합 배열이 있을 때, 한 누적합을 기준으로, 그 이전 위치의 누적합과 차를 비교해 M의 배수가 되는 쌍을 센다. -> O(N^2)로 시간 초과 완전 탐색 최적화 - 탐색 범위 줄이기 누적합은 계속 커진다는 점을 이용해 두 누적합의 차가 M보..
백준 [1090] 체커(Python3) 문제 링크 : https://www.acmicpc.net/problem/1090 1090번: 체커 N개의 체커가 엄청 큰 보드 위에 있다. i번 체커는 (xi, yi)에 있다. 같은 칸에 여러 체커가 있을 수도 있다. 체커를 한 번 움직이는 것은 그 체커를 위, 왼쪽, 오른쪽, 아래 중의 한 방향으로 한 칸 www.acmicpc.net 좌표 다루는 문제는 경험이나 스킬이 부족해서 잘 풀지 못했는데 이번에 학회 내의 랑이집사 님의 특강을 통해 완전탐색을 통한 문제 추론 과정 설명을 듣고 거기에 맞춰 풀었다. 참고한 블로그 링크 : https://m.blog.naver.com/PostView.naver?blogId=gojib2002&logNo=222207408308&proxyReferer=https:%2F%..
백준 [13913] 숨바꼭질4(Python3) 지문 해석 현재 위치를 X라 할 때, 일정한 범위 (X - 1, X + 1, X * 2)를 탐색한다. 매 이동엔 1초가 필요하니, 큐를 이용하는 BFS 방식이 필요했다. 방문 여부 체크에 관해서는 Boolean 값이면 충분했다. 최적의 탐색 비용의 경우, 큐 삽입 때, 기존 비용 + 1을 하면 간단히 해결됐다. 하지만, 지나온 경로를 표시하는 부분 해결에서 문제를 겪었다. 지나온 경로 문제 해결 1, 2번은 틀린 풀이다. 1. BFS 한 번 더 사용 데이터 범위가 작기 때문에 N -> K로 가는 BFS의 시간 복잡도가 적은것을 이용해 K -> N으로 다시 BFS를 할까 생각했다. 하지만, 이 과정은 코드가 너무 길어지고, 되돌아간 위치가 최단 경로 중 하나인지에 대한 검증이 필요했기 때문에 좋은 해결책이..
백준 [16564] 히오스 프로게이머(Python3) 들어가기 전에 문제를 해결하기 위해 어떤 생각을 했는지 기록하기 위해 쓰는 글입니다. O(10^8)의 계산을 1초라 가정했습니다. 잘못되거나 개선이 필요한 부분 지적은 언제나 환영입니다! 지문 해석 레벨을 올릴 수 있는 총합 K를 적절히 배분해서 얻을 수 있는 가장 높은 최솟값 T를 찾아야 한다. 브루트 포스로 해결한다면 최악의 경우 O(1,000,000 * 1,000,000,000) = O(10^15) 로 시간 초과를 받는다. 이분 탐색으로 해결한다면 O(1,000,000 * log(1,000,000,000)) O(1,000,000 * 29.8) = O(29,800,000) 로 해결할 수 있다. 이분탐색 범위 지정 N = 2 이고 X = {10, 10}, K = 1이라면, T의 값은 어떠한 경우에도 1..
백준 [1045] 도로 무난한 최소 스패닝 트리 문제 문제 설명이 좀 난해할 뿐이지, 기본 개념 문제와 별 차이는 없다. https://www.acmicpc.net/problem/1045 1045번: 도로 0부터 N-1까지의 번호가 매겨져 있는 N개의 도시와 두 도시를 연결하는 도로가 있다. 도로에는 우선순위가 있는데, A와 B가 (A < B) 도로 x로 연결되어 있고, C와 D가 (C < D) 도로 y로 연결되어 있을 때, www.acmicpc.net 문제 요약을 하자면 다음과 같다. i < j 인 간선들 중에서 i가 작은 순으로 나열한다. i 가 같다면, j가 작은 순으로 나열 이 때 모든 도시가 연결되있지 않으면 -1 간선의 수가 M개가 되지 못하면 -1 그 후, 상위 M개의 간선에서 시작점과 끝점의 index 카운팅 후..