티스토리 뷰

코딩테스트/백준

백준-2477(파이썬)

김쓰로그 2022. 10. 12. 17:47

https://www.acmicpc.net/problem/2477

 

2477번: 참외밭

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지

www.acmicpc.net

문제생각

문제의 컨셉은 간단했습니다.

큰 네모의 넓이를 구하고 구멍이 나있는 작은 네모의 넓이를 뺀 후에 k(1m^2 당 참외의 개수)를 곱해주면 되는 문제였습니다.

 

그럼 어떻게 구멍이 나있는 작은 네모를 찾을까 고민했습니다.

 

먼저 문제에서 보이는 네모는 총 4개의 모양이 나올 수 있습니다.(90도씩 돌려보면 됩니다)

이 때 방향의 개수를 세어보면 어떠한 모양인지 유추할 수 있습니다.

왜냐하면 문제에서 반시계방향으로 둘레를 돈다고 명시되어있기 때문입니다.

 

어떠한 모양인지 유추가 되었다면 각 모양에서 구멍이 나오는 방향을 정해져있습니다.

각 모양별로  동(1)에서 남(3) //  서(2)에서 북(4) // 남(3)에서 서(2) // 북(4)에서 동(1) 

 

위 방향이 연속으로 나올 때는 찾으면 되는 것입니다.

 

저는 deque 모듈을 사용하여 각 모양별로 위에서 적은 방향이 연속으로나올 때까지 popleft()와 append()를 해줬습니다.

그러면 연속으로 나왔을때 반환되는 값이 작은네모의 세로와 가로일 것입니다.

 

그리고 동서에서 최대값, 남북에서 최대값을 찾고 이를 곱하면 구멍이 없는 원래 네모의 넓이가 됩니다.

 

따라서 (원래 네모의 넓이 - 작은 네모의 넓이)*k를 한다면 정답이 나올 것입니다.

 

문제코드

from collections import deque

k=int(input()) #1m^2에서 자라는 참외의 개수
field_dir=deque() #참외밭 방향
field_len=deque() #참외밭 길이
dir_dic={1:0, 2:0, 3:0, 4:0} #방향

for _ in range(6):
    direction, length=map(int, input().split()) #방향과 길이입력
    dir_dic[direction]+=1 #방향개수 세기
    field_dir.append(direction)
    field_len.append(length)

#check
def findSmallRect(check):
    idx=0
    while True:
        if field_dir[idx]==check[0] and field_dir[idx+1]==check[1]:
            return [field_len[idx], field_len[idx+1]]
        else:
            field_dir.append(field_dir.popleft())
            field_len.append(field_len.popleft())

if dir_dic[1]==2 and dir_dic[3]==2:
    result=findSmallRect([1, 3])
elif dir_dic[2]==2 and dir_dic[4]==2:
    result=findSmallRect([2, 4])
elif dir_dic[2] and dir_dic[3]==2:
    result=findSmallRect([3, 2])
elif dir_dic[1] and dir_dic[4]==2:
    result=findSmallRect([4, 1])

max1, max2=-1, -1 #max1은 동서최대, max2는 남북최대
for d, l in zip(field_dir, field_len):
    if d==1 or d==2:
        max1=max(max1, l)
    elif d==3 or d==4:
        max2=max(max2, l)

ans=((max1*max2)-(result[0]*result[1]))*k
print(ans)

문제는 한번에 해결하였고 시간도 84ms로 다른분들과 큰 차이 나지 않게 해결하였지만 

문제가 깔끔하게 풀리지 않았다는 느낌을 받았습니다. 코드의 길이도 상당합니다...ㅎㅎ(조건문 어마어마)

 

그래서 다른 분들의 코드를 보았는데 어떻게 저런 생각을 하시는지...

코딩을 하면할 수록 부족하다는 생각이 듭니다...ㅠㅠ

 

다른 분들의 코드도 보면서 배워나가야 겠습니다..

 

 

"아직 실력이 부족하여 문제 해결에 있어 코드가 매끄럽지 못한 점 양해부탁드립니다..ㅎ"

'코딩테스트 > 백준' 카테고리의 다른 글

백준 - 서강근육맨(20300, 파이썬)  (0) 2023.03.16
백준-사탕 게임(3085, 파이썬)  (0) 2023.03.16
백준-15686(파이썬)  (1) 2022.10.11
백준-11286(파이썬)  (0) 2022.10.11
백준-16926(파이썬)  (0) 2022.10.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함