2024. 10. 8. 09:33ㆍCoding/백준-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는 소수점 이하 첫째 자리까지 반올림하여 출력하는 형식.
'Coding > 백준-Python' 카테고리의 다른 글
[백준] 백준 python3 2581번 문제 및 소스코드 (0) | 2024.10.08 |
---|---|
[백준] 백준 python3 1978번 문제 및 소스코드 (0) | 2024.10.08 |
[백준] 백준 python 14725번 문제 및 소스코드 (0) | 2024.10.07 |
[백준] 백준 python 2293번 문제 및 소스코드 (1) | 2024.10.06 |
[백준] 백준 python 1759번 문제 및 소스코드 (0) | 2024.10.05 |