코딩도장

시계바늘사이의 각도

철수의 아날로그 시계는 시침과 분침이 모두 매초 항상 일정한 속도로 움직인다고 한다. 즉 1초마다 시침과 분침의 위치가 모두 변한다. 이때 0도 이상 180도 이하의 각도A를 입력하면 하루동안(00:00:00부터 23:59:59) 시침과 분침이 이루는 각도가 A와 일치하는 순간을 모두 출력하는 프로그램을 작성하라. 
단 시침과 분침이 이루는 각도는 항상 180도 이하로 환산하여 생각한다. (ex>A가 90이면, 시침과 분침사이 각도가 90도와 270도인 경우 모두 해당된다.)
입력되는 A는 정수이고, 출력되는 시간은 hh:mm:ss형식으로 시간, 분, 초를 모두 2자리 자연수로 출력하되 1자리수인 경우는 앞에 0을 붙여서 출력한다.

2019年06月11日 13:37

왕초보

(追記) (追記ここまで)
댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

19개의 풀이가 있습니다. 2 / 2 Page

모든 각도를 -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

2020年12月14日 15:44

김준우

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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)

2021年02月25日 05:47

asdfa

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

문제의 조건에서 '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 가 출력됩니다.

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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))

2022年01月22日 05:08

양캠부부

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

// Rust

// 현재 시각이 h:m:s일 때, 시침의 각도는 30h+m/2+s/120, 분침의 각도는 6m+s/10이므로,

// 각도 차이가 정수가 되기 위해서는 s=0이고, m = 2(30h+a)/11 또는 2(30h-a)/11 이어야 합니다

fn clock_angle() {

let mut a = 0;
if a > 90 { a = 180 - a;}
let mut result = vec![];
for h in 0..12 {
 let z1 = 2 * (30 * h + a);
 let z2 = 2 * (30 * h - a);
 if z1 % 11 == 0 {
 result.push((h, z1 / 11));
 }
 if a != 0 && z2 % 11 == 0 {
 result.push((h, z2 / 11));
 }
}
for i in 0..result.len() {
 if result[i].1 == 60 {
 result[i].0 += 1;
 result[i].1 = 0;
 }
 if a !=0 {
 result.push((result[i].0+12, result[i].1));
 }
}
println!("{:?}", result);

}

2022年01月30日 17:34

JW KIM

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
A = 30
import time
for h in range(24):
 for m in range(60):
 for s in range(60):
 hd = (h%12)*360/12 + m*360/12/60 + s*360/12/60/60
 md = m*360/60 + s*360/60/60
 if abs(hd-md) == A or abs(hd-md) == 360-A:
 t1 = str(h) + ':'+str(m) + ':'+ str(s)
 t2= time.strptime(t1, '%H:%M:%S')
 print(time.strftime('%H:%M:%S', t2)) 
댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
h = 0;m = 0;s = 0
target_angel = int(input("Enter Angel:"))
time_list = []
in_day = ['AM','PM']
for day in in_day:
 for h in range(12):
 for m in range(60):
 for s in range(60):
 minute = m * 6 + s * 0.1
 hour = minute * 0.5 + h * 30
 if int(minute) > int(hour) and int(minute-hour) < 180 and int(minute-hour) == target_angel:
 time = (str(h),"h",str(m),"m",str(s),"s",day)
 time_list.append(time)
 elif int(hour) > int(minute) and int(hour-minute) >= 180 and int(hour-minute) == target_angel:
 time = (str(h),"h",str(m),"m",str(s),"s",day)
 time_list.append(time)
 else: continue
for j in time_list:
 print(" ".join(j))

2023年07月20日 10:49

siu yoon

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def printTime(h, m, s):
 print(" {0:02}:{1:02}:{2:02}".format(h,m,s))
def calHMAngle(h,m):
 cH = h * 30 + m / 2
 cM = m * 6
 angle = abs(cH - cM)
 if angle <= 180:
 return angle
 else:
 return 360 - angle
A = float(input('각도를 입력 하세요(0 ~ 180): '))
for h in range(12):
 for m in range(60):
 if A == calHMAngle(h,m):
 printTime(h,m,0)
 printTime(h+12, m, 0)

2023年08月01日 14:13

insperChoi

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
python 3.8
angle = int(input("시침과 분침이 이루는 각도를 입력(0~180) : "))
for h in range(12):
 for m in range(60):
 for s in range(60):
 s_ang = 6 * s
 m_ang = m * 6 + s_ang / 60
 h_ang = h * 30 + m_ang / 12
 if abs(m_ang - h_ang) in [angle, 360 - angle]:
 print(f"{h:02d}:{m:02d}:{s:02d}")
댓글 작성은 로그인이 필요합니다.
30도를 입력하면 01:00:00과 11:00:00이 출력됩니다. - 김맹준, 2024年04月14日 01:27 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

(注記) 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
풀이 작성은 로그인이 필요합니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 19
haskell x 1
python x 14
javascript x 1
cpp x 1
cs x 1
기 타 x 1
코딩도장 © 2014 · 문의 [email protected]
피드백 · 개인정보취급방침 · RSS

AltStyle によって変換されたページ (->オリジナル) /