SW 마에스트로 준비(4)

백준 문제 푼거 정리

함수 사용하기

4673 셀프넘버

d(n) = n + 각 자리수의 합

몇 가지 방법을 찾아봤다. 전체 숫자 집합에서 생성자가 있는 집합을 빼면 된다. 이렇게 생각하니 방법은 간단하다.

에라토스테네스의 체

소수를 찾아내는 방법 중 하나이다.

key

※ 숫자를 문자로 변환하고 문자 하나하나씩 i에 누적하여 더해주면 각 자리 수의 값을 더한 걸 구할 수 있다.

import sys


def r1(): return sys.stdin.readline()


# 1단계 전체집합 만들기
a = set(range(1, 10001))

# 2단계 생성자 집합 만들기
b = set()

for i in a:
    for j in str(i):
        i += int(j)
    b.add(i)
c = sorted(a-b)

# 3단계 한줄로 출력하기
for i in c:
    print(i)

1065번 한수

양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열이란 연속된 두 개 수의 차이가 일정한 수열을 말한다. 입력 받은 N보다 작은 한수의 개수를 출력해라. ( N<= 1000 자연수)

※ Vacuous truth

어떤 전제에 해당하는 것 자체가 존재하지 않는다면, 그 문장은 무조건 참으로 간주된다는 뜻

따라서 연속된 두 개의 수라는 것 자체가 존재하지 않는다면, 항상 참이다.

따라서 1~9까지. 등차수열. 하나밖에 없으므로 10~99까지 등차수열 따라서 100전까지는 무조건 99개.

생각한 방법

  1. 각 자리 수를 구한다.
  2. 백의자리와 십의자리의 차가 , 십의자리와 일의 자리의 차와 같은지를 구한다. (절댓값으로 구한다) -> 이렇게 하면 반례가 404에서 반례가 생긴다. –> 다른 방법 필요

찾은 방법

입력받은 값을 넣은 리스트를 생성 첫 번쨰 리스트의 세번쨰 자리수 제거 두번째 리스트의 첫번쨰 수 제거 이후 차를 구한 뒤, 각 자리수끼리 같다면 count를 +=1 한다.

리스트 요소 제거 (remove)

revmove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수이다. 여기서는 del을 쓰면 원본이 삭제되므로 간단하다. del을 사용하면 메모리에 생성된 변수를 없앤다.

list

list(s)는 반복 가능한 자료형 s를 입력 받아 리스트로 만들어 리턴하는 함수이다.

※ 이중포문을 쓸 필요가 없다.

지난번 코드를 참조하여

for i in list(str(N)):     
    for j in str(i):
    	list_A.append(j)
print(list_A)

이런 식으로 생각하였지만 이럴 필요가 없다. 사실 int로 입력을 받아서 list_A = list(str(N)) , 즉 list함수를 사용해주면 문제가 해결된다.

이 문제는 어려워서 다른분 풀이 참고하였다. 특히 전체 while문을 얼만큼 돌까에 대한 의문에서, 다른 분은 반복문 조건을 N>0으로 해놓은 뒤 한바퀴 돌때마다 N-=1을 해준점에 착안하여 코드를 작성하였다.

import sys

rl = lambda: sys.stdin.readline()

N = int(rl())

count = 0 # 출력하는 값

while N > 0: # 입력값이 1이상이면 반복
    if(N>100): # 입력값이 100 이상일 때
        list_A = list(str(N))
        list_B = list_A[:]

    # 자리수 맞추기 위해 값 삭제
        del list_A[-1] 
        del list_B[0]
        if( int(list_A[0])-int(list_B[0]) == int(list_A[1]) - int(list_B[1])):
            count+=1
    elif N < 100 : # 1부터 99까지 모두 등차수열이다.
        count+=N
        break
    N -= 1
print(count)

2448번 별찍기 - 11

-> 추후에 다시 풀기

문제분석

3*2의k승

입력 예제 -> 3,6,12,24,48 등. 이 때 k는 k<=10이하)

현 단계 삼각형 두개를 만들어서 뒤에 붙이고 현 단계 삼각형을 오른쪽으로 민다. -> 얼마나 밀거냐?

N=3일 때, 0칸 N=6일 때, 3칸 N=12일 때, 6칸 N=32^이므로, 오른쪽으로 미는 칸 수는 32^(k-1)


참고자료

4673번 문제풀이 참고 https://oneshottenkill.tistory.com/14

4673번 문제풀이 참고 https://zetawiki.com/wiki/BOJ_4673%EC%85%80%ED%94%84%EB%84%98%EB%B2%84

https://m.blog.naver.com/PostView.nhn?blogId=occidere&logNo=220814758752&proxyReferer=https%3A%2F%2Fwww.google.com%2F

1065번 한수 https://www.acmicpc.net/board/view/32637 https://oneshottenkill.tistory.com/15

2448번 문제풀이 참고

https://lazineer.tistory.com/179

0%