반응형
Notice
Recent Posts
Recent Comments
Link
지구정복
[구현] 백준 - 경비원 본문
728x90
반응형
-자바
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer( br.readLine() );
int a = Integer.parseInt( st.nextToken() ); //블록 가로 길이
int b = Integer.parseInt( st.nextToken() ); //블록 세로 길이
int c = Integer.parseInt( br.readLine() ); //상점의 개수
int[][] shops = new int[c][2]; //상점좌표 담을 2차원 배열
for( int i=0; i<c; i++ ) {
st = new StringTokenizer( br.readLine(), " " );
shops[i][0] = Integer.parseInt( st.nextToken() ); //각 상점 좌표
shops[i][1] = Integer.parseInt( st.nextToken() );
}
st = new StringTokenizer( br.readLine() );
int x = Integer.parseInt( st.nextToken() ); //동근이 위치
int y = Integer.parseInt( st.nextToken() );
int sum = 0;
//상점 개수만큼 순회하면서 각 상점이 북,남,서,동의 경우로 나눔
//상점이 북쪽일 경우 또 동근이의 위치를 북,남,서,동의 경우로 나눔
//상점과 동근이의 시계방향과 시계반대방향의 거리를 구한다음 둘 중에 작은 거를 sum에 더한다.
for( int i=0; i<c; i++ ) {
if( shops[i][0] == 1 ) {
if( shops[i][0] == x ) { //상점의 위치와 동근이의 위치가 같은 경우
sum += Math.abs( shops[i][1] - y );
} else if( x == 2 ) { //상점은 북쪽, 동근이는 남쪽인 경우 시계, 반시계 거리를 구한다.
sum += ( shops[i][1]+b+y ) < ( a-shops[i][1]+b+a-y ) ? shops[i][1]+b+y : a-shops[i][1]+b+a-y;
} else if( x == 3 ) { //상점은 북쪽, 동근이는 서쪽인 경우
sum += shops[i][1]+y;
} else { //상점은 북쪽, 동근이는 동쪽인 경우
sum += a-shops[i][1]+y;
}
} else if( shops[i][0] == 2 ) {
if( shops[i][0] == x ) {
sum += Math.abs( shops[i][1] - y );
} else if( x == 1 ) {
sum += ( shops[i][1]+b+y ) < ( a-shops[i][1]+b+a-y ) ? shops[i][1]+b+y : a-shops[i][1]+b+a-y;
} else if( x == 3 ) {
sum += shops[i][1]+b-y;
} else {
sum += a-shops[i][1]+b-y;
}
} else if( shops[i][0] == 3 ) {
if( shops[i][0] == x ) {
sum += Math.abs( shops[i][1] - y );
} else if( x == 1 ) {
sum += shops[i][1]+y;
} else if( x == 2 ) {
sum += b-shops[i][1]+y;
} else {
sum += ( shops[i][1]+a+y ) < ( b-shops[i][1]+a+b-y ) ? shops[i][1]+a+y : b-shops[i][1]+a+b-y;
}
} else {
if( shops[i][0] == x ) {
sum += Math.abs( shops[i][1] - y );
} else if( x == 1 ) {
sum += a-shops[i][1]+y;
} else if( x == 2 ) {
sum += a-shops[i][1]+b-y;
} else {
sum += ( shops[i][1]+a+y ) < ( b-shops[i][1]+a+b-y ) ? shops[i][1]+a+y : b-shops[i][1]+a+b-y;
}
}
}
bw.write( sum + "\n" );
bw.flush();
bw.close();
br.close();
}
}
-파이썬
#북쪽 젤 왼쪽점을 기준으로 시계반대방향의 거리를 구함
def dist_calc( x, y ):
if x == 1: #북
return y
elif x == 2: #남
return a+b+a-y
elif x == 3: #서
return a+b+a+b-y
else:
return a+y
a, b = map( int, input().split() )
circum = (a+b) * 2
n = int( input() )
dist = []
for i in range(n+1):
x, y = map( int, input().split() )
dist.append( dist_calc( x, y ) )
my_dist = dist[-1] #동근이 위치
ans = 0
for i in range(n):
clockwise = abs( my_dist-dist[i] ) #동근이 위치 - 각 상점위치
ans += min( clockwise, circum-clockwise ) #시계방향거리와 반시계방향 거리를 비교
print( ans )
728x90
반응형
'데이터 엔지니어링 정복 > Algorithm' 카테고리의 다른 글
[Greedy] 이코테 - 숫자 카드 게임 (0) | 2021.06.09 |
---|---|
[구현] 백준 - 제로 (0) | 2021.06.09 |
[구현] 백준 - 팰린드롬인지 확인하기 (0) | 2021.06.08 |
[Greedy] 이코테 - 큰수의 법칙 (0) | 2021.06.06 |
[Greedy] 백준 - DNA (0) | 2021.06.05 |
Comments