반응형
12-24 00:25
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[백준] 5884번 : 감시 카메라 본문

Programming/백준

[백준] 5884번 : 감시 카메라

조용한고라니 2021. 5. 11. 03:56
반응형
 

5884번: 감시 카메라

총 소가 6마리 있고, 소의 위치는 (1,7), (0,0), (1,2), (2,0), (1,4), (3,4) 이다. 감시 카메라를 y=0, x=1, y=4 로 설치하면 모든 소를 감시할 수 있다.

www.acmicpc.net


[Map 이용]

Java의 Map 컬렉션을 사용했다. 문제의 접근법은 간단하며 다음과 같다.

 

  1.  2차원 배열에 소들의 (x, y) 좌표를 저장한다.
  2. x좌표 Map과 y좌표 Map을 준비한다.
  3. x좌표 Map에 Key로 좌표를, Value로 빈도수를 저장한다. y좌표 Map에도 마찬가지
  4. 감시 카메라는 총 3대이므로 3번의 반복문을 수행한다
    1. xMap에서의 가장 많이 위치한 x좌표의 정보를 꺼낸다.
    2. yMap에서의 가장 많이 위치한 y좌표의 정부를 꺼낸다.
    3. (1), (2)를 비교해 더 큰 값을 저장하고, 해당 Map에서 값을 지운다. (yMap의 최대값이 더 크면 yMap의 최대값을 지운다.)
  5. 소들의 좌표를 저장한 배열을 순회하며 감시 카메라 3대로 감시할 수 있는지 체크한다.

문제의 접근법은 쉽다고 생각되지만, 이를 구현하는 것에 있어 애를 먹었다. Map을 자주 사용하지 않았던 탓에 처음 보는 개념이나 용어도 있었다.

 

우선 Map에서 최대값을 뽑는 방법이다.

Map.Entry<Integer, Integer> xMaxEntry = null;

for (Map.Entry<Integer, Integer> entry : xmap.entrySet())
    if (xMaxEntry == null || entry.getValue().compareTo(xMaxEntry.getValue()) > 0)
        xMaxEntry = entry;
        
int maxKey = xMaxEntry.getKey();
int maxVal = xMaxEntry.getKey();

다음은 빈도수를 1씩 증가시키는 방법이다.

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

            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());

            if(!xmap.containsKey(x))
                xmap.put(x, 1);
            else
                xmap.replace(x, xmap.get(x) + 1);

            if(!ymap.containsKey(y))
                ymap.put(y, 1);
            else
                ymap.replace(y, ymap.get(y) + 1);
        }

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
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());

        Map<Integer, Integer> xmap = new HashMap<>();
        Map<Integer, Integer> ymap = new HashMap<>();
        int[][] cows = new int[n][2];

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

            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());

            cows[i][0] = x;
            cows[i][1] = y;

            if(!xmap.containsKey(x))
                xmap.put(x, 1);
            else
                xmap.replace(x, xmap.get(x) + 1);

            if(!ymap.containsKey(y))
                ymap.put(y, 1);
            else
                ymap.replace(y, ymap.get(y) + 1);
        }

        int[][] arr = new int[3][2];
        for(int i=0; i<3; i++) {
            Map.Entry<Integer, Integer> xMaxEntry = null;
            Map.Entry<Integer, Integer> yMaxEntry = null;

            for (Map.Entry<Integer, Integer> entry : xmap.entrySet())
                if (xMaxEntry == null || entry.getValue().compareTo(xMaxEntry.getValue()) > 0)
                    xMaxEntry = entry;

            for (Map.Entry<Integer, Integer> entry : ymap.entrySet())
                if (yMaxEntry == null || entry.getValue().compareTo(yMaxEntry.getValue()) > 0)
                    yMaxEntry = entry;

            if(xMaxEntry.getValue() >= yMaxEntry.getValue()){
                arr[i][0] = 0;
                arr[i][1] = xMaxEntry.getKey();
                xmap.remove(arr[i][1], xMaxEntry.getValue());
            }
            else{
                arr[i][0] = 1;
                arr[i][1] = yMaxEntry.getKey();
                ymap.remove(arr[i][1], yMaxEntry.getValue());
            }
        }

        boolean result = true;

        for(int i=0; i<n; i++)
            if(cows[i][ arr[0][0] ] != arr[0][1] && cows[i][ arr[1][0] ] != arr[1][1] && cows[i][ arr[2][0] ] != arr[2][1]){
                result = false;
                break;
            }
        System.out.println(result? 1 : 0);
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 3709번 : 레이저빔은 어디로  (0) 2021.05.13
[백준] 5430번 : AC  (0) 2021.05.12
[백준] 16441번 : 아기돼지와 늑대  (0) 2021.05.10
[백준] 1034번 : 램프  (0) 2021.05.10
[백준] 9655번 : 돌 게임  (0) 2021.05.10
Comments