일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 월간
- 파비최
- Writing
- 스탭퍼
- 10분
- 개발자
- 3줄정리
- leetcode
- 리얼 클래스
- English
- 쓰릴오브파이트
- Daily Challenge
- 프로젝트
- 30분
- 화상영어
- Problem Solving
- 뭐든
- 미드시청
- 읽기
- realclass
- 운동
- 잡생각
- 영어원서읽기
- 사이드
- FIT XR
- 영어공부
- 매일
- 만화도
- 링피트
- 괜찮음
Archives
- Today
- Total
파비의 매일매일 공부기록
BOJ 17626 - Four Squares #2 본문
지난 시간에 이어 다른 사람의 풀이를 보고 다시 짜 봐도
동일하게 시간 초과가 난다.
그래서 C++로 제출했더니 성공..
아무래도 python에서 list 접근하는 시간이 C++에 비해 더 걸리는 걸로 보인다.
따라서 DP로는 풀기 힘들고, 브루트 포스로 풀어야 한다.
랑그라주의 법칙에 따라 제곱수로 이뤄진 게 4개 초과로 있을 수 없어서
그 조건을 활용해서 소스를 짜면 된다.
1. n이 제곱수인 경우 : 1 출력
2. n이 2개의 제곱수로 이뤄진 경우 : 2 출력
- n의 절반의 제곱근 까지만 순회
- 두 개의 제곱수가 아닌경우 n에서 두개의 제곱수를 뺀 뒤 소수점 이하면 3 출력
- 상기의 조건에 걸리지 않으면 4 출력
상기의 내용을 코드로 옮기면 다음과 같다.
def solve(n):
if int(n ** 0.5) ** 2 == n:
return 1
ar = []
for i in range(1, int((n // 2) ** 0.5) + 1):
for j in range(1, int((n - i ** 2) ** 0.5) + 1):
if i ** 2 + j ** 2 == n:
return 2
elif (n - i ** 2 - j ** 2) ** 0.5 % 1 == 0:
ar.append(3)
else:
ar.append(4)
return min(ar)
print(solve(int(input())))
뭔가 풀이를 보고 풀긴 했지만
찝찝한 마음이 남는 문제였다.. 그냥 DP로 했을 때 통과되었으면 좋았을 텐데 아쉽!
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
BOJ 2670 - 연속부분최대곱 (0) | 2021.07.27 |
---|---|
BOJ 15489 - 파스칼 삼각형 (0) | 2021.05.15 |
BOJ 17626 - Four Squares #1 (0) | 2021.02.02 |
BOJ 2858 - 기숙사 바닥 (0) | 2021.01.28 |
[Week of Line Sweep] BOJ 2594 (0) | 2021.01.23 |
Comments