baekjoon/Implementation 17

백준 23290번 : 마법사 상어와 복제 [자바]

🧫 문제 분석 ✔️ 출처마법사 상어와 복제 골드 1 📖 문제 어려웠던 문제 처음에 상어들을 List[][] 로 하나하나 관리했는데 시간초과가 났다 따라서 방향별로 물고기수를 담아3중 배열로 처리했다. r행, c열, d방향, 해당 인덱스의 값은 물고기의 개수 핵심상어 이동시 중복이동이 가능하다. 즉, 지나갔던 곳을 다시 지나갈 수 있는데이때 이동한 칸의 물고기 제외를 중복 연산할 수 있으므로 따로 방문 처리를 한다. 그리고 항상 동시 이동 같은 문제는따로 배열을 만들어서 변동값을 저장하고원본 배열을 갱신하자.. 이것때문에 자꾸 틀렸다. 🔅 문제 풀이import java.io.*;import java.util.*;public class Main { static int[] dr = {0, ..

백준 23289번 : 온풍기 안녕! [자바]

🧫 문제 분석 ✔️ 출처온풍기 안녕! 플래티넘 5 📖 문제 벽 체크하는게 너무 어려웠다. 그냥 하드코딩해서 벽체크하면 되는데 자꾸 다른 방법이 있을 거같아서 그것만 파다가 시간 다보냈다. 벽 체크의 경우 boolean[][] 이중 배열로 up 일때 벽,right을 때 벽 두가지를 체크하는 방식으로 풀어나간다. 3차원 배열도 생각해봤는데 너무 복잡할거 같아서 버렸다. 좀 헷갈린게 여기인데 대각선 이동 시 벽체크에서상대적 위치에서 양 옆으로 이동했다가 앞으로 전진하는 식으로 생각해야한다. 온도조절의 경우동시 발생이기에 따로 임시배열 생성해서 처리해야한다. 상하좌우 처리후 현재 위치를 방문처리해서 중복 연산되지 않게 막는다. 초콜릿이 100개를 넘어버리면 바로 중지한다.이것때문에 시간초과도 났다...

백준 23288번 : 주사위 굴리기 2 [자바]

🧫 문제 분석 ✔️ 출처주사위 굴리기 2 골드 3 📖 문제 주사위 문제에 좀 약했는데 잘 풀었다.좀 헷갈릴 수 있는데 '칸 (x, y)에 대한 점수' 는 문제 설명에 있는 공식을 사용해야하고'칸 (x,y)에 있는 정수' 는 지도에 있는 (x,y) 위치의 정수를 의미한다. 이동방향을 회전할때도 주사위를 회전해야 하나 싶어서 구현했는데할 필요없었다. 그냥 그 방향으로 굴리는 로직만 짜면 된다. 🔅 문제 풀이import java.io.*;import java.util.*;public class Main { // 동 남 서 북 static int[] dr = {0, 1, 0, -1}; static int[] dc = {1, 0, -1, 0}; static int[] dice = {2..

백준 21611번 : 마법사 상어와 블리자드 [자바]

🧫 문제 분석 ✔️ 출처마법사 상어와 블리자드 골드 1 📖 문제 요구사항이 많아서 시간이 오래걸리지 구현자체는 어렵지 않았다. 구현해야할 것은 총 4가지로1. 얼음 파편 던지기 (직선 거리 삭제)2. 구슬 폭팔3. 구슬 변화4. 각 삭제에 대하여 빈칸이 없도록 당기기 사실상 4번이 핵심이였던 것 같다. 정해진 규칙대로 꺾이는 2차원 배열에서 어떻게 빈칸을 채울 것인가방향성과 연속된 빈칸의 크기, 또한 꺾인 곳이 연속되어 있다면 , 예를 들면 N = 5일 때 3, 4, 5 가 빈칸일시 채우려면 생각보다복잡하다. 이때 생각해낸게 1차원 배열로 구슬들을 처리해보자 였다.1차원 배열로 하면 빈칸 당기기도 쉽고 방향성을 고려하지 않아도 된다. 3번까지 다 처리후 1차원 배열에서 처리된 구슬들을 2차원 배열에 ..

백준 21610번 : 마법사 상어와 비바라기 [자바]

🧫 문제 분석 ✔️ 출처마법사 상어와 비바라기 골드 5 📖 문제구현이 확실히 재밌는 것 같다. 이동 문제에서 거리가 주어지면 방향이 -방향일때 거리가 N을 넘어가는 경우이를 나머지연산 처리해주지않으면 - 인덱스가 된다. 그외에는 구름을 삭제한 칸 체크만 해주면아주쉽게 풀 수 있는 문제다. 🔅 문제 풀이import java.beans.Customizer;import java.io.*;import java.util.*;public class Main { static int N, M; static int[][] map; static int[] dr = {0, -1, -1, -1, 0, 1, 1, 1}; static int[] dc = {-1, -1, 0, 1, 1, 1, 0, -..

백준 21609번 : 상어 중학교 [자바]

🧫 문제 분석 ✔️ 출처상어 중학교 골드 2 📖 문제 알고리즘은 잘짰는데 1번 조건을 만족하는 그룹 위치 갱신할때 최대 무지개 블록수를 한 조건문에서 안해서 계속 틀렸다. 중력은 좀 복잡하게 짰다. 아래 행부터 위로 올라가서 빈 공간을 체크하고 일반 블록을 끌어 당기는 방식이다.배열 회전은 이전 문제에서 배운대로 회전 공식을 사용하여 간단하게 구현하였다. 🔅 문제 풀이import java.beans.Customizer;import java.io.*;import java.util.*;public class Main { static int N, M; static int[][] map; static int[] dr = {0, 1, 0, -1}; static int[] dc = {-..

백준 21608번 : 상어 초등학교 [자바]

🧫 문제 분석✔️ 출처상어 초등학교 골드 5 📖 문제빈 N*N에 순서대로 학생들을 하나씩 배치한다 3번 조건을 쉽게 해결하기 위해(0,0) 부터 (N,N)까지 -> 방향으로 탐색을 시작하여 따로 조건 처리하지 않게 한다. 인접하다는 결국 상하좌우를 뜻하며빈 공간과 현재 인접한 좋아하는 학생 수를 비교해나가면서 탐색하면 된다. 인접한 좋아하는 학생을 1명도 발견 못했다면 빈칸이 제일 많은 곳을 선점한다. 인접한 좋아하는 학생수가 1명 이상이면서 탐색중 보다 더 많다면 그 자리를 선점한다. 만약 같다면 빈칸이 더 많은 곳을 선점한다. 문제 및 해결탐색하면서 기록하는 curEmpty와 curLike를 0으로 초기화해서 잘못된 자리배치가 되었다.-1로 초기화해주어 해결하였다. 🔅 문제 풀이impor..

백준 20058번 : 마법사 상어와 파이어스톰 [자바]

🧫 문제 분석 ✔️ 출처마법사 상어와 파이어스톰 골드 3 📖 문제 모든 칸을 격자로 나누고 90도 회전 후 인접한 얼음이 있는 칸이 3개 미만이면 얼음의 양이 - 1로 줄어든다 (이는 동시다발로 일어난다.) 격자 나누는걸 좀 복잡하게 구현했더니 좀 느리긴한데(700ms) 회전하는 로직만 바꾸면 충분히 빠르게 될거라고 생각된다. 찾아보니 2차원 배열 회전 공식이 있어 공부했다.참조: https://taaewoo.tistory.com/10🔅 문제 풀이import java.beans.Customizer;import java.io.*;import java.util.*;public class Main { static int N, Q, size; static int[][] map; stat..

백준 20056번 : 마법사 상어와 파이어볼 [자바]

🧫 문제 분석 ✔️ 출처마법사 상어와 파이어볼 골드 4 📖 문제 뭔가 생각보다 어려웠다. 항상 짜잘한거에서 틀려서 그렇지 전체적인 로직은 잘 짰다. 어려웠던것중첩 파이어볼을 어떻게 저장해놓을까 -> List[][] 로 처리하면 시간복잡도는 괜찮은가, K만큼 재생성해야함 -> O(K)중첩 파이어볼은 어떻게 처리할까-> 위에 저장한 파이어볼 식별값을 사용해 한번에 더한 다음 연산후 처리 소멸조건에서if (sumM/5 == 0)을 비교해야하는데 sumM을 비교해서 틀렸다. 이것만 빼면 다른 로직은 다 정상작동했다. 🔅 문제 풀이import java.beans.Customizer;import java.io.*;import java.util.*;public class Main { static int ..

백준 20061번 : 모노미노도미노 2 [자바]

🧫 문제 분석 ✔️ 출처모노미노도미노 2 골드 2 📖 문제 게임 개발하는 거 같아 좀 재밌었다. 빨간 칸에 입력으로 주어지는 좌표와 도형 형태를오른쪽, 아래로 2개의 도형이 내려가는 형태의 테트리스 같은 게임이다. boolean 2차원 타입으로 현재 테트리스 상태를 저장한 라인이 전부 도형 즉, 가득 찬 상태는& 연산자를 통해서 확인 연한 색의 부분은 라인 개수를 세고 그 개수만큼 띄어서 옮기기 🔅 문제 풀이import java.io.*;import java.util.*;import java.util.stream.IntStream;public class Main { // 20061번 모노미노도미노 2 // 블록은 한번 보드 위에 놓이면 다른 블록과 합쳐지지 않음 // 1. 점수를..