공부를 하는데 문제를 보고 뭔지는 알겠고 감은 오지만 가장 근본적인 문제(속성에 값을 어떻게 할당하고 활용해야하나)에
부딪혀 문제를 풀지도 못하고 바로 팁부터 찾게된 문제이다.
문제
표준 입력으로 시:분:초 형식의 시간이 입력됩니다.
다음 소스 코드에서 Time 클래스를 완성하여 시, 분, 초가 출력되게 만드세요.
from_string은 문자열로 인스턴스를 만드는 메서드이며 is_time_valid는 문자열이 올바른 시간인지 검사하는 메서드입니다.
시간은 24시까지, 분은 59분까지, 초는 60초까지 있어야 합니다.
정답에 코드를 작성할 때는 class Time:에 맞춰서 들여쓰기를 해주세요.
class Time:
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
__________________________________________________________
__________________________________________________________
__________________________________________________________
__________________________________________________________
__________________________________________________________
__________________________________________________________
__________________________________________________________
__________________________________________________________
__________________________________________________________
time_string = input()
if Time.is_time_valid(time_string):
t = Time.from_string(time_string)
print(t.hour, t.minute, t.second)
else:
print('잘못된 시간 형식입니다.')
예시 입력값과 결과
#입력
23:35:59
#결과
23 35 59
#입력
12:62:43
#결과
잘못된 시간 형식입니다.
***정적메서드와 클래스메서드가 있지만 무지성 클래스메서드를 남발하였다.
why? 클래스메서드는 활용가능한 요소들이 정적메서드보다 더 많기때문이다.
나의 해석 먼저 첫번째로 가장 하위 코드로 접근했다
if Time.is_time_valid(time_string):
t = Time.from_string(time_string)
print(t.hour, t.minute, t.second)
else:
print('잘못된 시간 형식입니다.')
Time.is_time_valid(time_string)은 올바른 시간인지 검사하는 메서드라고 하였다
그래서 이 메서드는 return이 True가 되게 할려고했다.
나의 해석
@classmethod
def is_time_valid(cls,time_string):
hour,minute,second = map(int,time_string.split(':'))
if hour <= 24 and minute <=59 and second <=60:
return True
시:분:초 로 들어오는 입력값을 ':'기준으로 스플릿으로 분리후 정수로 변환후 3변수에 나눠 놓았다.
틀린 해석은 아니였다. 결국 True & False 판별할수 있는 함수를 생성했다.
정답
@classmethod
def is_time_valid(cls,time_string):
hour,minute,second = map(int,time_string.split(':'))
return hour <= 24 and minute <=59 and second <=60
굳이 if 문을 쓰지않아도 앞에 return을 사용하면 알아서 True&False 를 판별하고 반환한다.
두번째로 접근한 코드
if Time.is_time_valid(time_string):
t = Time.from_string(time_string)
print(t.hour, t.minute, t.second)
else:
print('잘못된 시간 형식입니다.')
t = Time.from_string(time_string)은 문자열로 인스턴스를 만드는 메서드이다.
인데 뭔소린지 도통 못알아 들었다.
이때 나는 아래와 위에 코드를 잘 보았어야했다.
class Time:
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
#~~~~~~~~~
print(t.hour,t.minute,t.second)
인스턴스 속성에서 뽑아서 프린트를 해야했다.
결국 입력값인 time_string('시:분:초')을 __init__(self,hour,minute,second) 형식에 맞게 반환값을 줬어야했다.
즉
t = Time.from_string(시,분,초)
이 값을 충족해야 했다.
정답
사실 여기서 막혀서 힌트를 본것이기 때문에 정답을 먼저 공유해본다.
@classmethod
def from_string(cls,time_string):
hour,minute,second = map(int,time_string.split(':'))
time = cls(hour,minute,second)
return time
먼저 역시나 클래스 메서드로 사용하였다.(이경우에는 클래스메서드를 사용하는것이 유의미하다.)
위와 똑같이 map(int,)로 3변수에 나눠서 정수로 입력한후에
time = cls(hour,minute,second)로 인스턴스를 생성후에
time 인스턴스를 반환하였다.
이로 인해
class Time:
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
이 인스턴스 속성에 값이 할당되었다.
나의 오류
먼저 이부분은 내가 시행착오를 격는게 아닌 답을보고 완성후 새로운 접근법으로 오류를 보는 형식이다.
@classmethod
def from_string(cls,time_string):
hour,minute,second = map(int,time_string.split(':'))
return cls(hour,minute,second)
이경우 return으로 바로 3값을 반환한것인데
이경우에는 인스턴스가 생성되지 않아 위의 인스턴스 속성을 사용할 수 없는것으로 보인다.
이경우 '잘못된 시간 형식 입니다.'가 출력된다..
이유가 뭘까?
아주 긴 오류
class Time:
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
@classmethod
def from_string(cls,time_string):
hour,minute,second = map(int,time_string.split(':'))
time = cls(hour,minute,second)
return time
@classmethod
def is_time_valid(cls,time_string):
cls.hour <= 24 and cls.minute <=59 and cls.second <=60
#요 위에 코드가 오류코드
time_string = input()
if Time.is_time_valid(time_string):
t = Time.from_string(time_string)
print(t.hour, t.minute, t.second)
else:
print('잘못된 시간 형식입니다.')
나의 생각으로는 위에 time = cls(hour,minute,second)로 인스턴스를 생성했는데
그걸 바로 아래 클래스메서드로 활용하면 안될까?
였지만 안되나보다...
Traceback (most recent call last):
File "/Users/jingkwanjung/Documents/python/클래스속성.py", line 22, in <module>
if Time.is_time_valid(time_string):
File "/Users/jingkwanjung/Documents/python/클래스속성.py", line 16, in is_time_valid
cls.hour <= 24 and cls.minute <=59 and cls.second <=60
AttributeError: type object 'Time' has no attribute 'hour'
이런 오류가 발생한다.
'Python > Python 문제' 카테고리의 다른 글
(3)별로 사각형 간단하게 그리기 (0) | 2022.05.06 |
---|---|
(2)포켓몬 종류 찾기 (리스트 & 세트) (0) | 2022.05.06 |
생애 첫 코딩테스트 문제 (0) | 2022.04.28 |
(2)2차원리스트를 활용하여 순서대로 숫자 작성하기 (0) | 2022.04.01 |
(1)Python 으로 지뢰 찾기 만들기 (0) | 2022.03.30 |