반응형

알고리즘(Algorithm)/백준(Baekjoon) 94

[백준 Baekjoon] 17406번 배열 돌리기 4 - JAVA

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static int N, M, K, answer = Integer.MAX_VALUE; public static int[][] arr, calc; public static int[] order; // 연산 순서 public static boolean[] visit; public static int[] dx = {1, 0, -1, 0}; // 하, 우, 상, 좌 public static int[] dy = {0, 1, 0, -1}; pu..

[백준 Baekjoon] 17143번 낚시왕 - JAVA

[백준 Baekjoon] 17143번 낚시왕 - JAVA 문제 풀이 Shark[][] grid : 상어가 격자에 두 마리 존재하는지와 땅에서 가장 가까운 상어를 찾는 데 사용합니다. List list : 격자에 존재하는 상어를 관리하는 데 사용합니다. 낚시왕이 오른쪽으로 한 칸 이동하며 상어를 잡는 행동과, 상어 이동을 호출합니다. // 낚시왕이 오른쪽으로 한 칸 이동 for (int i = 0; i < C; i++) { fishing(i); move(); } 낚시왕이 있는 열에 있는 상어 중에서 땅과 제일 가까운 상어를 잡습니다. 잡은 상어는 격자와 리스트에서 모두 제거해줍니다. for (int r = 0; r < R; r++) { // 까가장 가까운 상어를 잡는다. if (grid[r][c] != n..

[백준 Baekjoon] 20056번 마법사 상어와 파이어볼 - JAVA

[백준 Baekjoon] 20056번 마법사 상어와 파이어볼 - JAVA 문제 풀이 List list : 파이어볼을 저장할 리스트입니다. Queue[][] grid : 이동이 끝난 파이어볼이 저장될 큐 2차원 배열입니다. M번 파이어볼의 정보를 입력받아 리스트에 추가합니다. 파이어볼은 위치 (r, c), 질량 m, 방향 d, 속력 s 순서이지만, 입력은 위치 (r, c), 질량 m, 속력 s, 방향 d 로 속력과 방향이 반대입니다. 1. 모든 파이어볼이 자신의 방향 di로 속력 si칸 만큼 이동한다. 리스트에 존재하는 모든 파이어볼의 x, y값을 변경해줍니다. // 모든 파이어볼이 자신의 방향 di로 속력 si칸 만큼 이동한다. f.r = (N + f.r + dx[f.d] * (f.s % N)) % N;..

[백준 Baekjoon] 21610번 마법사 상어와 비바라기 - JAVA

[백준 Baekjoon] 21610번 마법사 상어와 비바라기 - JAVA 문제 풀이 문제에서 주어진 격자는 (1, 1)부터 (N, N)의 크기이지만, 저는 (0, 0)부터 (N-1, N-1)의 크기로 만들어 사용하였습니다. 방향 이동 또한 1부터가 아닌 0부터 순서대로 하였습니다. 구름은 이동하고 비가 내린 다음 이동하기 때문에 큐를 사용하였습니다. 처음 구름은 (N-1, 0), (N-2, 1), (N-2, 0), (N-2, 1) 4칸에 존재하여 4칸을 큐에 추가합니다. 1. 구름이 di 방향으로 si칸 이동한다. 큐에 존재하는 모든 구름에 대하여 x, y값을 변경해줍니다. // 구름이 di 방향으로 si칸 이동 cloud.x = (N + cloud.x + dx[d] * (s % N)) % N; clou..

[백준 Baekjoon] 17142번 연구소 3 - JAVA

[백준 Baekjoon] 17142번 연구소 3 - JAVA 문제 풀이 시간 제한이 0.25초라는 말에 조금 겁을 먹었던 문제이었습니다. 문제를 읽어보면서 저 짧은 시간안에 어떻게 풀어야할지 고민을 많이 했었는데, M개의 바이러스를 선택해 그래프 탐색으로 검사하는 방법밖에 생각나지 않았고, 맞는 방법이라 생각했습니다. 우선 입력을 받으면서 빈 칸의 수(emptySpace), 바이러스의 위치(list)를 저장해야 합니다. 혹시나 제출하시고 92%에서 틀린다면 빈 칸의 수가 0인 경우를 검사하지 않았기 때문일 것입니다. 제가 작성한 방법에서도 빈 칸이 있다고 가정하고 확산을 하여 무조건 1이상이 나옵니다. 전체 바이러스에서 M개의 바이러스를 선택해서 확산을 시키고 검사해야 합니다. 조합을 사용하여 M개의 바..

[백준 Baekjoon] 1422번 숫자의 신 - JAVA

문제 풀이 유의사항 1. 각 수는 1,000,000,000의 크기로 문자열을 사용하여 이어 붙여야 한다. (자바의 문자열은 compareTo() 함수를 사용하여 비교가 가능하다.) 2. 숫자가 중복될 수 있으므로 가장 큰 수를 찾아 반복할때 유의해야한다. 정렬만 잘하면 쉽게 해결할 수 있는 문제이다. 두 수를 붙였을때 어떤 숫자가 더 큰지를 기준으로 정렬을 해야한다. Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2)); 위의 정렬식을 보면 o2 + o1과 o1 + o2를 비교하여 정렬을 수행한다. 이어 붙였을때 가장 큰 수를 찾고, 반복해야할 수를 찾아 순서대로 합치는것으로 정답을 찾을 수 있다. 문제의 예제 3을 예시로 들면 o1을 1, o2를 10..

[백준 Baekjoon] 1826번 연료 채우기 - JAVA

문제 풀이 우선순위 큐를 활용하여 풀 수 있는 문제이다. 주유소 정보를 거리(a) 오름차순으로 저장하는 우선순위 큐를 사용하여 입력받는다. 예제의 주유소는 거리순으로 주어지지만, 항상 거리순으로 주어지지 않는다. 현재까지 갈 수 있는 거리의 주유소 중에서 가장 연료의 양이 많은 주유소를 방문해야 한다. 주유소 정보 stations에서 현재까지 갈 수 있는 거리(P) 내의 주유소 연료 양을 fuels에 추가한다. fuels는 연료 양을 내림차순으로 저장하는 우선순위 큐이다. fuels에서 하나를 방문(poll)하고 현재 갈 수 있는 거리(P)를 증가시킨다. 주유소를 방문하였으므로 answer도 1증가 시킨다. 현재 갈 수 있는 거리 P가 L을 넘으면 목적지까지 갈 수 있으므로 종료된다. 만약 fuels가 ..

[백준 Baekjoon] 2641번 다각형그리기 - JAVA

문제 풀이 입력받은 표본 모양수열과 같은 모양수열을 찾는 문제이다. 같은 모양수열은 화살표의 출발 지점이 다른 경우와, 화살표 방향이 반대인 경우에 존재할 수 있다. 우선 화살표 방향이 반대인 경우를 만들어야 한다. 그 다음 정방향과 역방향 둘 모두에 대해 출발 지점이 다른 경우를 고려해야 한다. 정방향은 forward, 역방향은 reverse라 한다. 입력을 받을 때에 역방향은 1 -> 3, 2 -> 4, 3 -> 1, 4 -> 2로 방향을 변경해주며, 출발을 반대(insert idx 0)로 해줘야 한다. 출발지점이 다른경우는 swap 방식을 통해 0번 인덱스를 맨 뒤로 옮기는 방식으로 하였다. 같은 다각형 검사를 위해 정방향, 역방향에서의 모든 경우를 set에 추가한다. 모양수열을 입력받아 set에 ..

[백준 Baekjoon] 2659번 십자카드 문제 - JAVA

문제 풀이 십자모양의 카드의 네 모서리 숫자의 시계수가 모든 시계수 중에서 몇 번째로 작은 시계수인지 출력하는 문제이다. 시계수란 카드의 모서리 숫자를 시계 방향으로 읽어 만들어지는 네 자리 수들 중에서 가장 작은 수이다. getMin() 함수가 시계수를 구하는 함수이다. 각 모서리에서 읽어 만드는 수 중에서 가장 작은 수를 리턴한다. 다음으로 모든 시계수 숫자를 찾는다. 0이 나타날 수 없으므로 1111 ~ 9999를 한번에 탐색하는 것이 아닌 각 자리수를 1 ~ 9까지 순회하며 시계수를 찾는다. 찾은 모든 시계수 중에 입력으로 주어진 숫자의 시계수 보다 작은 수를 카운트하여 출력한다. 소스 코드 import java.io.BufferedReader; import java.io.IOException; ..

반응형