본문 바로가기

시뮬레이션25

[백준] 23290번 - 마법사 상어와 복제 [Java] https://www.acmicpc.net/problem/23290 1.  아이디어 마법 연습의 각 작업을 메서드로 분리하고 조립해서 로직을 구현하는 방식으로 접근했다.2. 문제풀이 물고기는 위치와 방향을 담은 객체로 관리하며 Queue로 다뤘다.각 위치의 물고기 수를 저장하기 위한 카운팅 맵과 각 위치에서 냄새의 남은 시간을 저장하기 위한 카운팅 맵을 활용했다.작업 1은 작업 5에서 복제를 하기 위해 현재 물고기 정보를 따로 보관해야한다.작업 2는 물고기의 이동으로 델타배열을 통해 회전을 구현하고 상어 위치와 냄새 위치를 기록해서 구현하면 된다.작업 3은 상어의 이동으로 DFS 알고리즘을 통한 완전 탐색으로 진행했고 방문 체크 및 방문 해제로 물고기를 중복으로 제외하지 않게 주의하면서 탐색했고 가장 많.. 2025. 2. 24.
[백준] 21611번 - 마법사 상어와 블리자드 [Java] https://www.acmicpc.net/problem/21611 1.  아이디어 달팽이 배열을 활용한 다양한 연산을 하는 문제로 구슬을 파괴 후 재배치 -> 구슬의 폭발과 재배치 반복 -> 구슬의 변화 순서가 반복된다.각 단계를 수행하는 메서드를 작성해서 조합하는 방식으로 해결했고 달팽이 배열의 이동을 처리하기 위해 Queue와 Deque, 델타 배열을 활용했다.2. 문제풀이 달팽이 배열의 회전 방향에 맞춰 반시계 방향으로 델타 배열을 만들었고 입력의 d를 이 델타 배열에 맞추기 위한 배열도 선언했다. 이후 각 마법에 대해 destroy 메서드를 호출했는데 해당 메서드에서 마법의 한 사이클을 전부 수행했다. 먼저 구슬을 파괴한 후 재배치를 해야하는데 이때 달팽이 배열의 순회로 구슬을 Queue에 담고.. 2025. 2. 23.
[백준] 20058번 - 마법사 상어와 파이어스톰 [Java] https://www.acmicpc.net/problem/20058 1.  아이디어 2차원 배열의 회전, 얼음의 양 줄이기, 가장 큰 얼음 덩어리의 크기를 각각 구현해서 합치면 되는 문제로 2차원 배열의 회전읜 격자의 크기와 동일한 크기의 배열과 인덱스의 활용으로, 얼음 양 줄이기는 Queue를 활용해서, 가장 큰 얼음 덩어리의 크기는 BFS, DFS 알고리즘으로 구할 수 있다.2. 문제풀이 얼음판의 크기는 2^N으로 주어지는데 편의를 위해 N을 2^N으로 바꿔서 이용했다. 이를 위해 비트 연산자를 활용했다. 격자의 크기 역시 비트 연산으로 L을 2^L로 바뀌줬고 이후 회전 메서드에서 이용했다. 회전은 두 2차원 배열의 크기가 다른 점만 주의해서 구현하면 된다. 얼음의 양 줄이기는 사방탐색으로 줄여야 하.. 2025. 2. 23.
[백준] 17779번 - 게리맨더링 2 [Java] https://www.acmicpc.net/problem/17779 1.  아이디어 경계선을 표시하고 각 선거구의 영역에 대해 경계선에 닿기 전까지 탐색하는 방식을 활용했다.2. 문제풀이 먼저 기준점의 좌표와 d1, d2의 길이 모든 경우에 대해 탐색하는 브루트포스 알고리즘으로 접근했고 이를 위해 4중 for문으로 모든 케이스르 탐색했다. 기준점의 좌표와 d1, d2를 결정하면 해당 정보로 그림의 파란 경계선에 숫자 5를 넣은 방문 체크 배열을 만들었고 이를 활용해 탐색 경계를 구분했다. 탐색은 1번 영역은 정방향 순회, 2번 영역은 90도 돌린 정방향 순회, 4번 영역은 180도 돌린 정방향 순회, 3번 영역은 270도 돌린 정방향 순회로 탐색을 했고 탐색 과정에서 경계를 만나면 해당 안쪽 for문은 .. 2025. 2. 21.
[백준] 21610번 - 마법사 상어와 비바라기 [Java] https://www.acmicpc.net/problem/21610 1.  아이디어 1번 행, 열과 N번 행, 열이 연결된 것에 대한 처리만 잘 해주면 되는 구현 문제로 모듈러 연산으로 환형 연결 처리를 하고 구름은 Queue를 활용해서 처리하는 방식으로 해결했다.2. 문제풀이 구름의 이동 거리인 s가 최대 50이어서 환형 연결은 50 * N을 더하고 N으로 나눈 나머지를 사용하는 방식으로 구현했다.구름은 Queue를 활용했고 Queue의 크기만큼 연산하는 상황이 많아 len 변수로 처리해주는 것만 신경썼다.move 메서드는 이전에 저장한 구름 위치정보를 바탕으로 구름을 이동시킨 후 비를 1 내리고, 대각선 방향에 대한 탐색으로 물복사버그 진행 후 새롭게 다음 구름 위치를 탐색하는 순서로 구현했다.3. .. 2025. 2. 19.
[백준] 20057번 - 마법사 상어와 토네이도 [Java] https://www.acmicpc.net/problem/20057 1.  아이디어 달팽이 배열처럼 이동하는 것은 이동 길이가 1, 1, 2, 2, 3 이렇게 1부터 수가 두 번 등장하면 방향이 바뀌는 것을 이용했고, 모래의 이동은 5 x 5의 배열에 미리 이동시킨 후 대조하는 방식으로 해결했다.2. 문제풀이 모래가 흩날린 경우의 이동을 2차원 배열로 바꾼 후 원본 배열과 인덱스 비교를 통해 이동시키는 방식을 적용했다. 토네이토 소멸 후 격자 내의 모래의 합을 구해서 이를 최초 값과 비교하는 방식으로 격자 밖으로 나간 모래의 양을 구했다.3. 코드 import java.io.*;import java.util.*;public class Main { private static final int[] dr.. 2025. 2. 17.
[백준] 1966번 - 프린터 큐 [Java] https://www.acmicpc.net/problem/1966 1.  아이디어 문서 번호와 중요도를 저장한 클래스를 활용해서 해결했다.2. 문제풀이 주어진 문서로 객체를 만들어서 Queue에 넣은 후 무한 루프에서 Queue에 있는 문서의 중요도의 최댓값을 구한 후 Queue에서 문서 하나를 꺼내 이 문서의 중요도가 최댓값과 일치하면서 M번 문서면 종료하고 문서의 중요도가 최댓값보다 크거나 같으면 출력할 정답을 + 1 하고 다시 무한 루프를 반복하고 둘 다 아니면 다시 Queue에 삽입했다.3. 코드 import java.io.*;import java.util.*;public class Main { private static class Node { int order; i.. 2025. 2. 15.
[백준] 19237번 - 어른 상어 [Java] https://www.acmicpc.net/problem/19237 1.  아이디어 상어의 이동에서 다음 방향에 대한 우선순위가 현재 방향에 따라 달라진다. 이를 처리하기 위해 2차원 배열로 방향 관리를 했으며 우선순위 큐를 활용해 번호가 작은 상어가 우선권을 갖도록 구현했다.2. 문제풀이 상어를 클래스로 만들어서 번호, 위치, 방향과 다음 방향에 대한 정보를 필드로 만들었다. 다음 방향은 현재 방향에 따라 우선순위가 달라져서 이를 2차원 배열로 나타내서 2차원 배열의 행 인덱스와 현재 방향을 맞춰서 현재 방향에 따른 다음 방향 우선순위를 처리했다.상어 클래스는 번호에 대한 내림차순을 기본 정렬 기준으로 설정했는데 상어를 담을 우선순위 큐 2차원 배열에서 한 칸에 여러 마리의 상어가 있을 경우 한 마리만.. 2025. 2. 14.
[백준] 3190번 - 뱀 [Java] https://www.acmicpc.net/problem/3190 1.  아이디어 뱀을 Deque 자료구조를 활용해서 머리와 꼬리를 이동시키는 방식으로 해결했다.2. 문제풀이 뱀의 이동은 머리와 꼬리 정보만 필요하므로 이를 Deque 자료구조로 관리했고 다음 칸이 뱀의 몸통인지 체크해야해서 정사각보드에 뱀이 위치한 칸들은 따로 체크를 했다. 시계방향 또는 반시계방향으로 방향 배열의 인덱스를 설정한 후 모듈러 연산을 활용하면 뱀의 머리의 회전도 간단하게 구현할 수 있다.3. 코드 import java.io.*;import java.util.*;public class Main { private static final int EMPTY = 0; private static final int APPLE.. 2025. 2. 13.
[백준] 20056번 - 마법사 상어와 파이어볼 [Java] https://www.acmicpc.net/problem/20056 1.  아이디어 그냥 빡구현 문제로 이동시킬 예정인 파이어볼을 담은 Queue와 이동시킨 파이어볼을 담은 2차원 배열 두개를 활용해서 시뮬레이션을 돌렸다.2. 문제풀이 파이어볼의 속성을 담는 클래스(FireBall)를 만들고 입력을 Queue에 넣었다. 이동시킨 파이어볼을 배치할 Queue[][] 2차원 배열도 초기화시켰다.k번 동안 move 메서드를 실행하며 move 메서드는 Queue의 파이어볼을 하나씩 이동시켜 2차원 배열에 담고 2차원 배열에서 파이어볼의 정보 갱신 후 다시 Queue에 담는 과정을 반복했다.파이어볼은 격자를 벗어나면 연결된 행과 열로 오는데 이때 방향과 속도의 곱 때문에 위치가 격자에서 크게 벗어날 수 있어서 N.. 2025. 2. 13.
[백준] 1592번 - 영식이와 친구들 [Java] https://www.acmicpc.net/problem/1592 1.  아이디어 모듈러 연산으로 원형에 대한 인덱스 처리를 하면 간단하게 해결할 수 있다.2. 문제풀이 배열을 원형 배열처럼 인덱스를 처리하려면 배열의 범위를 벗어나는 인덱스에서 배열의 크기만큼 보정을 해주면 된다. 이를 위해 시계 방향으로 던질 때는 N으로 나누어서 N보다 커지면 다시 0부터 시작하게 했고 반시계 방향으로 던질 때는 음수가 될 수 있으므로 N을 더하고 나누는 방식을 활용했다.3. 코드 import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { Buffered.. 2025. 2. 13.
[백준] 1244번 - 스위치 켜고 끄기 [Java] https://www.acmicpc.net/problem/1244 1.  아이디어 구현 문제로 남학생은 for문, 여학생은 while문을 활용해서 스위치의 상태 변경을 처리했다.2. 문제풀이 스위치는 boolean 타입 배열로 처리했다.남학생은 받은 번호와 그 배수를 전부 바꾸므로 for문에서 인덱스를 번호만큼 더하도록 갱신해서 배수 번호 처리를 했다.여학생은 좌우로 같은 칸에 대해 탐색하므로 k를 while문 외부에서 인덱스로 설정해서 범위 안이면서 같으면 변경을 해줬다. 이때 받은 번호도 변경을 해줘야하는데 k=0으로 변경을 시도하면 받은 번호는 두 번 스위치가 바뀌어서 원상태가 됨에 주의해야 한다.3. 코드 import java.io.*;import java.util.*;public class Ma.. 2025. 2. 13.