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

쓰리원·2022년 3월 4일
0

코딩테스트

목록 보기
11/28
post-thumbnail
post-custom-banner

1. 백준 15970번 문제

2. 문제 해석

여러색으로 나누어져 있는 가장 가까운 점과의 거리를 계산해서 출력하는 문제입니다. 편의상 색은 숫자로 표현합니다.

3. 문제 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[][] arr = new int[n][2]; //좌표와 색깔을 가지는 이차원 배열 생성

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            arr[i] = new int[] {
                    Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())
            };
            //arr[]에 (0 1) (1 2) (3 1) (4 2) (5 1) 값을 차례대로 넣어줍니다.
        }
        br.close();

        System.out.print(cal(n, arr));
    }
    private static int cal(int n, int[][] arr) {
        int answer = 0;
        // 색깔 기준으로 정렬하고 색깔이 같으면 좌표기준으로 정렬을 해준다.
        Arrays.sort(arr, (o1, o2) -> { //그냥 함수임. 이렇게 쓰면됨.
            if (o1[1] == o2[1]) //2번째 배열의 수가 같으면 첫번째 배열의 숫자를 기준으로 정렬을 해준다.
                return o1[0] - o2[0];
            else // 그 밖의는 2번째 배열의 수가 다를 경우는 두번째 배열의 숫자를 기준으로 정렬을 해준다.
                return o1[1] - o2[1];
        });
        //설명을 위한 정렬 확인.
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < 2; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
        for (int i = 0; i < n; i++) {
            //반복문을 한번 돌면서 양끝 좌표인 케이스는 인접한 좌표와의 거리만 계산하고
            //중간의 좌표는 왼쪽과 오른쪽 좌표의 색깔을 비교해서 양쪽 다 같으면 좌표 거리 차이가 최소인 좌표,
            //한쪽만 같으면 해당 좌표 거리만 더해서 정답을 구한다.
            if (i == 0) {
                answer += (arr[1][0] - arr[0][0]);//시작 좌표는 바로 아래 점과의 거리 값 구해서 더하기
            }
            else if (i == n-1) {
                answer += (arr[n-1][0] - arr[n-2][0]);//마지막 좌표는 비로 위 점과의 거리 값 구해서 더하기
            }
            else
            {// 위쪽 아래쪽 같은 색이면 좌표 거리차이 최소값
                if (arr[i][1] == arr[i-1][1] && arr[i][1] == arr[i+1][1])
                    answer += Math.min(arr[i][0] - arr[i-1][0], arr[i+1][0] - arr[i][0]);
                //양쪽 점중에서 가장 거리가 가까운 값을 반환합니다.

                else if (arr[i][1] == arr[i-1][1]) // 위쪽만 같은 색
                    answer += (arr[i][0] - arr[i-1][0]);

                else // 아래쪽만 같은 색
                    answer += (arr[i+1][0] - arr[i][0]);
            }
        }
        return answer;
    }
}

출력 결과

5
0 1
1 2
3 1
4 2
5 1

0 1 
3 1 
5 1 
1 2 
4 2 
13
profile
가장 아름다운 정답은 서로의 협업안에 있다.
post-custom-banner

0개의 댓글