본문 바로가기

매일매일 (Everyday)

[BOJ] - 함수 - Python

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이 첫항)
'''

마지막 부분만 보시면 됩니다.

 

오늘 설명이 많이 안써있는데, 내일 시간나면 제가 풀었을때 어떻게 생각하고 풀었는지 자세히 작성해드릴게요.

한수와 셀프 넘버에 많은 시간을 들였습니다. ㅠㅠ