15596: 정수 N개의 합
# 15596: 정수 N개의 합
def solve(a):
ans = 0
for i in a :
ans += i
return ans
# 4673: 셀프 넘버
## idea.1 : 집합(set)은 중복된 원소를 허용하지 않는다.
## idea.2 : 전체 수 집합에서 self number가 아닌 경우를 소거해나간다.
N_set = set(range(1, 10001)) # 1부터 10,000까지 숫자
not_selfnum_set = set()
for i in range(1, 10001) :
for j in str(i):
i += int(j)
not_selfnum_set.add(i)
selfnum_set = sorted(N_set - not_selfnum_set)
for number in selfnum_set :
print(number)
4673: 셀프넘버
# 4673: 셀프 넘버
## idea.1 : 집합(set)은 중복된 원소를 허용하지 않는다.
## idea.2 : 전체 수 집합에서 self number가 아닌 경우를 소거해나간다.
N_set = set(range(1, 10001)) # 1부터 10,000까지 숫자
not_selfnum_set = set()
for i in range(1, 10001) :
for j in str(i):
i += int(j)
not_selfnum_set.add(i)
selfnum_set = sorted(N_set - not_selfnum_set)
for number in selfnum_set :
print(number)
1065: 한수
# 1065: 한수
'''등차수열 : 연속된 두수의 차이가 일정'''
# 첫 풀이
N = int(input())
hansoo = set()
for i in range(1, N+1):
for j in range(len(str(i))-1):
if int(str(i)[j]) - int(str(i)[j+1]) == 0 :
hansoo.add(i)
print(len(hansoo))
## 다시 풀기, 연속된 숫자가 일정하지 않는 것을 전체집합에서 소거해서 풀어보기
N = int(input())
all_set = set(range(1, N+1))
generated_set = set()
for i in range(1, N+1):
for j in range(len(str(i))-1):
if int(str(i)[j]) - int(str(i)[j+1]) != 0 :
generated_set.add(i)
hansoo = sorted(all_set - generated_set)
print(len(hansoo))
'''1,2,3,4,5,6,7,8,9, 11, 22, 33 - - - 99 가 출력이 되었음. 조건을 다르게 설정해보자'''
### 다시풀기, 위에서 짠 조건은 등차가 0인 등차수열이였음. 등차가 0말고 일정하다는 것을 포함하는 코드로 짤 것
N = int(input())
all_set = set(range(1, N+1))
generated_set = set()
for i in range(1, N+1):
for j in range(len(str(i))-1):
if int(str(i)[j]) - int(str(i)[j+1]) != int(str(i)[j+2]) - int(str(i)[j+1]) :
generated_set.add(i)
hansoo = sorted(all_set - generated_set)
print(len(hansoo))
#### 다시풀기, 6 lines 당연히 인덱스 초과 오류
N = int(input())
all_set = set(range(1, N+1))
generated_set = set()
for i in range(1, N+1):
for j in range(len(str(i))-1):
if int(str(i)[j]) - int(str(i)[j+1]) == int(str(i)[j+2]) - int(str(i)[j+1]) :
generated_set.add(i)
hansoo = sorted(all_set - generated_set)
print(len(hansoo))
##### 다시풀기
N = int(input())
result = []
for i in range(1, N+1):
if i < 100 :
result.append(i)
else :
for j in range(len(str(i))-2):
if int(str(i)[j]) - int(str(i)[j + 1]) == int(str(i)[j + 2]) - int(str(i)[j + 1]):
result.append(i)
print(len(result))
###### 다시풀기
N = int(input())
result = []
for i in range(1, N+1):
if i < 100 :
result.append(i)
elif i < 1000 :
for j in range(len(str(i))-2):
if int(str(i)[j + 1]) - int(str(i)[j]) == int(str(i)[j + 2]) - int(str(i)[j + 1]):
result.append(i)
else :
for j in range(len(str(i))-3):
if int(str(i)[j + 1]) - int(str(i)[j]) == int(str(i)[j + 2]) - int(str(i)[j + 1]):
result.append(i)
print(len(result))
'''6트만에 풀었다. 네자릿수 이상의 else 파트는 옳은건지..?'''
## 다른 풀이
### 한수의 개수를 파악하는 함수 풀이
num=0
def Hansu(x):
global num
if (x//100-x%100//10)-(x%100//10-x%10)==0:
num+=1
N=int(input())
for i in range(1, N+1):
if i<100:
num+=1
else:
Hansu(i)
print(num)
## 다른 풀이, 내풀이의 깔끔한 코드 버전
num = int(input())
hansu = 0
for n in range(1, num + 1):
if n <= 99: # 1부터 99까지는 모두 한수
hansu += 1
else:
nums = list(map(int, str(n))) # 숫자를 자릿수대로 분리
if nums[0] - nums[1] == nums[1] - nums[2]: # 등차수열 확인
hansu += 1
'''idea.1 : 숫자 자릿수별로 구간을 나눈다.
idea.2 : 등차수열 : d = a3 - a2 = a2 - a1 (단, a1이 첫항)
'''
마지막 부분만 보시면 됩니다.
오늘 설명이 많이 안써있는데, 내일 시간나면 제가 풀었을때 어떻게 생각하고 풀었는지 자세히 작성해드릴게요.
한수와 셀프 넘버에 많은 시간을 들였습니다. ㅠㅠ
'매일매일 (Everyday)' 카테고리의 다른 글
[BOJ] - 문자열 - (2) - Python (0) | 2021.12.02 |
---|---|
[BOJ] - 문자열 - (1) - Python (0) | 2021.12.01 |
[BOJ] - 1차원 배열 단계-(2) - Python (0) | 2021.11.29 |
[BOJ] - 1차원 배열 단계-(1) - Python (0) | 2021.11.26 |
[BOJ] - while문 - Python (0) | 2021.11.25 |