본문 바로가기

알고리즘

(60)
BOJ 1655 가운데를 말해요 1655번: 가운데를 말해요 (acmicpc.net) 1655번: 가운데를 말해요 첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -1 www.acmicpc.net 나는 multiset을 사용하여 풀었다. Naive한 방법으로 생각했을때, 배열을 탐색하여 중간값을 찾겠다고 한다면 시간복잡도 O(nm) 으로 시간초과가 될 것이라고 생각했다. 그래서 각 Query당 최대 O(log n) 만큼의 시간복잡도를 가지는 자료구조가 필요하다고 생각했고, 떠올린 것이 이진 트리였다. 그리고 숫자가 하나씩 들어오니까 다음 출력 값은 바로 전 출력된 값과 인접한 숫자들로 ..
BOJ 2169 로봇 조종하기 2169번: 로봇 조종하기 (acmicpc.net) 2169번: 로봇 조종하기 첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음 N개의 줄에는 M개의 수로 배열이 주어진다. 배열의 각 수는 절댓값이 100을 넘지 않는 정수이다. 이 값은 그 지역의 가치를 나타낸다. www.acmicpc.net 선 요약 : DP문제였다. 처음에는 다음 조건들 때문에 완전 탐색으로 풀어야하나 고민했었다. 1. 탐사한 지역은 다시 탐사하지 않는다. 2. 로봇은 배열에서 오른쪽, 왼쪽, 아래쪽으로 이동하지만, 위쪽으로 이동할 수 없다. (내가 지금까지 봤었던 DP문제들은 전부 한쪽 방향으로만 움직이면서 풀었기 때문에 왼쪽, 오른쪽 두방향으로 움직이는 이 조건 때문에 처음에는 DP라고 생각하지 못했다.) 하지만, 시..
BOJ 2887 행성 터널 www.acmicpc.net/problem/2887 2887번: 행성 터널 첫째 줄에 행성의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 다음 N개 줄에는 각 행성의 x, y, z좌표가 주어진다. 좌표는 -109보다 크거나 같고, 109보다 작거나 같은 정수이다. 한 위치에 행성이 두 개 이 www.acmicpc.net 문제를 요약하자면 MST의 Cost를 구하는 문제이다. 단, 이 문제의 값 크기는 1 ≤ N ≤ 100,000 로 Naive하게 모든 행성들의 간선 거리를 구하려고 한다면 10^15가 되어 시간내에 풀지 못할 것이다. 이 문제에서 잘 봐야할 것은 터널을 연결할 때 드는 비용이다. "두 행성 A(xA, yA, zA)와 B(xB, yB, zB)를 터널로 연결할 때 드는 비용은 min..
BOJ 13334 철로 www.acmicpc.net/problem/13334 13334번: 철로 입력은 표준입력을 사용한다. 첫 번째 줄에 사람 수를 나타내는 양의 정수 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 각 줄에 정수 쌍 (hi, oi)가 주어진다. 여기서 hi와 oi는 −100,000,000이상, 100,000,0 www.acmicpc.net 이 문제를 단순화 시킨다면 다음과 같이 정의할 수 있다. "시작점으로부터 거리 d (d > 0) 보다 가까이 있는 도착점의 개수 중 최대 값" 그래서 시작점, 도착점을 각각 벡터에 저장하여 정렬한 뒤, 2-pointer를 사용하여 문제를 해결하였다. 시작점으로부터 거리가 d 초과인 도착점이 나올 때 까지 도착점의 index를 하나씩 늘렸고, 그에 따라 loca..
BOJ 5052 전화번호 목록 www.acmicpc.net/problem/5052 5052번: 전화번호 목록 첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가 www.acmicpc.net 처음에는 Naive하게 문자열을 입력받을 때 마다 지금까지 입력받았던 모든 문자열과 비교하여 일관성을 체크하는 방법을 생각했다. 해당 방법은 시간복잡도 O(t * n ^2) 이니 될리가 없었다. 이 문제에서 시간을 줄이기 위해서는 앞서 입력받은 문자열들과 비교하는 횟수를 줄일 필요가 있다. 문자열의 비슷한 구간이 모아져있다면, 비교횟수를 줄일 수 있을 것이라고 생각했고, 이와 비슷한 아이..
BOJ 12100 2048 (Easy) www.acmicpc.net/problem/12100 12100번: 2048 (Easy) 첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2 www.acmicpc.net 보드를 이동시켰을 때 보드위의 숫자들을 합하는 것이 관건인 문제였다. 나는 보드 위의 행 혹은 열을 vector v에 담아 넘겨주면, 그것을 이동시켜주는 merge 함수를 구현하였고, 이동에 따라 v에 담는 순서를 다르게 하여 merge함수에 넘겨주었고, 알아서 합쳐주게 하였다. 그것만 구현한다면, 방향에 따른 처리 순서는 인덱스 처리 문제여서 크게 문제될 것이 없다. 코드는 다음과..
BOJ 7423 합이 0인 네 정수 www.acmicpc.net/problem/7453 7453번: 합이 0인 네 정수 첫째 줄에 배열의 크기 n (1 ≤ n ≤ 4000)이 주어진다. 다음 n개 줄에는 A, B, C, D에 포함되는 정수가 공백으로 구분되어져서 주어진다. 배열에 들어있는 정수의 절댓값은 최대 228이다. www.acmicpc.net 처음 봤을 때 Naive하게 생각하는 것으로 문제를 풀면서 해를 얻어갔다. 가장 처음 생각나는 풀이는 4중 for문으로 푸는 방법이었고, 이는 시간 복잡도가 O(n^4) 으로 n >= 4000 이였기 때문에 다른 문제들에 비해 넉넉했던 12초도 부족하여 문제 풀이에 적합하지 않았다. 여기서 첫번째로 생각났던 것은 4개의 합을 한꺼번에 찾는 것이 아니라, 2개의 합 + 2개의 합 으로 나누어 생..
BOJ 2252 줄 세우기 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 연결관계를 파악하기 위해서 graph가 필요하였고, 이를 어떻게 사용해야지 같은 graph에 속한 node간의 선후관계를 파악할 수 있을지 고민하였다. 그래프를 그려보니 가장 첫번째에 줄을 설 수 있는 node는 부모가 없음을 확인하였다. 그 노드를 지워보니 두번째에 줄을 설 수 있는 node들의 후보군들도 부모가 없음을 확인하였다. 여기서 부모가 없는 node를 줄을 세우고 제..