https://www.acmicpc.net/problem/14677
14677번: 병약한 윤호
프로그램의 입력은 표준 입력으로 받는다. 입력의 첫 줄에는 약을 먹어야 하는 날짜인 N이 주어진다. (1 ≤ N ≤ 500) 두 번째 줄에는 3N개의 약의 상태가 주어지는데, 아침 약은 B, 점심 약은 L, 저녁
www.acmicpc.net
저는 BFS를 이용해 문제를 해결하였습니다.
보통의 BFS는 현재 어디에 있는지를 저장하였지만, 저는 현재 맨 앞, 맨 뒤를 가리키는 값을 저장하였습니다.
해당 값이 현재 먹어야 할 약의 종류와 같은지를 확인하고 같다면 BFS를 진행하여 문제를 해결하였습니다.
package BOJ.bfs;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
public class BOJ_14677 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String command = br.readLine();
int size = 3*n;
int result = bfs(command,size);
System.out.println(result);
}
private static final char[] DRUG_TYPE = {'B','L','D'};
private static int bfs(String command, int size) {
Queue<int[]> q = new LinkedList<>();
q.offer(new int[]{0,size-1});
int time = -1;
Set<String> visited = new HashSet<>();
while(!q.isEmpty()){
time++;
int qSize = q.size();
int nowDrugType = DRUG_TYPE[time % 3];
for(int s = 0 ; s < qSize ; s++){
int[] now = q.poll();
// System.out.println(time+" "+Arrays.toString(now));
if(now[0] > now[1]){
continue;
}
if(command.charAt(now[0]) == nowDrugType){
int[] next = new int[]{now[0]+1,now[1]};
if(!visited.contains(Arrays.toString(next))){
visited.add(Arrays.toString(next));
q.offer(next);
}
}
if(command.charAt(now[1]) == nowDrugType){
int[] next = new int[]{now[0],now[1]-1};
if(!visited.contains(Arrays.toString(next))){
visited.add(Arrays.toString(next));
q.offer(next);
}
}
}
if(time >= size){
break;
}
}
return time;
}
}
'알고리즘' 카테고리의 다른 글
백준 10917번 Your life (JAVA) (0) | 2023.08.31 |
---|---|
백준 1662번 압축 (JAVA) (0) | 2023.08.30 |
백준 17413번 단어 뒤집기2 (JAVA) (0) | 2023.08.28 |
백준 15270번 친구 팰린드룸 (JAVA) (0) | 2023.08.27 |
백준 25516번 거리가 k이하인 트리 노드에서 사과 수확하기 (JAVA) (0) | 2023.08.26 |