BOJ

[백준 15970/java] 화살표 그리기

syj0522 2024. 6. 12. 15:24

문제

15970번: 화살표 그리기 (acmicpc.net)

 

풀이

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