풀이방법
처음에 어떻게 해야할지 고민이 많았다...
직사각형 기준으로 각 변에 위치하고 있으니 펼쳐보아야 할 것 같았지만 어떻게 설계해야 할지 고민이 들었다.
그래서 일단 에이포에 한번 쭉 그려보았다.
이 사진인데 기준을 가장 왼쪽 아래 꼭지점을 잡고. 사각형을 길게 아래 줄처럼 풀어버린다고 생각하면 된다.
그림판으로 그려보자면 약간 이런 모양이다.
그래서 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 |