알고리즘

백준 2564 경비원 (JAVA)

쿠키담임선생님 2022. 11. 8. 18:45

 

풀이방법


처음에 어떻게 해야할지 고민이 많았다...

직사각형 기준으로 각 변에 위치하고 있으니 펼쳐보아야 할 것 같았지만 어떻게 설계해야 할지 고민이 들었다.

그래서 일단 에이포에 한번 쭉 그려보았다.

 

이 사진인데 기준을 가장 왼쪽 아래 꼭지점을 잡고. 사각형을 길게 아래 줄처럼 풀어버린다고 생각하면 된다.

 

그림판으로 그려보자면 약간 이런 모양이다.

 

그래서 1 4 , 3 2, 2 8 이런식으로 주어졌을 때 문자열을 쪼개서 앞부분을 받고 그때마다 일정 수를 더해주는 것으로 구역을 나누었다.

그리고 마지막에 기준점이 최소값으로 가야하기 때문에 Math.min 을 사용했고 기준점이 항상 왼쪽에 있지 않기 때문에 절대값을 이용해서 출력했다.

 

아래 코드는 분석하기 쉽게 주석을 풀어놨으니 모르겠으면 이 코드 그대로 돌려보면 이렇게 그림으로 찍힌다.

 

숫자 2는 기준점이고 1들이 각 상점이다.

 

코드


package pro;

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

public class test06 {
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		int col = Integer.parseInt(st.nextToken()); // 가로 = 10
		int row = Integer.parseInt(st.nextToken()); // 세로 = 5
		
		// 펼쳐서 하나의 길이로 만들겠다는 뜻. 2칸인 이유는 최소길이 최대 길이 둘다 넣고 마지막에 비교해서 꺼낼때 사용.
		int []load = new int[2*(col+row)+1];
		int tc = Integer.parseInt(br.readLine());
		
		int answer = 0;
		
		//들려야 하는 위치들
		for(int i = 0; i<tc; i++) {
			st = new StringTokenizer(br.readLine()," ");
			int location = Integer.parseInt(st.nextToken());
			int area = Integer.parseInt(st.nextToken());
			// 남쪽
			if(location == 2) {
				load[area] = 1; //
			}
			//동
			else if(location == 4) {
				load[col+(row-area)] = 1;
			}
			//북
			else if(location == 1) {
				load[(row+col)+(col-area)] = 1;
			}
			//서
			else if(location == 3) {
				load[(col+row+col)+area] = 1;
			}
			
		}
		
		//마지막으로 주어지는 기준점
		//기준점은 2로 한다.
		st = new StringTokenizer(br.readLine()," ");
		int S_location = Integer.parseInt(st.nextToken());
		int S_area = Integer.parseInt(st.nextToken());
		//남쪽
		if(S_location == 2) {
			load[S_area] = 2; //
		}
		//동
		else if(S_location == 4) {
			load[col+(row-S_area)] = 2;
		}
		//북
		else if(S_location == 1) {
			load[(row+col)+(col-S_area)] = 2;
		}
		//서
		else if(S_location == 3) {
			load[(col+row+col)+S_area] = 2;
		}
		
		
		//어느 위치에 있는지 찍어보는 코드.
		for(int i = 0; i<2*(col+row)+1; i++) {
			System.out.print(load[i]+" ");
		}
		
		//위치는 정확하니까 이제 각 위치에서 기준점을 빼고 answer 변수에 더해준다.
		
		//기준점을 뽑아내는 포문
		int center = 0;
		for(int i = 0; i<2*(col+row)+1; i++) {
			if(load[i]==2) {
				center = i;
			}
		}
		
		//이제 각 위치를 찾아서 answer 변수에 더해주는 포문
		for(int i = 0; i<2*(col+row)+1; i++) {
			if(load[i]==1) {
				//절대값을 이용해야함. 기준점이 다른 사분면에 있으면 다른 1들이 왼쪽에 있을 수도 있음.
				int abs_x = Math.abs(i-center); // 절대값임.
				int abs_y = 2*(col+row) - abs_x;
				answer += Math.min(abs_x, abs_y);
			}
		}
		System.out.println();
		System.out.println(answer);
		
		
		
		
	}

}

 

'알고리즘' 카테고리의 다른 글

백준 1149번 RGB 거리 (JAVA)  (2) 2022.11.09
백준 1920번 수 찾기 (JAVA)  (0) 2022.11.09
백준 1427 소트인사이드 (JAVA)  (0) 2022.11.08
백준 1063번 킹 (JAVA)  (0) 2022.11.04
백준 1417번-국회의원 선거(JAVA)  (0) 2022.11.03