2022.06.21

[코딩테스트 - Python] 백준알고리즘 1~5단계 문제 피드백

 

 

 

 

 

백준알고리즘 사이트를 통해 코딩테스트를 준비하면서 각 문제에 대한 저의 답안과 그에 대한 피드백을 글로 정리하였습니다.

모든 문제를 하나씩 다 풀어보기에는 문제의 수가 너무 많아서 각 단계별로 가장 정답 비율이 낮은 문제만 풀어보았습니다.

 

 


 

 

1단계 문제: 1008번. A/B

A, B = input().split()
print(int(A)/int(B))

 

  • A, B = map(int, input().split()) : 더 쉽게 입력받을 수 있음

 

 

 

 

 

2단계 문제: 2884번. 알람 시계

H, M = map(int, input().split())

if M >= 45:
    M = M - 45
    print(H, M)
else:
    if H == 0:
        H = 23
    else:
        H = H - 1
    M = M + 15
    print(H, M)

 

더 간단한 코드

 

H = ( H + (M-45)//60 ) % 24
M = (M-45) % 60

 

  • // : 나누기 연산 후 소수점 이하의 수를 버리고, 정수 부분의 수만 구함 (ex. 33 // 5 = 6, -3 // 6 == -1)
  • % : 나누기 연산 후 몫이 아닌 나머지를 구함 (ex. 33 % 5 = 3)

 

 

 

 

 

3단계 문제: 10951번. A+B - 4

while True:
    try:
        A, B = map(int, input().split())
        print(A + B)
    except EOFError:
        break

 

더 간단한 코드

 

import sys

for line in sys.stdin:
    print(sum(map(int, line.split())))

 

  • for line in sys.stdin : 여러 줄을 입력받음
  • sys.stdin.readline() : 한 줄을 입력받음

 

input()과 sys.stdin 비교: sys.stdin이 더 빠름

- input() : 개행문자를 벗겨냄 => 문자열로 변환 => return (내장함수)

- sys.stdin : 사용자의 입력을 받는 buffer를 만듦 => 그 buffer에서 읽어들임 (file object)

 

 

 

 

 

4단계 문제: 4344번. 평균은 넘겠지

C = int(input())

for c in range(C):
    A = input().split()
    N = int(A[0])
    A = A[1:len(A)]

    sum, plus_num = 0, 0
    for i in A:
        sum = sum + int(i)
    average = sum / N

    for i in A:
        if int(i) > average:
            plus_num = plus_num + 1
    print('{0:.3f}%'.format(plus_num / N * 100))

 

  • C = int(sys.stdin.readline())
  • A = list(map(int, sys.stdin.readline().split()))

 

pop() : 리스트에서 x번째 요소를 돌려주고 삭제

a = [1, 2, 3]

a.pop() => 3

a => [1, 2]

a. pop(0) => 1

 

 

 

 

 

5단계 문제: 4673번. 셀프 넘버

A = []

for i in range(1, 10):
    if i % 2 == 1:
        A.append(i)

for i in range(10, 100):
    A.append(i)
    for j in range(i - 18, i):
        if j + j//10 + j%10 == i:
            A.pop()
            break

for i in range(100, 1000):
    A.append(i)
    for j in range(i - 27, i):
        if j + j//100 + (j//10)%10 + j%10 == i:
            A.pop()
            break

for i in range(1000, 10001):
    A.append(i)
    for j in range(i - 36, i):
        if j + j//1000 + (j//100)%10 + (j//10)%10 + j%10 == i:
            A.pop()
            break

for i in A:
    print(i)

 

내 생각은 다음과 같았음.

(각 자리 숫자의 값을 더한 합) <= (9*수의 자릿수)

각 수와 비교해야 될 값의 범위는 { x-(9*수의 자릿수) ~ x-1 } 임

따라서 수를 자릿수별로 나눠 코드 작성

 

 

더 간단한 코드 (1)

 

def d(n):
    return n + n//1000 + (n%1000)//100 + (n%100)//10 + n%10

x = set()
for i in range(10000):
    x.add(d(i))
for i in range(1,10000):
    if i not in x:
        print(i)

 

1부터 하나씩 다 해본 후 포함되지 않는 값만 출력하는 게 훨씬 빠름

 

  • set() : 집합 함수

 

 

더 간단한 코드 (2)

 

X = [True]*10036

for i in range(10000):
    X[(i + i//1000 + (i%1000)//100 + (i%100)//10 + i%10)] = False

for i in range(10000):
	if X[i]:
		print(i)

 

  • X = [True]*10036 : 10000이 아니라 10036임.

10000으로 설정하면 out of index가 됨. 9999일 때, 9999+9+9+9+9로 10035가 되는 것을 고려함.

 

 

 

 

 

 

복사했습니다!