Coding/Baekjoon

[백준] 단계별로 풀어보기 - 2. if문 (python3) (2884)

jir4vvit 2022. 1. 5. 19:22

 

 

 

2. if문에서 푸는데 가장 어려움(?)이 있었던 문제 하나만 가져왔다. (앞으로 이런식으로 각 단계에서 개인적으로 풀이하는데 가장 어려움이 있는 문제만 가져오려고 한다 ㅇㅁㅇ)

 

그리고 이 문제를 풀면서 새롭게 알게된 것도 있고 해서 같이 정리해보려고 한다.


2884번 알람 시계 (링크)

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net

입력과 출력

풀이

import sys

h,m = map(int,sys.stdin.readline().split()) # [1], [2]

# 첫 입력 검증
if (h<0 or 23<h) or (m<0 or 60<m):
    sys.exit()

# 45분 빼고 출력
m = m-45
if m >= 0: # [3]
    print(h, m)
elif m < 0:
    m = m+60
    h = h-1
    if h < 0:
        print(23, m)
    else:
        print(h, m)

코드를 작성하기 전에 내가 고려한 것들은 아래와 같다.

  1. 입력 값 범위 검증
  2. 분에서 45를 뺐을 때 음수라면? => 분에 60을 더해주고, 한시간 전으로 가기
  3. 이 때 0시에서 뒤로 갈 때 -1시가 아니라 23시여야 함

 

[1] sys.stdin.readline()

원래 사용자로부터 입력을 받을 때, input 함수를 사용했었다. 이거 대신에 sys를 import 해서 sys.stdin.readline()을 쓰는 거다.

 

tmi

더보기

tmi를 하나 뿌리자면.. python2 에 한정해서 사실 input 함수는 사용을 지양해야 한다.

그 이유는 input 함수는 eval(raw_input(prompt) 로 실행되기 때문

python3에서는 이게 raw_input 함수로 이름이 바뀌었다.

그럼 python3에서 input 함수가 뭐냐? python3에서는 입력받은건 모두 str로 취급되기 때문에 python2의 input 함수에서의 문제같은 건 일어나지 않는다.

 

일단 여기선 간단하게 tmi를 말해보고.. 나중에 보다 더 자세하게 포스팅을 해봐야겠다. 8ㅅ8

 

어떻게 사용하는 걸까?

sys.stdin.readline()은 한 줄 단위로, str으로 입력받기대문에 개행문자까지 들어가게 된다.

예를 들어 정수 하나를 입력받으려면 아래처럼 작성해야 한다.

import sys
n = int(sys.stdin.readline())

 

왜 사용하는 걸까? 

sys.stdin.readline()와 input()의 차이는 속도라고 한다. input이 속도가 조금 더 느려서 백준에서 반복문으로 입력을 받야아 하는 경우 시간초과가 뜰 수도 있다고 한다 ㅇㅅㅇ.. 

input()은 출력할 때 개행 문자를 삭제하고 리턴하는 반면에 sys.stdin.readline()은 그러지 않는다.

아마 이 부분에서 부하가 생기는 것 같다.

아무튼 난 이제 앞으로 sys.stdin.readline()를 사용하려 한다.

 

[2] map

위에서 정수 하나를 입력받으려면 어떻게 해야하는지 살펴봤다. 그런데 .. 지금 이 문제처럼 한 줄에 여러개를 입력받으려면 어떻게 해야할까? 바로 map을 쓰면 된다.

import sys
a,b = map(int,sys.stdin.readline().split())

map이 뭘까?

반복 가능한 객체(리스트 등)에 대해 각각의 요소들을 지정된 함수(여기서는 int)로 처리해주는 함수이다.

split()은 말 그대로 공백을 기준으로 자르는 거니깐.. 

공백을 기준으로 첫번째꺼는 a에 들어가고 두번째꺼는 b에 들어가는데 int로 형변환이 된다.

 

[3] 나의 실수

처음에 여기서 실수를 했었다 ㅋㅋ ㅠ

코딩할 때 분에서 45분을 뺐을때 양수와 음수인 경우만 고려해주고,,, 0일 때를 고려를 안해주었었다.

그래서 테스트케이스로 '1 45'를 넣으면 그냥 결과가 출력이 안되었었다. ('1 0'이 출력되어야 한다.)

꼼꼼함이 좀 필요한 것 같다..