문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181187
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
처음 작성한 코드
문제를 한 사분면으로 범위를 줄이고 각 x 좌표에 따른 y값을 이용해 점들의 개수를 합치는 풀이이다.
- 그림에서 두 개의 원은 중심은 (0, 0)으로 동일하므로 각 사분면에 대한 점들의 위치와 개수는 동일하다 할 수 있다. 따라서 빨간색 사각형으로 칠한 사분면 하나에 대한 점들의 개수만 구하기로 한다.
- 각 x값에서의 y값을 원 r1은 y1, 원 r2는 y2로 지정했다.
- y1s는 y1값의 제곱값으로 저장하였고, 이후에 조건문에서 이용하기 위해 변수로 따로 만들어 주었다.
- x값을 나타내는 i값이 r1보다 커지면 1 사분면에서는 0보다 작아질 수 없기 때문에 조건문을 추가하여 최솟값이 0이 되게 하였다.
- 계산에 용이하게 이용하기 위해서 두 y1, y2 모두 int 함수를 이용해서 나머지를 제거한 정수형으로 바꾸었다.
- y1s는 y1값의 제곱값으로 저장하였고, 이후에 조건문에서 이용하기 위해 변수로 따로 만들어 주었다.
- 각 x에 대하여 원 r1과 r2 사이에 있는 점의 개수를 구할 수 있다.
- 점의 위치는 y2이하의 정수값에 위치해야 하기 때문에 아까 바꾼 정수형 그대로 이용하면 된다.
- y1이상의 정수값에도 위치해야 하지만, 정수일 때는 원과 겹치는 점도 범위를 구해주어야 하기 때문에 그대로 바꾼 정수형을 식에 이용하기 애매하다.
- 예를 들어, y1 = 1.5 일 때와 y1 = 1.0 일 때 모두 int(y1)의 값은 1이지만 포함되는 점의 개수는 1.0에서만 하나 더 많다.
- 따라서 정수형으로 바꾸기 전의 y1s를 비교식에 이용하여 정수형으로 변환한 y1이 원래 정수였는지를 체크해보면 된다. => (y1**2 == y1s)
- 최종적으로 각 x에 대하여 y1부터 y2까지의 점의 개수는 y2-y1으로 나타내고 y1이 원래 정수였을 경우에만 1을 더해주는 식을 작성하여 카운터에 값을 누적시킨다.
- 범위를 1부터 r2 - 1까지로 잡았기 때문에 마지막 x = r2 일 때의 경우를 카운터에 더해준다. (항상 1이다.)
- 이제 나머지 사분면의 경우도 고려하여 4를 곱하여 반환해 준다.
def solution(r1, r2):
cnt = 0
# 그래프의 한 사분면만 고려
for i in range(1, r2):
y1s = (r1**2 - i**2) if r1 > i else 0
y1 = int(y1s**0.5)
y2 = int((r2**2 - i**2)**0.5)
# x 좌표값에 대한 점의 개수
cnt += y2 - y1 + (1 if y1 ** 2 == y1s else 0)
# x 좌표값 = r2 일 때
cnt += 1
return cnt * 4
# 입출력 예시
print(solution(2, 3))
중간 계산 변수들을 약간 생략해서 설명이 좀 난해 할 수 있다.
사분면 하나의 경우로 제한하여 계산한다는 것과 경계선에 점이 있을 예외 경우를 고려하여 코드를 작성하면 된다.
다른 코드
사소한 차이는 있느나 크게 다른 코드, 혹은 더 좋은 코드를 발견하지 못했다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Programmers][Python] 멀쩡한 사각형 (0) | 2023.05.01 |
---|---|
[Programmers][Python] H-index (0) | 2023.04.26 |
[Programmers][Python] 멀리 뛰기 (0) | 2023.04.08 |
[Programmers][Python] 영어 끝말잇기 (0) | 2023.04.07 |
[Programmers][Python] 체육복 (0) | 2023.04.07 |