[python_파이썬_Pass]백준_2564번_경비원_풀이

2024. 8. 12. 22:37코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/942ryg6Zch8?feature=shared

 

처음에 문제를 너무 쉽게 봤다.

금방 해결할 수 있을 것 같았는데 1시간 조금 넘게 걸렸다.

따로 알고리즘이나 공식이 있어 보이지는 않았고, 내 위치가 어딘지에 따라서 각 상점간의 거리를 하나씩 구해서 answer의 변수에 넣어주면 답이 나오겠다고 생각했다.

 

<첫번째 시도 : 맞았습니다.>

아래의 코드로 일단 작성은 했으나 오류를 찾기가 어려웠다.

import sys
input = sys.stdin.readline

#1. 입력 및 초기화
X, Y = map(int, input().split())
M = int(input())
market = []

for i in range(M):
    x, y = map(int, input().split())
    market.append([x, y])
   

mx, my = map(int, input().split())
answer = 0


"""본인위치 기준 같은 쪽이면 1, 2면 Y / 3, 4면 X가 무조건 필요"""
for i in range(M):
    temp_x, temp_y = market[i]
    if temp_x == mx:
        answer += abs(temp_y- my)
    #같은 방향일때
    elif (temp_x == 1 and mx == 2) or (temp_x == 2 and mx == 1):
        """반대방향 확인 필요"""
        answer += min((Y + my + temp_y), ((X - my) + Y + (X - temp_y)))
    elif (temp_x == 3 and mx == 4) or (temp_x == 4 and mx == 3):
        answer += min((X + my + temp_y),((Y - my) + X + (Y - temp_y)))
    #다른 방향일때
    elif (temp_x == 1 and mx == 3) or (temp_x == 3 and mx == 1):
        answer += my + temp_y
    elif (temp_x == 1 and mx == 4) or (temp_x == 4 and mx == 1):
        #answer += (X - my) + temp_y
        answer += my + (X - temp_y)
    elif (temp_x == 2 and mx == 3) or (temp_x == 3 and mx == 2):
        answer += my + (Y - temp_y)
    elif (temp_x == 2 and mx == 4) or (temp_x == 4 and mx == 2):
        answer += (X - my) + (Y - temp_y)
       
print(answer)
       
           

 

<다른 스터디원 코드 : 명확하고 직관적이며, 오류 발생 가능성이 낮다.>

나와 같은 생각을 했으나 나와는 다른 코드로 작성했다.

방향은 같으나 and와 or를 남발했던 나와는 다르게 이중 if로 보다 더 직관적으로 작성했다.

import sys

input = sys.stdin.readline

w, h = map(int, input().split())

n = int(input())

stores = []

for _ in range(n):
    direction, location = map(int, input().split())
    stores.append((direction, location))
   
md, ml = map(int, input().split())

answer = 0

for d, l in stores:
    if md == 1:
        if d == 1:
            answer += abs(ml - l)
        elif d == 2:
            answer += min(ml + l + h, 2*w - ml - l + h)
        elif d == 3:
            answer += ml + l
        elif d == 4:
            answer += w - ml + l
    elif md == 2:
        if d == 1:
            answer += min(ml + l + h, 2*w - ml - l + h)
        elif d == 2:
            answer += abs(ml - l)
        elif d == 3:
            answer += ml + h - l
        elif d == 4:
            answer += w - ml + h - l
    elif md == 3:
        if d == 1:
            answer += l + ml
        elif d == 2:
            answer += l + h - ml
        elif d == 3:
            answer += abs(ml - l)
        elif d == 4:
            answer += min(w + 2*h - l - ml, w + ml + l)
    elif md == 4:
        if d == 1:
            answer += ml + w - l
        elif d == 2:
            answer += h - ml + w - l
        elif d == 3:
            answer += min(w + 2*h - l - ml, w + ml + l)
        elif d == 4:
            answer += abs(ml - l)
print(answer)

 

<다른 사람 코드 참조>

이거 좀 복습해서 이해해야겠네...

import sys

def cng_one(dir, dis, i):
    if dir == 1:
        one_dis[i] = dis
    elif dir == 2:
        one_dis[i] = w + h + w - dis
    elif dir == 3:
        one_dis[i] = w + h + w + h - dis
    else:
        one_dis[i] = w + dis        

w, h  = map(int, sys.stdin.readline().split())
n = int(input())
one_dis = [0 for _ in range(n + 1)]
for i in range(n + 1):
    dir, dis = map(int, sys.stdin.readline().split())
    cng_one(dir, dis, i)
   
s = 0
for j in range(n):
    cir = abs(one_dis[j] - one_dis[-1])
    re_cir = 2 * (w + h) - cir
    if cir <= re_cir:
        s += cir
    else:
        s += re_cir
       
print(s)
728x90
반응형