[백준] 백준 Python3 2166번 문제 및 소스코드

2024. 10. 8. 09:33Coding/백준-Python

1. 문제 링크

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

2. 문제

 

3. 전체 소스 코드

def polygon_area(coords):
    n = len(coords)
    area = 0
    
    for i in range(n):
        x1, y1 = coords[i]
        x2, y2 = coords[(i + 1) % n]
        area += (x1 * y2 - x2 * y1)
        
    return abs(area) / 2

n = int(input())
coords = [tuple(map(int, input().split())) for _ in range(n)]

print(f"{polygon_area(coords):.1f}")

 

 

4. 소스 코드 해설

1) polygon_area 함수 정의

def polygon_area(coords):
    n = len(coords)  # 다각형의 꼭지점 수 (좌표 리스트의 길이)
    area = 0  # 면적을 계산할 변수 초기화

- polygon_area 함수는 좌표 리스트 coords를 입력으로 받아 다각형의 면적을 계산

- n=len(coords)는 좌표 리스트의 길이, 즉 다각형의 꼭지점 수를 계산

- area = 0 는 신발끈 공식을 이용해 면적을 구하기 위한 변수 초기화

 

2) 신발끈 공식 적용

for i in range(n):
    x1, y1 = coords[i]  # 현재 좌표 (i번째 좌표)
    x2, y2 = coords[(i + 1) % n]  # 다음 좌표 (i+1번째 좌표, 마지막 좌표일 경우 첫 번째 좌표로 돌아감)
    area += (x1 * y2 - x2 * y1)  # 신발끈 공식에

- for i in range(n)은 0부터 n - 1까지 반복됨. 각 반복에서 현재 좌표와 그 다음 좌표 선택.

- x1, y1 = coords[i]는 i번째 좌표를 x1, y1로 할당한다.

- x2, y2 = coords[(i + 1) % n]는 i+1번째 좌표를 할당하는데, (i+1)%n는 마지막 좌표일 때 첫 번째 좌표로 돌아가도록 처리.

- area+=(x1*y2 - x2*y1)는 신발끈 공식(Shoelace Theorem)을 이용해 면적을 계산하는 부분. 모든 좌표쌍(x1, y1)과 (x2, y2)에 대해 반복적으로 공식을 적용해 면적에 더해줌.

 

3) 면적의 절대값 계산 및 반환

return abs(area) / 2

- 다각형의 면적은 절댓값을 취한 후 2로 나누어야 함.

- 신발끈 공식으로 계산한 값은 양수 또는 음수가 될 수 있으므로 abs(area)로 절대값을 취해 양수로 변환.

- 마지막으로 2로 나누어 다각형의 면적 반환

 

4) 입력 받기

n = int(input())  # 사용자로부터 꼭지점 수 입력 받기
coords = [tuple(map(int, input().split())) for _ in range(n)]  # 각 꼭지점의 좌표를 입력 받아 리스트로 저장

- n = int(input())는 사용자로부터 다각형의 꼭짓점 수를 입력받음.

- coords = [tuple(map(int, input().split())) for _ in range(n)]는 다각형의 각 꼭짓점의 좌표를 입력받아 (x, y) 형식의 튜플로 변환한 후, 이 튜플들을 리스트에 저장.

  • input().split()은 입력된 좌표를 공백으로 구분하여 리스트로 생성.
  • map(int, input().split()) 는 좌표 리스트의 각 값을 정수로 변환.
  • tuple(...)은 좌표를 튜플로 묶는다.

 

5) 출력

print(f"{polygon_area(coords):.1f}")  # 소수점 첫째 자리까지 다각형의 면적 출력

- polygon_area(coords) 함수 호출을 통해 구한 면적을 f-string을 사용해 출력.

- :.1f는 소수점 이하 첫째 자리까지 반올림하여 출력하는 형식.