본문 바로가기

Algorithm221

[백준] 23747: 와드 - JAVA https://www.acmicpc.net/problem/23747 풀이이 문제는 보드 위에서 이동과 와드 설치를 처리하는 문제로, 주어진 명령에 따라 보드의 상태를 변화시켜야 한다. W 명령을 수행하여 해당 위치와 인접한 같은 타입의 영역을 방문 처리하고, 상하좌우 이동을 통해 요리사의 위치를 업데이트했다. 최종적으로 방문한 위치를 '.'으로 표시하고, 방문하지 않은 위치를 '#'으로 표시하여 결과를 출력했다.  메모리: 127596KB시간: 720ms언어: Java 11import java.io.*;import java.util.*;public class Main { static int r, c; static char[][] board; static boolean[][] result;.. 2024. 6. 10.
[백준] 1263: 시간 관리 - JAVA https://www.acmicpc.net/problem/1263 풀이해야 할 일들 n개가 일을 처리하는데 걸리는 시간(s), 마감시간(t)이 주어진다. 이차원배열에 s와 t를 넣고 정렬하는데, 이때 정렬기준은 마감시간을 내림차순으로 정렬했다. 마감시간이 마지막인 것 부터 걸리는 시간을 빼주면 일을 언제 시작해야 하는지 구할 수 있다. 일을 시작해야할 시간을 갱신하면서 이 시간이 바라보고있는 일의 마감시간보다 작다면 하던대로 빼주고, 크다면 시작해야 할 시간을 현재 마감시간에서 걸리는 시간을 빼준 값으로 갱신한다.  메모리: 14576KB시간: 148ms언어: Java 11import java.io.*;import java.util.*;public class Main { public static v.. 2024. 5. 31.
[백준] 17953: 디저트 - JAVA https://www.acmicpc.net/problem/17953 풀이M종류의 디저트를 N일동안 하루에 하나씩 먹어야 한다. 전날 먹었던 것과 같은 것을 먹으면 만족감이 반으로 주는데, N일동안 최대의 만족감을 구해야 한다. 2차원 dp 배열을 만들었다. 각 날짜에 각 디저트마다 전날의 dp배열의 값들을 토대로 갱신해줬다. 전날과 같은 맛이라면 2로 나눠 더해줬다.  메모리: 92884KB시간: 552ms언어: Java 11import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new Buffered.. 2024. 5. 30.
[백준] 16472: 고냥이 - JAVA https://www.acmicpc.net/problem/16472 풀이문자열을 최대 N개 종류의 알파벳을 가진 문자열로 잘라야한다. abbcaccba 라는 문자열을 최대 2개 종류의 알파벳을 가진 문자열로 자르면 cacc 일때 길이가 4로 최대가 된다. 알파벳의 개수를 int 배열을 통해 저장하고, 새로운 알파벳이 나올 때마다 cnt를 늘려가면서 탐색한다. 이때 탐색은 투포인터 알고리즘으로 한다. cnt가 n보다 크면 left를 1늘려서 문자열의 길이를 줄이고, cnt가 n보다 작거나 같다면 right를 1늘려서 문자열의 길이를 늘린다.  메모리: 15492KB시간: 160ms언어: Java 11import java.io.*;public class Main { public static void m.. 2024. 5. 29.
[백준] 16194: 카드 구매하기 2 - JAVA https://www.acmicpc.net/problem/16194 풀이카드팩들의 가격이 주어진다. 카드 i개가 포함된 카드팩의 가격은 Pi원이다. dp 배열을 최대값으로 초기화 해주고, 탐색을 진행했다.dp[0] + card[n]dp[1] + card[n - 1]...dp[n] + card[0] `dp[n]` 은 위 경우 중 최소가 되는 값이다.   메모리: 14528KB시간: 144ms언어: Java 11import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new.. 2024. 5. 23.
[백준] 1577: 도로의 개수 - JAVA https://www.acmicpc.net/problem/1577 풀이n x m 사이즈의 도시에서 (0, 0) 부터 (n, m)까지 가는 경우의 수를 구해야 한다. 다만, 공사중인 도로가 있어서 지나갈 수 없는 곳이 있다. `0 0 0 1` 과 같이 주어지는데 이는 (0, 0)에서 (0, 1)로 가는 도로를 이용할 수 없다는 것을 말한다. 3차원배열을 만들어서 가로 도로, 세로 도로의 공사 여부를 저장했다. 그 후, (0, 0)으로 부터 가로로만 갔을 때, 세로로만 갔을 때를 1로 채워주고 bottom-up방식으로 dp배열을 채워주었다.  메모리: 14312KB시간: 128ms언어: Java 11import java.io.*;import java.util.*;public class Main { pu.. 2024. 5. 23.
[백준] 15591: MooTube (Silver) - JAVA https://www.acmicpc.net/problem/15591 풀이N번까지 번호를 가진 동영상들이 서로 연결되어있다. 연결마다 유사도가 k의 값으로 정해져 있다. 경로를 연결하여 유사도들 중 최소값이 두 동영상의 유사도가 된다. 특정 값을 정해 유사도가 그 값 이상인 동영상들의 개수를 묻는 문제이다. 시작 정점으로 할 동영상의 번호와, 특정 값이 주어지면 bfs탐색을 진행했다. 연결된 노드들을 탐색하여 유사도가 특정 값 K 이상일 때 카운트를 1증가시키며 큐에 넣어 계속했다.  메모리: 80360KB시간: 1008ms언어: Java 11import java.io.*;import java.util.*;public class Main { static class Node { int v;.. 2024. 5. 20.
[백준] 15971: 두 로봇 - JAVA https://www.acmicpc.net/problem/15971 풀이두 로봇이 서로 통신하기 위해서는 서로 인접한 지역에 있어야 한다. a구역에 있는 로봇과 b구역의 로봇에 서로 통신할 수 있는 지역으로 이동할 때 이동해야하는 거리의 최솟값을 구해야 한다. 생각한 풀이방법은 먼저 a지역에서 b지역까지 이동하고, 그 중 거리가 가장 큰 구간을 빼주는 것이다. dfs를 통해 int배열에 이동한 구역의 거리를 기록했고, 이 배열을 방문처리용도로 사용했다.  메모리: 80360KB시간: 1008ms언어: Java 11import java.io.*;import java.util.*;public class Main { static class Node { int v; int cost.. 2024. 5. 19.
[백준] 2230: 수 고르기 - JAVA https://www.acmicpc.net/problem/2230 풀이n개의 정수가 주어지고, 두 수를 골랐을 때 차이가 m 이상인 경우 중 제일 작은 경우를 골라야 한다. 정렬을 해놓고 슬라이딩윈도우를 통해 두 수를 골라 차이를 비교했다. start, end 이렇게 두 포인터를 두고 두 수의 차이가 m보다 작은 경우 end를 1 늘린다. 두 수의 차이가 큰 경우 정답을 갱신하고 start를 1늘린다.  메모리: 28584KB시간: 396ms언어: Java 11import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedRead.. 2024. 5. 19.
[백준] 25682: 체스판 다시 칠하기 2 - JAVA https://www.acmicpc.net/problem/25682 풀이M x N 사이즈의 보드가 주어지고, K x K 의 크기로 잘라 이 구역을 체스판 모양으로 만들어야한다. 뭔가 이 말을 이해하는데 오래걸렸다... 체스판은 흰색 검은색이 번갈아 나온다. 체스판의 첫 칸을 (0, 0)이라고 한다면, 첫칸이 흰색이면 격자의 행 + 격자의 열 번호를 더했을 때 짝수이면 흰색, 홀수이면 검은색이다. 첫칸이 검은색이면 마찬가지 방식으로 반대로 된다. BW로 이루어진 보드를 입력받으면서 위의 규칙에 맞게 첫칸이 흰색인 배열, 첫칸이 검은색인 배열에 각각 넣었다. 이 배열에서 1이 의미하는 것은 격자의 색깔이 맞지 않아 새로 칠해야 한다는 의미이다. 잘 맞게 칠해져있는 것은 0으로 한다. 검은색, 흰색 각각 2차.. 2024. 5. 19.