0. 블록의 길이는 n*m이며 블록 중간에는 상점도 길도 없으므로 한바퀴 도는 경로를 n+m+n+m크기의 1차원 배열로 관리할 수 있다
1. 북쪽 > 동쪽 > 남쪽 > 서쪽 순서의 경로를 가정하고, 입력받은 상점의 위치를 가공해 저장한다
2. 마지막에 시작점을 입력받고, 배열을 한바퀴 순회(배열의 범위를 넘어가면 0으로 초기화)하며 거리를 누적한다
- 거리는 정방향(i)과 역방향(totalLen - i) 중 짧은쪽을 누적한다
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = pint(st.nextToken());
int m = pint(st.nextToken());
int[] map = new int[(n+m)*2];
int store = pint(br.readLine());
int pos=0;
int totalCost=0; //최소 코스트
int totalLen = (n+m)*2; // 상점가 블록 전체의 갯수
for (int i = 0; i <= store; i++) {
int temp=0;
st = new StringTokenizer(br.readLine());
switch (st.nextToken()) {
case "1"://북쪽
temp=pint(st.nextToken());break;
case "2"://남쪽
temp=n+m+n-pint(st.nextToken());break;
case "3"://서쪽
temp=(n+m)*2-pint(st.nextToken());break;
case "4"://동쪽
temp=n+pint(st.nextToken());break;
default: break;
}
if(i==store)pos=temp; // 마지막 입력은 시작 위치
map[temp]=1;
}
for (int i = 1; i < totalLen; i++) {
if(pos+i==totalLen)pos=-i;
if(map[pos+i]==1) {
totalCost+=Math.min(i, totalLen-i);
}
}System.out.println(totalCost);
}
static int pint(String s) {
return Integer.parseInt(s);
}
}
'알고리즘 문제 풀이 > BOJ 실버' 카테고리의 다른 글
[백준] 17276 - 배열 돌리기 (0) | 2021.10.10 |
---|---|
[백준] 1325 - 효율적인 해킹 (0) | 2021.09.25 |
[백준] 5567 - 결혼식 (0) | 2021.08.08 |
[백준] 14241 - 슬라임 합치기 (0) | 2021.07.07 |
[백준] 1697 - 숨바꼭질 (0) | 2021.05.29 |
[백준] 5639 - 이진 검색 트리 (0) | 2021.04.14 |
[백준] 2110 - 공유기 설치 (0) | 2021.04.13 |