## 4375번: 1
#### 2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.
# 값 입력받기 (try-except 구문)
while True:
try:
n = int(input())
except:
break
result = 0 # 나머지 연산의 결과
i = 1 # 한자릿수(1로만 이루어진 n의 배수) 부터 시작
while True:
result = result*10 + 1
result %= n
if result == 0:
print(i)
break # while 문 빠져나오기
i += 1
3
3
7
6
9901
12
def recursive(N, result): # 재귀함수로 짜본 코드 -> 살짝 돌아가다가 "런타임 에러 (RecursionError)" 뜸
if (result % N) == 0:
return len(str(result))
return recursive(N, (result*10 + 1))
while True:
try:
n = int(input())
except:
break
print(recursive(n, 1%n))
3
3
7
6
9901
12
7
7
c = int(input())
l = input().split()
small = l[:c//2]
large = l[c//2:]
print(map(int, l))
2
2 4
<map object at 0x7ffb06ab0390>
c = int(input())
l = list(map(int, input().split()))
small = l[:c//2]
large = l[c//2:]
print(small[0]*large[-1])
2
2 4
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-31-cb2bf6ac180e> in <module>()
1 c = int(input())
2
----> 3 l = list(map(int, input().split()))
4
5 small = l[:c//2]
TypeError: 'map' object is not callable
## 1037번: 약수
#### 어떤 수 N의 진짜 약수가 모두 주어질 때, N을 구하는 프로그램을 작성하시오.
c = int(input())
l = list(map(int, input().split()))
print(min(l) * max(l))
자연수 A의 약수의 합은 A의 모든 약수를 더한 값이고, f(A)로 표현한다. x보다 작거나 같은 모든 자연수 y의 f(y)값을 더한 값은 g(x)로 표현한다. 자연수 N이 주어졌을 때, g(N)을 구해보자.
## 17427번: 약수의 합 2
#### 자연수 A의 약수의 합은 A의 모든 약수를 더한 값이고, f(A)로 표현한다. x보다 작거나 같은 모든 자연수 y의 f(y)값을 더한 값은 g(x)로 표현한다. 자연수 N이 주어졌을 때, g(N)을 구해보자.
# 시간 복잡도 : O(N)
n = int(input())
g_x = 0 # 모든 자연수의 약수의 합
for i in range(1, n+1): # O(N)
g_x += n * (n//i) # O(1)
print(g_x)
자연수 A의 약수의 합은 A의 모든 약수를 더한 값이고, f(A)로 표현한다. x보다 작거나 같은 모든 자연수 y의 f(y)값을 더한 값은 g(x)로 표현한다. 자연수 N이 주어졌을 때, g(N)을 구해보자.
## 17425번: 약수의 합
#### 자연수 A의 약수의 합은 A의 모든 약수를 더한 값이고, f(A)로 표현한다. x보다 작거나 같은 모든 자연수 y의 f(y)값을 더한 값은 g(x)로 표현한다. 자연수 N이 주어졌을 때, g(N)을 구해보자.
# 시간 복잡도: O(NlogN) + O(T)
# 1) d[]와 s[] 만들기
MAX = 1000000
d = [1] * (MAX+1) # f_x
s = [0] * (MAX+1) # g_x
for i in range(2, MAX+1): # '배수' 원리를 이용
j = 1 # 인덱스
while i*j <= MAX:
d[i*j] += i
j += 1 # 인덱스
for i in range(1, MAX+1):
s[i] = s[i-1] +d[i]
# 2) Testcase에 맞게 출력
T = int(input())
ans = [] # 시간 초과 방지를 위한 답 출력 방식
for _ in range(T):
n = int(input())
ans.append(s[n])
#print('\n'.join(map(str, ans))+'\n')
print('\n'.join(map(str, ans))) # '\n' 로 이어 붙이기
MAX = 10
d = [1] * (MAX+1) # f_x
s = [0] * (MAX+1) # g_x
for i in range(2, MAX+1): # '배수' 원리를 이용
j = 1 # 인덱스
while i*j <= MAX:
d[i*j] += i
j += 1 # 인덱스
for i in range(1, MAX+1):
s[i] = s[i-1] +d[i]
print(d)
print(s)
[1, 1, 3, 4, 7, 6, 12, 8, 15, 13, 18]
[0, 1, 4, 8, 15, 21, 33, 41, 56, 69, 87]
ans = [1,
4,
87,
4065,
82256014]
print('\n'.join(map(str, ans)))
1
4
87
4065
82256014
## 재귀함수로 유클리드 호제법 구현해보기 (파이썬 버젼)
#### GCD(a, b) = GCD(b, r) (* r = a % b)
def recursive(a, b):
if b == 0:
return a
return recursive(b, a%b)
recursive(24, 16)
8
## 2609번: 최대공약수와 최소공배수
#### 두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.
def recursive(a, b): # GCD(최대공약수) 찾는 재귀함수
if b == 0:
return a
return recursive(b, a%b)
# 문제 입력 및 출력
a, b = map(int, input().split())
print(recursive(a, b))
print(a * b // recursive(a, b)) # LCM(최소공배수)는 GCD * (a/GCD) * (b/GCD) 임을 이용
#### (주의) 파이썬 나눗셈 / 아니고 //
## 유형 1 - 소수 찾기 판별법 중 시간복잡도 O(루트 N) 구현해보기
#### (2 ~ 루트 N) 중 약수가 없음을 확인
import math
def prime(n):
if n < 2: # (예외 처리) 1은
return False # 소수가 아님
for i in range(2, int(round(math.pow(n, 0.5), -1))):
if (n % i) == 0: # 중간에 약수가 존재한다면
return False # 소수가 아님
else: # 무사히 다 돌았다면
return True # 소수가 맞음
prime(100)
False
prime(7)
True
prime(2)
True
prime(17)
True
n = 100
int(round(math.pow(n, 0.5), -1))
10
## 1978번: 소수 찾기
#### 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
def is_prime(n):
if n < 2: # (예외 처리) 1은
return False # 소수가 아님
i = 2
while i*i <= n: # 파이썬 for문 대신 while문으로 표현 가능 (2 ~ 루트N 까지 약수인지 확인)
if (n % i) == 0: # 중간에 약수가 존재한다면
return False # 소수가 아님
i += 1
#else: # 무사히 다 돌았다면
return True # 소수가 맞음
# 문제 입력 & 출력
num_count = int(input())
num_list = list(map(int, input().split()))
ans = 0
for num in num_list:
if is_prime(num):
ans += 1
print(ans)
## 유형 2 - 범위 내 소수 모두 찾기
MAX = 1000000
check = [False] * (1000000+1)
check[0] = check[1] = True # (예외 처리) -> 소수가 아님 -> 지움 처리
i = 1
while i*i <= MAX:
i += 1
if check[i] == False:
j = i+i # j는 i의 배수
while j <= MAX:
check[j] = True # 지움 처리
j += i # 다음 배수
check[2]
False
check[3]
False
check[4]
True
check[17]
False
## 1929번: 소수 구하기
#### M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
# 내가 풀은 정답 (*(2 ~ 루트 N) - while문 이용)
MAX = 1000000
check = [False] * (1000000+1)
check[0] = check[1] = True # (예외 처리) -> 소수가 아님 -> 지움 처리
i = 1
while i*i <= MAX:
i += 1 # (2 ~ 루트 N) 동안 체크
if check[i] == False:
j = i+i # j는 i의 배수
while j <= MAX:
check[j] = True # 지움 처리
j += i # 다음 배수
# 문제 입력 & 출력
m, n = map(int, input().split())
for i in range(m, n+1):
if check[i] == False: # 소수라서 지워지지 않았다면
print(i)
# 선생님 정답 (*(2 ~ 루트 N) - for문 이용 & check 배열 초기화 시 False 대신 숫자 0 사용)
MAX = 1000000
check = [0] * (1000000+1)
check[0] = check[1] = True # (예외 처리) -> 소수가 아님 -> 지움 처리
for i in range(2, MAX+1): # (2 ~ 루트 N) 동안 체크
if not check[i]: # False
j = i+i # j는 i의 배수
while j <= MAX:
check[j] = True # 지움 처리
j += i # 다음 배수
# 문제 입력 & 출력
m, n = map(int, input().split())
for i in range(m, n+1):
if check[i] == False: # 소수라서 지워지지 않았다면
print(i)
3 16
3
5
7
11
13
# 선생님 정답 (*(2 ~ 루트 N) - for문 이용)
MAX = 1000000
check = [0] * (1000000+1)
check[0] = check[1] = True # (예외 처리) -> 소수가 아님 -> 지움 처리
for i in range(2, MAX+1): # (2 ~ 루트 N) 동안 체크
if not check[i]: # False
j = i+i # j는 i의 배수
while j <= MAX:
check[j] = True # 지움 처리
j += i # 다음 배수
check[2]
0
check[3]
0
check[4]
True
- 에라토스테네스의 체를 사용한 경우,
어떤 수 N이 소수인지 아닌지 판별하기 위해 루트 N 방법을 사용할 필요가 없다.
- 에라토스테네스의 체의 결과에서 지워지지 않았으면 소수, 아니면 소수가 아니기 때문이다.
-
None
-
숫자 0
-
숫자 0.0...0
-
빈 컨테이너 (ex. 빈문자열, 빈 바이트열, 빈 리스트, 빈 튜필, 빈 딕셔너리 등)
위의 상황을 제외하면 모두 True로 인식됩니다.
bool(0)
False
bool()
False
bool(1) # True ..
True
bool(0.0)
False
## 6588번: 골드바흐의 추측
#### 백만 이하의 모든 짝수에 대해서, 이 추측을 검증하는 프로그램을 작성하시오.
MAX = 1000000
check = [0] * (1000000+1)
check[0] = check[1] = True
prime = [] # 소수만 담을 리스트 배열
for i in range(2, MAX+1):
if not check[i]: # False라면 = 아직 지워지지 않은 가장 작은 소수라면
prime.append(i)
j = i+i # i의 배수
while j <= MAX:
check[j] = True # 1.배수 지우고
j += i # 2.다음 배수로 넘어가기
prime = prime[1:] # 2는 짝수 소수이므로, 3부터 시작
# 문제 입력 & 출력
while True:
n = int(input())
if n == 0: # 입력의 마지막 줄에는 0이 주어진다. (즉, 종료 flag)
break
for p in prime: # A + B = N
if check[n-p] == False: # 소수인지 체크
print("{0} = {1} + {2}".format(n, p, n-p)) # N = A + B
break # 다음 입력을 받기 위한 for문 빠져나오기
- 2보다 큰 모든 짝수는 두 소수의 합으로 표현 가능하다.
(응용: 3을 더하면, *5보다 큰 모든 홀수는 세 소수의 합으로 표현가능하다.)
- 아직 증명되지 않은 문제이나, 10^18 이하에서는 참인 것이 증명되어 있다.