일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Daemon
- Spring-Boot
- pipex
- ecole42
- django #ninja #django-ninja #장고
- dockerd
- 42
- docker
- Spring
- data-root
- 데이터중심애플리케이션설계
- Born2beroot #42
- nestjs
- 네스트JS
- 42Seoul
Archives
- Today
- Total
혼자 정리
17626번: Four Squares 본문
C++
#include <iostream>
using namespace std;
int arr[50001];
void find(int N)
{
arr[0] = 0;
arr[1] = 1;
for (int i = 2; i <= N; i++)
{
arr[i] = arr[i - 1] + 1;
for (int j = 1; j * j <= i; j++)
{
if (arr[i] >= arr[i - j * j] + 1)
arr[i] = arr[i - j * j] + 1;
}
}
cout << arr[N] << "\n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
find(N);
}
Python
import math
import sys
input = sys.stdin.readline
arr = [0] * 50001
N = int(input())
arr[1] = 1
for i in range (2, N + 1):
arr[i] = arr[i - 1] + 1
for j in range (1, int(math.sqrt(i))+1):
if arr[i] > arr[i - j * j] + 1:
# print(i, j)
arr[i] = arr[i - j * j] + 1
print(arr[N])
- 모든 제곱수는 한 개의 제곱수로 나타내어질 수 있다는 것을 파악하는 것이 관건이었다.
- $O(N^{3/2})$의 시간 복잡도로 풀었다. ($N * \sqrt{N}$?)
- 파이썬에서 기존 c에서와 같은 for문은 안 되므로 굳이 그런 형태를 원한다면 while문을 써야 하려나?
- Python3에서는 시간초과, pypy3에서는 통과했다. pypy에서는 그만큼 메모리를 더 많이 먹는다는 얘기가 있는 것 같다. 또 간혹 python3가 더 빠른 경우도 있다고 한다. 나중에 차이에 대해 조금 더 알아봐야할 것 같다.
- 실제 코딩테스트에서는 파이썬에 그만큼 시간 메리트를 더 준다고 하는데 그 득실이 얼만큼 되는지 나중에 알아보기. 물론 그 전에 조금 더 효율적인 알고리즘을 짜는 것이 필요하겠지만..
- 파이썬에 대해 그때그때 필요한 문법만 찾아보고 있는데 조금 효율적이지 못한 것 같다. 아무리 코테를 위한 파이썬이라지만 pythonic한 코드 작성을 위한 최소한의 공부가 필요하지 않나 싶다.
'알고리즘 문풀 > 백준' 카테고리의 다른 글
11726번: 2×n 타일링 (0) | 2021.07.19 |
---|---|
9095번: 1, 2, 3 더하기 (0) | 2021.07.18 |
11723번: 집합 (0) | 2021.07.16 |
1620번: 나는야 포켓몬 마스터 이다솜 (0) | 2021.07.15 |
5525번: IOIOI (0) | 2021.07.15 |