철수의 아날로그 시계는 시침과 분침이 모두 매초 항상 일정한 속도로 움직인다고 한다. 즉 1초마다 시침과 분침의 위치가 모두 변한다. 이때 0도 이상 180도 이하의 각도A를 입력하면 하루동안(00:00:00부터 23:59:59) 시침과 분침이 이루는 각도가 A와 일치하는 순간을 모두 출력하는 프로그램을 작성하라.
단 시침과 분침이 이루는 각도는 항상 180도 이하로 환산하여 생각한다. (ex>A가 90이면, 시침과 분침사이 각도가 90도와 270도인 경우 모두 해당된다.)
입력되는 A는 정수이고, 출력되는 시간은 hh:mm:ss형식으로 시간, 분, 초를 모두 2자리 자연수로 출력하되 1자리수인 경우는 앞에 0을 붙여서 출력한다.
def hmangle(a):
[hour,minute,second]=[int(x) for x in a.split(':')]
h=(hour*30+minute/2+second/120)%360
m=(minute*6+second/10)%360
angle=abs(h-m)
if angle<=180:
return angle
else:
return 360-angle
while True:
count=0
angle=eval(input("Input angle (0-180): "))
for hour in range(24):
hour=str(hour)
if len(hour)<2:
hour='0'+hour
for minute in range(60):
minute=str(minute)
if len(minute)<2:
minute='0'+minute
for second in range(60):
second=str(second)
if len(second)<2:
second='0'+second
time=hour+':'+minute+':'+second
if hmangle(time)==angle:
print(time)
count+=1
if count==0:
print("None")
print()
def calcAngle(second, unitSecond):
second2 = second % unitSecond
anglePerSec = float(360 / unitSecond)
angle = 0
if (0 < second2):
angle = anglePerSec * second2
return angle
def getMinuteAngle(second):
return calcAngle(second, 3600)
def getHourAngle(second):
return calcAngle(second, 43200)
def getDiffrenceAngle(second):
hourAngle = getHourAngle(second)
minuteAngle = getMinuteAngle(second)
diffAngle = abs(minuteAngle - hourAngle) % 180
return diffAngle
def printTime(second):
hour, rest = divmod(second, 3600)
min, sec = divmod(rest, 60)
print("{0:02}:{1:02}:{2:02}".format(hour, min, sec))
angle = float(input("Input angle (0-180) : "))
for i in range(0, 86400):
diffAngle = getDiffrenceAngle(i)
if(angle == diffAngle):
printTime(i)
2019年07月05日 13:21
def hour_deg(sec, mins, hours):
deg = (360 / 12) * hours + (360 / 12) * (mins / 60) + (0.5 / 60) * sec
return deg
def min_deg(sec, mins):
deg = (360 / 60) * mins + (6 / 60) * sec
return deg
def clock_degree(deg):
for h in range(0,24):
for m in range(0,60):
for s in range(0,60):
degree = abs(hour_deg(s, m, h) - min_deg(s, m))
if degree == deg:
print(datetime.time(h,m,s).strftime("%H:%M:%S"))
else:
continue
2019年08月07日 07:54
import datetime
while(True):
try:
angle = float(input("각도 입력(0~180°) : "))
if (angle < 0 and angle > 180):
print("0~180°를 입력해주세요.")
except ValueError:
print("숫자를 입력해주세요.")
if angle != None:
break
for i in range(86401) :
m_angle = (i % 3600) * (1/10)
h_angle = (i % 43200) * (1/120)
if abs(m_angle - h_angle) == angle or abs(m_angle - h_angle) == 360 - angle:
print (datetime.timedelta(seconds=i))
2019年08月31日 14:07
#파이썬
#맞게 푼건지 모르겠습니다. Creator님이 22도 되는 시간을 올려 놓으셨던데, 이건 맞게 나옵니다
def time(x): #초로 카운트된 시간을 시:분:초로 출력해주는 함수 (12시간후의 시간도 출력)
hour=x//3600
x-=(hour*3600)
min=x//60
sec=x%60
print('%02d:%02d:%02d' % (hour,min,sec))
print('%02d:%02d:%02d' % (hour+12,min,sec))
a=float(input('각도(0~180)를 입력하시오....'))
for i in range (0,12*3600):
min_angle=round(((i%3600)/3600)*360,3)
hour_angle=round((i/3600/12)*360,3)
diff=round(abs(min_angle-hour_angle),3)
if diff>180:
diff-=180
if diff==a:
time(i)
import time
def clock(angle):
m_hand = 0
h_hand = 0
for j in range(1, 24*60*60+1):
m_hand += 0.1 # 1초마다 분침은 0.1도 이동
m_hand = 0 if int(m_hand) == 360 else round(m_hand, 1)
h_hand += 30/3600 # 1초마다 시침은 30/3600도 이동
h_hand = 0 if int(h_hand) == 360 else h_hand
diff = abs(h_hand - m_hand) if abs(h_hand - m_hand) <= 180 else 360 - abs(h_hand - m_hand)
if float('%0.1f' % diff) == angle:
print('{}'.format(time.strftime('%H:%M:%S', time.gmtime(j))))
if __name__ == '__main__':
angle = int(input('0 ~ 180도 사이의 각도를 입력: '))
clock(angle)
2020年05月24日 00:26
모든 각도를 -180~180으로 보정해서 계산하고 두 각도 차이를 계산하는 함수를 만들어서 입력한 각도와 두 침 사이의 각도의 차이를 매 초마다 추적하여 부호가 바뀌는 순간 0을 통과한 것으로 판단합니다.
"""
시침각도(s) = {(180/6)/3600}*s = (30/3600)*s = s/120
분침각도(s) = {(180/6)/300}*s = s/10
"""
def normalAngle(deg): # 리턴값 범위를 -180<= y <180 으로
while deg>=180.0:
deg -= 360.0
while deg<-180.0:
deg += 360.0
return deg
def diffAngle(sec):
return normalAngle(11*sec/120) # 분침-시침 기준으로 +/- 부호 부여
Deg = int(input('각도(deg)? '))
MDeg = -Deg
ang_prev = diffAngle(Deg-diffAngle(-1))
mang_prev = diffAngle(MDeg-diffAngle(-1))
for s in range(0, 24*3600):
ang = normalAngle(Deg-diffAngle(s))
mang = normalAngle(MDeg-diffAngle(s))
if (abs(ang_prev)<1.0 and abs(ang)<1.0 and (ang_prev*ang<0.0 or ang==0.0)) or \
(abs(mang_prev)<1.0 and abs(mang)<1.0 and (mang_prev*mang<0.0 or mang==0.0)) :
print("{0:02d}:{1:02d}:{2:02d}".format(int(s/3600), int((s%3600)/60), (s%3600)%60))
ang_prev = ang
mang_prev = mang
아래는 0을 입력했을 때 출력
각도(deg)? 0 00:00:00 01:05:28 02:10:55 03:16:22 04:21:50 05:27:17 06:32:44 07:38:11 08:43:39 09:49:06 10:54:33 12:00:00 13:05:28 14:10:55 15:16:22 16:21:50 17:27:17 18:32:44 19:38:11 20:43:39 21:49:06 22:54:33
아래는 90을 입력했을 때 출력
각도(deg)? 90 00:16:22 00:49:06 01:21:50 01:54:33 02:27:17 03:00:00 03:32:44 04:05:28 04:38:11 05:10:55 05:43:39 06:16:22 06:49:06 07:21:50 07:54:33 08:27:17 09:00:00 09:32:44 10:05:28 10:38:11 11:10:55 11:43:39 12:16:22 12:49:06 13:21:50 13:54:33 14:27:17 15:00:00 15:32:44 16:05:28 16:38:11 17:10:55 17:43:39 18:16:22 18:49:06 19:21:50 19:54:33 20:27:17 21:00:00 21:32:44 22:05:28 22:38:11 23:10:55 23:43:39
import datetime
min_spd = 360/(60*60)
hr_spd = 360/(12*60*60)
dgr = float(input())
for i in range(1, 24*60*60+1):
if abs((min_spd*i%360)-(hr_spd*i%360)) == dgr or abs((min_spd*i%360)-(hr_spd*i%360)) == 360 - dgr:
o = str(datetime.timedelta(seconds = i))
if len(o)<8:
o = '0' + o
print(o)
문제의 조건에서 '1초마다' 시침, 분침, 초침의 위치가 변한다고 하였으니 매초 정각마다 시계 바늘들의 위치를 측정하여야 한다고 판단했습니다. 매초 정각이 아닌 초와 초 사이에 특정한 각도를 이루는 경우는 제외됩니다.
A = int(input())
B = 360-A
secs = 86400
for i in range(secs):
h = (i/secs*360*2)%360
m = (i/secs*360*24)%360
if abs(h-m) in [A, B]:
hh = i // 3600
mm = (i - hh*3600) // 60
ss = i - hh*3600 - mm*60
print(f'{hh:02}:{mm:02}:{ss:02}')
1을 입력하면 4개의 시각 04:22:00, 07:38:00, 16:22:00, 19:38:00 가 출력됩니다.
2021年09月22日 11:42
while True:
angle = int(input("각도를 입력하시오"))
if angle>=0 and angle<=180:
break
# 초침 = 6도/초 , 분침 = 0.1도/초, 시침 = 분침/12도 / 초
m=0.1
h=0.1/60
time=[]
for s in range(1,86399):
min=(0.1*s)%360
hour=(0.1/12*s)%360
if abs(hour-min)%180==angle:
time.append(s)
print(time)
for k in time:
print('{0}:{1}:{2}'.format(k//3600,k%3600//60,k%3600%60))
풀이 작성