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가 되는 것을 고려함.
'코딩테스트' 카테고리의 다른 글
[코딩테스트, Python] 프로그래머스 '소수 만들기' 문제 피드백 (0) | 2022.06.25 |
---|---|
[코딩테스트, Python] 프로그래머스 '완주하지 못한 선수' 문제 피드백 (Feat. Hash Table) (0) | 2022.06.24 |
[코딩테스트, Python] 프로그래머스 '신규 아이디 추천' 문제 피드백 (0) | 2022.06.24 |
[코딩테스트, Python] 프로그래머스 '신고 결과 받기' 문제 피드백 (0) | 2022.06.23 |
[코딩테스트, Python] 백준알고리즘 6~10단계 문제 피드백 (0) | 2022.06.21 |