문제
풀이
1. 점 개수(N)를 입력받음
2. int[100000] arr에 좌표를 인덱스로, 색깔을 값으로 저장
3. arr의 모든 인덱스를 돌면서, 값(색깔)이 있으면 그 좌표의 화살표 최소 거리를 구해서 누적
4. 누적값 출력
코드
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int ans;
static int[] arr = new int[100000];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
arr[a] = b;
}
length();
System.out.print(ans);
}
static int find(int x){
//arr[x](x좌표의 색)과 같은 색을 찾아 최소 거리를 반환하는 함수
int min = 100000;
for(int i=0; i<arr.length; i++){
if(i != x && arr[x] == arr[i]) //같은 색을 가진 좌표를 찾으면
if(min >= Math.abs(x-i))
min = Math.abs(x-i); //해당 좌표와의 거리 구해서 최솟값으로 업데이트
}
return min;
}
static void length(){
//좌표 간 길이를 구해서 누적하는 함수
for(int i=0; i<arr.length; i++){
if(arr[i] == 0)
continue;
ans += find(i);
}
}
}
(풀이 2)
참고 블로그
https://hellodavid.tistory.com/26
//null pointer exception
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
public class boj_15970_2 {
static int[][] arr;
static int[] result;
static int N;
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();
arr = new int[N][2]; //좌표, 색을 저장할 배열
for(int i=0; i<N; i++){
int point = scanner.nextInt();
int color = scanner.nextInt();
arr[i][0] = point;
arr[i][1] = color;
}
sort();
print();
}
static void sort(){
//같은 색끼리 뽑아서 모아두는 방법 : 색 별로 정렬하기.
//우선 색 별로 정렬하고, 색이 같으면 좌표 기준으로 오름차순 정렬.
Arrays.sort(arr, (i, j) -> {
if(i[1] == j[1]){
return i[0] - j[0];
}else {
return i[1] - j[1];
}
});
}
static void print(){
int ans = 0;
for(int i=0; i<N; i++) {
if (i == N - 1) //마지막 점인 경우
result[i] = arr[i][0] - arr[i - 1][0];
else if (i == 0) //시작 점인 경우
result[i] = arr[i + 1][0] - arr[i][0];
else {
int left = Math.abs(arr[i][0] - arr[i - 1][0]); // 왼쪽 점과의 거리
int right = Math.abs(arr[i + 1][0] - arr[i][0]); // 오른쪽 점과의 거리
// i번째 점 왼쪽 오른쪽 모두 같은 색
if (arr[i][1] == arr[i + 1][1] && arr[i - 1][1] == arr[i][1])
result[i] = left < right ? left : right;
// i번째 점 오른쪽만 같은 색
else if (arr[i][1] == arr[i + 1][1] && arr[i - 1][1] != arr[i][1])
result[i] = right;
// i번째 점 왼쪽만 같은 색
else
result[i] = left;
}
}
for (int i : result)
ans += i;
System.out.println(ans);
}
}
'BOJ' 카테고리의 다른 글
[백준 11404번/java] 플로이드 (0) | 2024.06.16 |
---|---|
[백준 14248/java] 점프 점프 (0) | 2024.06.13 |
[백준 9663번/java] N-Queen (0) | 2024.06.11 |
[백준 4485번 / java] 녹색 옷 입은 애가 젤다지? (0) | 2024.05.13 |
[백준 1074번/java] Z (0) | 2024.05.11 |