반응형

백준 57

[백준 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; ..

[백준 Baekjoon] 7576번 토마토- JAVA

[백준 Baekjoon] 7576번 토마토- JAVA 문제 풀이 상자에 들어 있는 토마토가 모두 익을 때까지 최소 날짜를 출력하는 문제이다. 최소 날짜와 왼쪽, 오른쪽, 앞, 뒤 네 방향을 보고 bfs탐색으로 푸는 문제란 걸 알았다. 입력으로 주어진 토마토는 1 익은 토마토, 0 익지 않은 토마토, -1 토마토가 들어있지 않은 칸 이렇게 세 가지 종류이다. bfs탐색으로 탐색해야 하는 칸(cnt)은 M * N (상자의 크기) - 익은 토마토 - 토마토가 들어있지 않은 칸이다. 익은 토마토에서 주변 토마토가 익기 때문에 큐에 모든 익은 토마토를 저장하고 bfs탐색을 한다. bfs 탐색으로 새로 탐색하는 칸은 방문하지 않았으며 토마토가 들어있지 않은 칸으로 새로 토마토가 익는 경우이다. 이 경우 cnt를 감..

반응형