Q. 문제

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

상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.

이런 상근이를 불쌍하게 보던 창영이는 자신이 사용하는 방법을 추천해 주었다.

바로 "45분 일찍 알람 설정하기"이다.

이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.

현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.

 

예제 입력 

0 30

예제 출력

23 45

 

새롭게 정리한 사실

1.문자열.split( )

사용했을 때, 자동으로 list 안에 값들을 담아준다. 문자열만 쪼갤 수 있다.

input_time=int(input())
hour=input_time.split(' ')[0]

바보 같이 이렇게 실행했다가 오류났는데, int안에 있는 여백은 쪼갤 수 없어 ..!

 

2. python 내장 map() 함수

- 사용하는 때 : 공백으로 구분된 여러가지 값을 입력 받고, list에 담아서 차례대로 인덱싱을 활용해 변수들에 매칭해줄 때. 게다가 type을 변환해줄 때

items = input().split(' ')
#사용자가 '255 255 255 255'를 입력했을 때
item1 = int(items[0])
item2 = int(items[1])
item3 = int(items[2])
item4 = int(items[3])

이렇게 하지 않고, 입력값을 바로 변환하여 list에 담거나

 

a=list(map(자료형, input().split(' ')))

print(a)

#[1, 2, 3, 4, 5]

 

각각의 단어에 매칭시켜줄 수 있다.

a, b, c, d, e = map(int, input().split(' '))

#사용자가 1 2 3 4 5 입력하면

print(a)
#결과 : 숫자 1

 

따라서 이번 문제의 코드도

input_time=input().split()
hour=int(input_time[0])
min=int(input_time.split[1])

이렇게 세 줄의 코드를, 다음과 같이 1 줄로 만들어줄 수 있었다.

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

 

최종 결과 코드

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

sum_M=H*60+M-45

new_H=sum_M//60
if (new_H < 0):
    new_H= 24+new_H
new_M=sum_M%60

print(new_H)
print(new_M)

Q. 첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0), 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)

 

일단 처음 작성한 코드

x와 y의 범위를 모두 고려하여 작성하였다. 0이 되면 안된다는 조건이 있기 때문에 조금 지저분하게 범위가 작성되었다.

input_x=int(input())
input_y=int(input())

if (input_x>0 and input_x<=1000):
    if(input_y>0 and input_y<=1000):
        print(1)
    elif(input_y>=-1000 and input_y<0):
        print(4)
elif(input_x>=-1000 and input_y<0):
    if(input_y>0 and input_y<=1000):
        print(2)
    elif(input_y>=-1000 and input_y<0):
        print(3)

처음에 작성했을 때,

또 함수도 없는데 return 쓰고 있어서 진짜 바보인가 싶었다.

그래도 이제는 안틀릴 것 같다.

 

다른 사람들의 코드를 참고해서 공부해보고 온 결과 ...

문제에서 x와 y는 -1000와 1000사이지만 0은 아닌 수라는 조건을 줬는데, 이런 숫자 조건들은 다 무시하는지 모르겠다.

알아봐야겠다.

 

 

어쨌든 최대한 간결하게 다시 작성해보면,

x=int(input())
y=int(input())

if (x>0 and y>0):
    print(1)
elif (x<0 and y>0):
    print(2)
elif (x<0 and y<0):
    print(3)
else :
    print(4)

 

참고로, x=int(input())과 같은 식으로 작성하면, 문자를 작성했을 때 오류가 뜬다고 한다. 우리가 관리할 때 편한 것 뿐만 아니라, 입력 받는 자료형까지 지정해버리는 것이었다.

이 문제는 어떤 언어를 공부하던지 간에, 항상 나오는 것 같다.

분명 옛날 옛적, 한국에 코딩 교육이 들어온지 얼마 안됐을 때 만들어졌고

지금까지도 활용되는 문제인 것이 분명하다.

'제발 그만 좀 나와!' 가 아니고, 나와도 이제는 아무렇지 않게 풀 수 있을 수 있도록 문제를 완전히 풀어버리겠다.

Q. 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.
조건) 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.

예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다.
1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다.
하지만, 2000년은 400의 배수이기 때문에 윤년이다.

입력) 첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.

*윤년 : 2월 29일이 존재하는 달

 

1. 코드 작성

input_year=int(input())
if (input_year%4==0 and input_year%100!=0 or input_year%400==0):
  return 1
else :
  return 0

계속 'return' outside function 오류가 난다.

 

으악 함수가 없는데 무슨 return이야... 조건문에서는 return을 쓰지 않아...

return은 함수에서만 사용 된다.

 

수정해보자.

 

input_year=int(input())
if (input_year%4==0 and input_year%100!=0) or (input_year%400==0):
  print(1)
else :
  print(0)

맞았다! 연산자를 사용할 때 괄호로 적절히 순서를 구분하는 것 잊지 말자.

 

바보 같은 실수와 함께 교훈도 얻었고,

코드도 짧게 잘썼다는 칭찬을 하게 된 문제.

 

2. python 에서의 나누기 관련 연산자

/ 기본 float형 나눗셈
// 몫
% 나머지
a, b = divmod(c, d) : 몫과 나머지를 튜플 형식으로 가지고 옴

+ Recent posts