문제(출처: https://www.acmicpc.net/problem/12026)
< BOJ 거리 >
문제 풀이
이중 for문을 사용하여 보도블록을 전체 탐색한다. B -> O -> J 순서로 확인하면서 최솟값을 찾는다.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class _12026_ { // BOJ 거리
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
char arr[] = new char[n];
String str = bf.readLine();
for (int i = 0; i < str.length(); i++) {
arr[i] = str.charAt(i);
}
int result[] = new int[n];
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (result[i] != 0 || i == 0) {
if ((arr[i] == 'B' && arr[j] == 'O') || (arr[i] == 'O' && arr[j] == 'J')
|| (arr[i] == 'J' && arr[j] == 'B')) {
if (result[j] == 0 || result[j] > result[i] + ((j - i) * (j - i)))
result[j] = result[i] + ((j - i) * (j - i));
}
}
}
}
if (n > 1 && result[n - 1] == 0) {
System.out.println(-1);
} else {
System.out.println(result[n - 1]);
}
}
}
변수)
n : 보도블록 개수
arr, str : 보도블록 글자
result : 이동하는데 필요한 에너지 양의 최솟값
이중 for문을 사용하여 보도블록 전체를 탐색한다. 이미 방문한 곳이거나 스타트라면 다음 이동할 곳을 찾는다. B라면 O인 곳을, O라면 J인 곳을, J라면 B인 곳을 찾은 후 아직 한 번도 방문한 적이 없거나 원래 에너지보다 적은 에너지가 필요하다면 값을 업데이트해 준다.
최종 링크 값이 0이라면 스타트가 링크를 만날 수 없는 것이므로 -1을 출력하고 0이 아니라면 링크 값을 출력해 준다.
* n이 1일 경우 스타트와 링크가 일치하므로 0을 출력해 준다.
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 1446_지름길 (0) | 2023.12.06 |
---|---|
[Baekjoon] 4883_삼각 그래프 (2) | 2023.12.05 |
[Baekjoon] 2529_부등호 (1) | 2023.12.01 |
[Baekjoon] 1890_점프 (1) | 2023.11.30 |
[Baekjoon] 1495_기타리스트 (0) | 2023.11.29 |