본문 바로가기

알고리즘

(179)
[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차원 형태의 배열을 생각하고 점화식을 고려(행 : 소형기관차의..
[JAVA] 소수점 자릿수 출력하기(백준 3053, 택시 기하학) 실수를 출력해야 하는 상황에서, 소수점을 원하는 자릿수만큼 출력해야 하는 상황이 존재한다. String.format("%.nf", 실수) 실수는 double형이나 float형을 사용할 수 있고, n은 몇 번째 자릿수까지 표기할 것에 관한 변수이다. 실제 적용해볼 수 있는 문제로 아래 문제를 추천한다. https://www.acmicpc.net/problem/3053 3053번: 택시 기하학 문제 19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다. 택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다. D(T1,T2) = |x1-x2| + | www.acmicpc.net 해설코드(Java). 1 2 3 4 5 6 7 8 9..
[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문을 작성하면 된다. 루트값까지만 사용하면, 소수인지 아닌지 판별할 수 있다. 왜냐하면, 루트값 이후의 값들은 모두 루트값 이전 약수들을 이용해서 만들 수 있기 ..
[BOJ 2981] 검문(Java, 유클리드 호제법, Set) https://www.acmicpc.net/problem/2981 2981번: 검문 문제 트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 � www.acmicpc.net 이 문제 풀이의 핵심은 유클리드 호제법이다. 유클리드 호제법은 어떤 수 a와 b가 있을 때(a > b), a와 b의 최대공약수는 b와 a % b와 동일하다. 증명은, 다음 유튜브를 참고하길, https://www.youtube.com/watch?v=J5Yl2kHPAY4 1. 인접한 수들을 정렬한다. * 정렬의 이유는, gcd에 들어가는 매개변수가 음수가 되지 않기 위해서이다. 음수가 되지 않도록 조건을 단다면..