알고리즘.. 나의 생각 🐤
이 문제 내용 자체가 흥미로워서 비행기에서도 계속 아이패드로 풀이를 생각해봤다.
내가 생각한 첫 번째 알고리즘은 원 둘레를 이용하는 것이었다. 하지만 계산을 해보니, 엉터리 풀이라서 깔끔하게 안녕..
그 다음엔 원 넓이를 이용한 알고리즘을 생각했다. 1, 2, 3, 4분면에 입력 받은 점 중 최댓값을 골라서 그만큼의 길이를 반지름으로 만들어주면 되겠다!가 결론이었다. 그럼 내 메모에서 빨간 점들과 원점 사이의 거리가 가장 큰 값이 낚시 거리가 되겠다.
알고리즘 생각은 잘 했는데 구현을 스스로 하지 못했다.
그 이유는
1. 연속적으로 입력되는 값들의 좌표 표현
x y 좌표가 연속적으로 들어오는데 이걸 좌표로 어떻게 표현을 해야할 지 몰랐다.
홀수 번째에 있는 건 y 좌표, 짝수 번째에 있는 건 x 좌표.. 이런 생각을 했는데
지금까지 내가 이런 풀이를 떠올리면서 복잡한 구현이 필요없음에도 불구하고 생각을 하기 위해 생각을 하는? 이상한 굴레에 빠져든 적이 많아서 빠르게 버렸다 😂
2. 문제에서 요구하는 경제성
최소 k개의 유효 낚시터를 확보할 수 있는 만큼만 업그레이드 하는 조건을 어떻게 맞춰야할지.. 고민을 했는데 이에 대한 답을 내리지 못했다.
알게된 점
- 연속적으로 들어오는 좌표는 포문과 범위 함수를 확인하면 된다. 1 2 3 4 5 6 이렇게 6 개의 값이 있고, 각각의 좌표가 (1,2) (3,4) (5,6)으로 구성된다고 할 때 for 문의 범위를 range함수를 통해 2칸씩 증가 + [i], [i+1] 이렇게 하면 for문 내에서 좌표를 다룰 수 있다..
- 내가 떠올린 알고리즘의 방향이 옳다고 느껴지면 문제를 다시 읽어보면서 놓친 것이 없는지 확인해보는 습관을 들이자. 앞으로 어려운 문제들을 많이 풀게될 텐데 그럴 때마다 적용해보자.
- 평소 기르려고 노력했던 메타인지가 이럴 때 도움이 많이 된다.!!! 이상한 굴레에 빠져들고 있거나 / 내가 잘 생각하고 있거나에 대한 인지를 하고 문제를 대하는 태도를 확립하면 알고리즘 풀이에 많은 도움이 될 것이라는 느낌이 들었다.
최종코드
from sys import stdin
input = stdin.readline
n, k = map(int,input().split())
ans = []
for _ in range(n):
pi = int(input())
xy = list(map(int,input().split()))
m = 0
for i in range(0, pi*2, 2):
if m < xy[i]**2 + xy[i+1]**2:
m = xy[i]**2 + xy[i+1]**2
ans.append(m)
ans.sort()
print('{:.2f}'.format(ans[k-1]))
이렇게 쓰고 보니까 알고리즘보다 문제를 대하는 태도에 대해서 많이 깨달은 연습이었다..
'PS > BOJ&Programmers' 카테고리의 다른 글
[백준/5430] AC | deque의 reverse() | reverse를 여러 번? (0) | 2023.02.13 |
---|---|
[백준/1021] 회전하는 큐 | python deque | dequed의 rotate() (0) | 2023.02.12 |
[백준/10819] 차이를 최대로 | 모든 순서를 고려한 배열.. permutation | 리스트 갱신법이 항상 효율적일까? (2) | 2023.01.31 |
[백준/3029] 경고 | 파이썬 (0) | 2023.01.29 |
[백준/15656] N과 M(7) (0) | 2023.01.29 |