일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 객체지향패러다임
- 검색어 추천
- 이분탐색
- 깊게 생각해보기
- 결제서비스
- AWS
- jwt 표준
- 좋은 코드 나쁜 코드
- 디버깅
- 완전탐색
- docker
- 백준
- 숫자 블록
- 구현
- prg 패턴
- 누적합
- BFS
- spring event
- 셀러리
- 프로그래머스
- piplining
- 알람 시스템
- gRPC
- 코드 계약
- 카카오
- 쿠키
- 트랜잭샨
- 레디스 동시성
- 수신자 대상 다르게
- branch 전략
- Today
- Total
코딩관계론
[프로그래머스] 숫자 블록 본문
문제 이해하기
숫자 0이 적힌 블록들에 다른 숫자가 적힌 블록들을 설치하려고 한다. 블록을 설치하는 규칙은 다음과 같습니다
블록에 적힌 번호가 n 일 때 가장 첫 블록은 n * 2번 째 도로의 위치에 설치, 그 다음은 n * 3, 4 ...도로의 위치에 설치합니다.
이 때 기존에 설치된 블럭이 존재한다면 해당 블록을 빼고 새로운 블록을 설치합니다.
각 블록은 오름차순으로 주어집니다. 또한 블럭의 숫자는 1 ~ 10,000,000까지의 숫자만 존재합니다.
문제 해결 방법
1. 도로의 입장에서 생각해보면 도로에 설치될 수 있는 블럭은 도로의 위치의 약수입니다.
예를 들면 10번 도로의 위치에는 1, 2, 5의 블록이 설치될 수 있다. 10의 블록이 설치될 수 없는 이유는 10(도로)은 10(블럭) * 1이기 때문에 문제의 조건에 위반됩니다.
2. 약수를 빠르게 계산할 수 있어야 합니다.
약수의 정의를 보면 N / A의 나머지가 0이 된다면 그 몫도 약수가 됩니다. 즉 대칭적인 성질을 가지고 있습니다. 따라서 SQRT를 사용하면 대칭의 마지막 지점을 구할 수 있게 됩니다.
예를들면 SQRT(36)을 진행하게 된다면 6이 되고, 36의 약수의 대칭 지점이 6입니다. 따라서 기존의 N까지의 모든 약수를 구하는 방식보다 더 빠르게 문제를 해결할 수 있습니다.
코드
import math
def find_largest_proper_divisor(n):
if n == 1:
return 0
answer = 1
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
if 10000000 < int(n / i):
answer = max(answer, i)
else:
answer = max(answer, int(n/i))
return answer
def solution(begin, end):
answer = []
while begin <= end:
answer.append(find_largest_proper_divisor(begin))
begin += 1
return answer
if __name__ == "__main__":
begin = 100000014
end = 100000016
print(solution(begin=begin, end=end))
코드 리뷰
배운점 정리하기
이번 코드 리뷰를 통해 배운 점은 다음과 같습니다.
문제를 꼼꼼하게 읽는 것이 매우 중요하다.사용할 수 있는 블록은 1에서 10^7까지인데 초기에는 이 구문을 못보고 왜 틀렸지했습니다.
앞으로는 문제를 보다 꼼꼼하게 읽어야겠다
'개발 > 알고리즘' 카테고리의 다른 글
[카카오 프로그래머스] 도넛과 막대 (0) | 2024.04.04 |
---|---|
[프로그래머스] 석유 시추 (0) | 2024.04.03 |
[프로그래머스] 과제 진행 (0) | 2023.05.07 |
[프로그래머스] 요격 시스템 (0) | 2023.05.06 |
[웹 백엔드] 칫솔 판매 (0) | 2023.04.13 |