Java

문제 접근 방식처음에는 이름이랑 그림만 보고 트리 문제인가 했는데 읽고서 그림을 그려보다 보니 DP 문제에 가까워 보였다. 근데 막상 DP를 사용해서 풀지도 않았고 이게 왜 티어를 골드 4까지나 준건지 모르겠는 문제인데, 규칙만 찾으면 코드 몇 줄로도 간단하게 풀 수 있다. 아래에서부터 왼중오 3개의 노드를 하나의 차로 방문하는 것이 가장 적은 차를 사용하는 경우이고, 주어진 입력내 트리의 노드 수가 long의 범위를 벗어나지 않기 때문에 DP를 사용하지 않고도 단순 연산으로도 풀 수 있다. 풀이public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReade..
문제  접근 방식인접 리스트를 만든 후에 일반적인 그래프 탐색으로 여행 경로를 모두 이동해보면시간 초과가 발생하기 때문에 여행 경로가 모두 한 사이클에 포함 되는지만 파악하면 된다. 이럴 때 효율적인 알고리즘이 유니온 파인드인데유니온 함수를 이용해 연결된 정점들끼리의 부모를 기록해두고파인드 함수를 이용해 서로의 최고 조상이 누구인지 확인하여같은 사이클에 존재하는지 여부를 빠르게 판단할 수 있다. 초기에는 각 도시마다 자기 자신을 부모로 초기화하고주어진 도시 간의 경로를 유니온 함수로 연결한 후에여행 경로대로 파인드 함수를 사용해 모두 하나의 사이클에 포함되는지 확인한다. 풀이public class Main { static int[] parent; public static void main(String[]..
문제  접근 방식그래프 문제도 아니고 그냥 일반적인 반복문 문제라입력 받고 8방향 중 한 방향으로 4개의 알파벳들이 각각 O B I S인지 모두 확인해주면 된다. 문자 배열을 미리 만들어두고 비교를 했는데 목표 단어에 중복된 문자가 존재하지 않아서애초에 M을 1, O를 2, ..., S를 5로 두고 증가하는 순으로 비교하면 더 깔끔할거 같다. 풀이public class Main { static int n, cnt = 0; static char[] chars = new char[]{'O', 'B', 'I', 'S'}; static char[][] map; static int[] dx = {-1, -1, -1, 0, 0, 1, 1, 1}; static int[] dy = {-1, 0, 1, -1, 1, -1..
문제 접근 방식문제가 너무 대놓고 그래프로 네 방향을 탐색하라고 나와 있는데 이거에 낚이면 시간초과에 걸린다. 장애물이 없는 지도가 주어져서 현재 지점의 좌표와 이동하고자 하는 지점의 좌표의 차를 구하면몇 칸을 이동해야하는지 알 수 있기 때문에 직접 한 칸씩 움직일 필요가 없다. 그래서 집의 좌표와 민초우유의 좌표만 구해두고 집의 위치에서부터 시작해서현재 좌표와 민초우유의 좌표의 차를 구하고 현재 체력보다 작거나 같다면 이동해주면 된다. 풀이public class Main { static int n, m, h, max = 0, milk = 0; static Pair home; static ArrayList milks = new ArrayList(); static boolean[] isVisited; pu..
문제 16928번: 뱀과 사다리 게임 첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으 www.acmicpc.net 접근 방식 여러 풀이가 존재하는 문제 같지만 BFS를 사용해서 풀어봤다. 우선 문제에서는 10*10 맵이라고 했지만 그냥 100칸짜리 1차원 배열을 사용하는 것이 문제의 입력 양식을 처리하기가 편해서 맵과 방문 배열을 모두 1차원 배열을 사용했다. 평범한 BFS 문제와 방식은 비슷하지만 주사위의 눈만큼 이동하기 위해 방향 배열을 사용하는 것이 아닌 1 ~ 6까지 반복문을 돌아주었다. 사다리나 뱀은 무조건 타야 하..
문제 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net 접근 방식 바이토닉 수열인 오름차순, 내림차순, 오름차순 + 내림차순 수열 중 가장 긴 것을 찾아야 한다. 이전에 풀었던 문제 중 가장 긴 증가하는 부분 수열을 응용하면 풀 수 있는 문제인데 vvvvv 1521434521 만약에 위와 같은 수열이 있다면 1, 2, 3, 4, 5가 가장 긴 증가하는 부분 수열일 것이고 vvvvv 1521434521 가장 긴 감소하는 부분 수열은 위와 같을 것이다. 가장 긴 증가하는 부분 수열과 감소하는 부분 수열의 길이를 표로 정리하면 다음과 같..
문제 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로 동일할 때, 시작점 X에서 거리가 K인 정점을 출력해야 한다. 즉 탐색은 X에서 K번 까지의 이동만 진행해주면 되고, K번째 방문한 정점들을 모두 저장해주면 되는데 문제에서 요구하는 출력값이 정점의 번호를 오름차순으로 출력하는 것이기 때문에 트리셋이나 우선순위큐, 정렬 등을 사용해서 출력해주면 된다. 풀이 public class Main { pub..
문제 1202번: 보석 도둑 첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci www.acmicpc.net 접근 방식 mv 165 298 295 599 596 590 보석의 무게와 가치를 위와 같이 무게가 가벼운 순으로, 같다면 가치가 높은 순으로 정렬한 후에 오름차순으로 정렬된 가방을 하나씩 보면서 현재 가방의 무게 이하인 보석을 모두 우선순위 큐에 넣고 가장 큰 값을 하나만 꺼내서 누적합에 더해주면 된다. 2 2 10 10 가방의 무게가 다음과 같을 때 [2]98 95 65 [2]95 65 [10]..
da9dac
'Java' 카테고리의 글 목록