본문 바로가기
알고리즘 풀이

[algorithm] 페어 - 백준: 25304 영수증

by 째깍단 2023. 4. 27.

답: 

더보기

 

import sys

total = int(sys.stdin.readline()[:-1])
N = int(sys.stdin.readline()[:-1])

for i in range(N):
    a, b = map(int,input().split())
    total -= a*b

print("Yes" if total == 0 else "No")

 

 

 

문제 분석 및 해석

 

영수증의 수상하게 높은 금액!

입력으로 구매한 각 물건의 가격과 개수, 구매한 물건들의 총 금액이 주어질때 비교하여

같으면 Yes, 다르면 No를 출력하자

 

1번째 줄 : 영수증에 적힌 총 금액 X

2번째 줄 : 영수증에 적힌 구매한 물건의 종류 수 N

 

N개의 줄에는 각 물건의 가격 

a와 개수 

b가 공백을 사이에 두고 주어진다.

 

입력 값:

250000

4

20000 5

30000 2

10000 6

5000 8

 

출력:

Yes  /  No

 

 

1) 내가 생각한 풀이

 

주어진 목록 길이 만큼의 input을 준비해준다

 

list에 넣고? 혹은 그냥 sum해주고 비교

(+ total에서 빼서 0이면 Yes)

 

 

 

2) 팀원분이 문제를 제안한 이유..!!

 

import sys

sys.stdin.readline()

input()보다 시간을 덜 쓴다는 readlline() 써보기!

 

 

 

 

 

- 과정1 -

 

문제 이해 후 풀이를 쭉 작성.

 

input() 값을 받고, 목록만큼의 길이를 재어 

각각 상품의 가격과 수량을 받도록 했다.

이후 가격과 수량을 곱한 값을 sum에 입력.

 

 

total = int(input())
N = int(input())
sum = 0

for i in range(N):
    a, b = map(int,input().split())
    sum += a*b

if total == sum:
    print("Yes")
else:
    print("No")

 

 

 

if문을 한줄로 만들기

 

print("Yes" if total == sum else "No")

 

 

 

문제의 시간복잡도가 1초여서 코드를 더 가볍게 만드는 방법을 고민하고, 다른 사람의 풀이를 찾아보았다.

더해서 비교해주는 것도 좋지만 total의 값에서 빼주고, 0과 비교하는 방법이 있다는 것을 알게되었다.

 

if ... :
    total -= a*b

print("Yes" if total == 0 else "No")

 

 

 

 

- 과정2 -  readline을 써서 바꾸기

 

 

입력받는 값들을 readline을 사용하여 받아주었다

 

[:-1] 을 쓴 이유는 개행문자 제거를 위함이다.

readline은 한줄을 입력받는 것이어서 \n 개행문자가 함께 들어간다고 한다.

 

total = int(sys.stdin.readline()[:-1])
N = int(sys.stdin.readline()[:-1])

 

이렇게 적어주면 성공,

 

 

 

 

 

 

sys.stdin.readline()

readline으로 정수 받기 확실하게 알고 가자!

 

 

  • 정수 1개 받기
x = int(sys.stdin.readline())

 

  • 한 줄에 여러개의 정수가 들어간 readline을 list로 받기
numbers = list(map(int,sys.stdin.readline().split()))

 

  • 만약 변수에 받고싶으면 각각의 변수를 넣어주어야함
a, b, c = map(int,sys.stdin.readline().split())

 

 

 

 

 

+ 팀원분의 풀이를  참고하기 위해 넣어둔다.

import sys
input = sys.stdin.readline

x = int(input())
n = int(input())
items = []

for i in range(n):
    a, b = map(int, input().split())
    item = a * b
    items.append(item)

if x == sum(items):
    print("Yes")
else:
    print("No")

 

 

 

 

+분석

코드를 더 간단하게 만들기 위해서 변수에 넣어 정리해줄 수도 있다.

 

input = sys.stdin.readline

 

 

 

 

 

이때 list에 넣어주는 것을 볼 수 있는데,  list에 담으면 개행문자가 보인다고 하여 실험해보았다

 

x = int(input())  # 입력 5
items = []
items.append(x)

print(items) # 출력 [5]

 

리스트에 담긴 정수가 출력된다.

어디에서 개행문자를 없애주는걸지 고민하다 int를 빼보았다.

 

 

 

 

x = input()      #입력 5
items = []
items.append(x)

print(x)  # 5 +개행된 줄이 함께 출력
print(items) #['5\n']

 

터미널에 쓰여진 결과값:

5

['5\n']

 

 

int를 빼고 items 리스트를 출력하면 개행문자가 list에 들어온다!

int로 바꿔줄때 저절로 사라지게 되는 듯 하다.

 

 

readline의 주의점은 터미널에서는 개행문자가 보이지 않는다는 것인데,

int로 감싸 사용할때는 큰 문제가 없겠다는 생각이 들었다^.^

 

 

 

 

 

 

[참고] : sys.stdin.readline()를 더 알아보자!

https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

 

 


느낀점: 

새로운 거 너무 좋아!