본문 바로가기

알고리즘/백준

(109)
[BOJ 1024] 수열의 합(Java, 단순한 풀이) https://www.acmicpc.net/problem/1024 1024번: 수열의 합 첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다. www.acmicpc.net 이 문제는 2가지 방법으로 풀이를 작성하겠다. # 풀이1(직관적이나 시간복잡도가 큼). 1. 길이가 L부터 100까지 탐색을 한다. While문 내에서 합을 L만큼 더해가면서, 합이 N을 만들 수 있는 모든 수를 탐색한다. 2. 합이 N이라면, 정답을 출력한다. 해설코드(Java). 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 ..
[BOJ 1068] 트리(Java, 간단한 풀이, Set) https://www.acmicpc.net/problem/1068 1068번: 트리 첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다 www.acmicpc.net 1. 입력을 처리할 때, 각 노드의 부모 노드를 기억, 노드의 자식 노드들을 기억할 수 있도록 데이터를 저장하는 자료구조를 사용한다. 2. 제거해야하는 노드가 있으면, 부모 노드의 자식 노드에서 해당 노드를 지우고, 제거해야하는 노드와 연결된 노드들을 큐를 사용해 모두 체크한다. 3. 전체 노드들을 탐색하면서, 자식 노드가 0이며 제거햐아하는 노드와 연결되지 않은 것을 정답의 값에 추가한다...
[BOJ 1405] 미친 로봇(Java, DFS, 간단한 풀이) https://www.acmicpc.net/problem/1405 1405번: 미친 로봇 첫째 줄에 N, 동쪽으로 이동할 확률, 서쪽으로 이동할 확률, 남쪽으로 이동할 확률, 북쪽으로 이동할 확률이 주어진다. N은 14보다 작거나 같은 자연수이고, 모든 확률은 100보다 작거나 같은 자�� www.acmicpc.net 1. 로봇은 방문했던 곳을 방문하지 않고 정해진 횟수의 이동을 끝내는 경우를, 단순한 경로라고 한다. 단순한 경로들을 찾아가면서, 발생할 확률들의 합을 구하면 정답이 된다. 2. 로봇의 방문을 DFS를 통해서 전체 탐색을 하도록 한다. 해설코드(Java). 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 ..
[BOJ 2616] 소형기관차(Java, Dynamic Programming, 동적계획법, Bottom-up, Top-down 풀이) https://www.acmicpc.net/problem/2616 2616번: 소형기관차 첫째 줄에 기관차가 끌고 가던 객차의 수가 입력된다. 그 수는 50,000 이하이다. 둘째 줄에는 기관차가 끌고 가던 객차에 타고 있는 손님의 수가 1번 객차부터 차례로 입력된다. 한 객차에 타고 있� www.acmicpc.net 1. 다이나믹 프로그래밍 정의에 맞게 작은 문제를 이용해 큰 문제를 해결하기 위해 두 가지 매개변수 이용(소형기관차의 수, 탐색한 객실 번호) * 다이나믹 프로그래밍 감이 오지 않는다면, https://www.zerocho.com/category/Algorithm/post/584b979a580277001862f182 참고 2. 2차원 형태의 배열을 생각하고 점화식을 고려(행 : 소형기관차의..
[BOJ 1933] 스카이라인(Java, Treemap, 설명, 간단한 코드) https://www.acmicpc.net/problem/1933 1933번: 스카이라인 첫째 줄에 건물의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 N개의 건물에 대한 정보가 주어진다. 건물에 대한 정보는 세 정수 L, H, R로 나타나는데, 각각 건물의 왼쪽 x좌표, 높이, 오� www.acmicpc.net 스카이라인을 형성할 때, 위의 건물들의 각 시작점과 끝점을 살펴보면 가장 높은 건물의 높이를 따라가게 되어있다. 즉. 빨간색으로 표시한 점들을 모두 조사해서 걸쳐진 빌딩 중 가장 높은 높이를 표기해주면 된다. 걸쳐진 빌딩 중 가장 높은 높이를 찾는 방법은, 높이를 내림 차순으로 정렬하는 자료구조를 사용해야 한다. 또한 끝난 빌딩의 높이에 대해서는 연산하지 않기 위해서,..
[BOJ 1863] 스카이라인 쉬운거(Java, Stack) https://www.acmicpc.net/problem/1863 1863번: 스카이라인 쉬운거 첫째 줄에 n이 주어진다. (1≤n≤50,000) 다음 n개의 줄에는 왼쪽부터 스카이라인을 보아 갈 때 스카이라인의 고도가 바뀌는 지점의 좌표 x와 y가 주어진다. (1≤x≤1,000,000. 0≤y≤500,000) 첫 번째 지점 www.acmicpc.net 1. 주어진 입력에서 y와 높이가 같은 건물은 최소 1개 존재해야 한다. 2. 최소 1개는 존재해야 하는 건물이 최대한 넓은 범위를 커버해야, 최소의 갯수를 찾을 수 있다. 3. 고도가 변하는 지점들을 모두 체크하면서, Stack 자료구조를 이용한다. * 고도가 같다면 그대로 가면되고, 고도가 낮다면 건물의 개수가 추가되어야 한다. 해설코드(Java). ..
[BOJ 10799] 쇠막대기(Java, Replace, 직관적인 풀이) https://www.acmicpc.net/problem/10799 10799번: 쇠막대기 여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저� www.acmicpc.net 1. 우선, 문자별로 처리를 하기 위해서 "()"을 모두 replace한다. * 함수를 쓸 때, str.replaceAll("()", "r")을 하면 안되고, '('와 ')'은 모두 escape 문자이므로 앞에 '\\'을 붙여줘야 한다. 2. 레이저 포인트를 쐈을 때, 레이저 이전의 막대의 개수를 파악하고 모두 더한 후에 마지막 막대의 개수만 더해준다. * 막대의 개수를 파악하기 위해서, cur과 end라..
[BOJ 3671] 산업 스파이의 편지(Java, 소수 구하기, DFS) https://www.acmicpc.net/problem/3671 3671번: 산업 스파이의 편지 문제 안녕하세요. 저는 산업 스파이입니다. 저의 정체를 절대 다른 사람에게 말하지 말아주세요. 저의 가장 최근 일은 유명한 수학 연구소의 최신 연구 결과를 훔쳐오는 것이었습니다. 저는 매�� www.acmicpc.net 1. 주어진 문자열을 순열로 나열해서 소수인지 판단하기 2. 소수가 맞다면, 중복 제거를 위한 Set 자료구조에 넣기 3. Set의 Size 출력하기 * 소수인지 판단하는 가장 효율적인 알고리즘 판단하는 수의 루트값을 이용해서 for문을 작성하면 된다. 루트값까지만 사용하면, 소수인지 아닌지 판별할 수 있다. 왜냐하면, 루트값 이후의 값들은 모두 루트값 이전 약수들을 이용해서 만들 수 있기 ..