코딩도장

시계바늘사이의 각도

철수의 아날로그 시계는 시침과 분침이 모두 매초 항상 일정한 속도로 움직인다고 한다. 즉 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개의 풀이가 있습니다. 1 / 2 Page

00:00:00부터 경과한 초 = t라고 할 때

분침의 각도는 1/10 * t 도, 시침의 각도는 1/120 * t 도 이므로 사이의 각도는 11/120 * t 도입니다.

따라서 11/120 t = d + n * 360 일 때 둘 사이의 각도가 d도가 됩니다. ((n은 0을 포함한 자연수))

이 때 n = 11 a + k (0 <= k < 11, a와 k는 정수)로 놓으면

t = (120/11) (d + k * 360) + a * 360 * 120이므로

360 * 120초는 12시간이므로 하루 중 시침과 분침 사이의 각도가 d도가 되는 시간은 t = t_1 = (120/11) (d + k * 360)일 때와 그 12시간 후로 2번인 것을 알 수 있습니다

문제에서는 (360 - d)도에 해당하는 시간도 같이 찾아야 합니다. 이에 해당하는 시간은 좌우대칭인 [24시간 - t_1, 12시간 - t_1]입니다.

따라서 d + 360 k가 11로 나누어떨어지게 하는 k를 찾아 t_1만 계산하면 4개의 시간을 모두 찾을 수 있습니다.

import Data.Set
import Data.List
import Data.Maybe
import Data.Time
import Control.Monad
findTime d = fromList [t, 12*3600 + t, 24*3600 - t, 12*3600 - t]
 where
 t = (120 * a) `div` 11
 a = fromJust $ find ((==0) . (`rem` 11)) [d, d+360..]
render = formatTime defaultTimeLocale "%H:%M:%S" . timeToTimeOfDay . secondsToDiffTime
main = mapM_ (putStrLn . render) =<< toAscList . findTime . read <$> getLine
댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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()

2019年06月13日 11:39

ykleeac

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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)
댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
const Clock = (()=>{
 const Clock = function(h, m, s){
 [this.h, this.m, this.s] = [h, m, s];
 };
 Clock.prototype.getAngle = function(){
 var agH = 30*(this.h%12) + (this.m*60 + this.s)*30/3600,
 agM = 6*this.m + this.s*6/60,
 res = (agM-agH)*(-1)**(agM<agH);
 return res > 180 ? 360-res : res;
 };
 Clock.prototype.print = function(){
 console.log(
 String(this.h).padStart(2,'0') +':'+
 String(this.m).padStart(2,'0') +':'+
 String(this.s).padStart(2,'0')
 );
 };
 Clock.timer = function*(){
 for(let i=0; i<24; i++)
 for(let j=0; j<60; j++)
 for(let k=0; k<60; k++)
 yield new Clock(i,j,k);
 };
 return Clock;
})();
function solve(a){
 for(let i of Clock.timer())
 i.getAngle() === a && i.print();
}
solve(22);
00:04:00
11:56:00
12:04:00
23:56:00
댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
 int angle;
 cin >> angle;
 int hour = 0, minute = 0, second = 0;
 for (; hour < 24; ++hour)
 {
 int s_hour = hour;
 if (hour > 12) s_hour = hour - 12;
 for (minute = 0; minute < 60; ++minute)
 {
 for (second = 0; second < 60; ++second)
 {
 double cal_angle = fabs((double)s_hour * 30 + ((double)1 / 120) * second + minute * 0.5 - (double)minute * 6 - second * 0.1);
 if (cal_angle == (double)angle || cal_angle == 360 - (double)angle)
 {
 printf("%02d::%02d::%02d\n", hour, minute, second);
 }
 }
 }
 }
 return 0;
}

2019年07月19日 16:40

드드드드드드

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

C#

using System;
using System.Text;
namespace CD233
{
 class Program
 {
 static void Main()
 {
 int angle = int.Parse(Console.ReadLine());
 for (int hour = 0; hour < 24; hour++)
 {
 for (int minute = 0; minute < 60; minute++)
 {
 for (int second = 0; second < 60; second++)
 {
 var CurrentTime = new ClockHands(hour, minute, second);
 if (CurrentTime.GetAngleDifference() == angle)
 {
 StringBuilder sb = new StringBuilder();
 sb.Append($"{hour.ToString().PadLeft(2,'0')}:");
 sb.Append($"{minute.ToString().PadLeft(2,'0')}:");
 sb.Append($"{second.ToString().PadLeft(2,'0')}");
 Console.WriteLine(sb);
 }
 }
 }
 }
 }
 }
 class ClockHands
 {
 public int TimeInSeconds { get; }
 // 시침 각도 (00:00:00 기준)
 private double HourHandAngle => ((double)360 / 12 / 60 / 60 * TimeInSeconds) % 360;
 // 분침 각도 (00:00:00 기준)
 private double MinuteHandAngle => ((double)360 / 60 / 60 * TimeInSeconds) % 360;
 public ClockHands(int hour, int minute, int second)
 {
 TimeInSeconds = second + minute * 60 + hour * 60 * 60;
 }
 public double GetAngleDifference()
 {
 double difference = Math.Abs(HourHandAngle - MinuteHandAngle);
 return difference > 180 ? 360 - difference : difference;
 }
 }
}

2019年09月18日 13:14

mohenjo

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

2020年05月07日 14:49

Buckshot

댓글 작성은 로그인이 필요합니다.
각도(0~180)를 입력하시오....22 00:04:00 12:04:00 11:56:00 23:56:00 - Buckshot, 2020年05月07日 14:49 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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

Hwaseong Nam

댓글 작성은 로그인이 필요합니다.
맞는지 모르겠지만....... 문제에서 1초마다 시침과 분침이 계속 움직인다는 조건이 있어서 90도를 입력했을 때 다음과 같은 값이 나오도록 했습니다. 0 ~ 180도 사이의 각도를 입력: 90 00:16:22 00:49:05 01:21:49 01:54:33 02:27:16 03:00:00 03:32:44 04:05:27 04:38:11 05:10:55 05:43:38 06:16:22 06:49:05 07:21:49 07:54:33 08:27:16 09:00:00 09:32:44 10:05:27 10:38:11 11:10:54 11:10:55 11:43:38 12:16:22 12:49:05 13:21:49 13:54:33 14:27:16 15:00:00 15:32:44 16:05:27 16:38:11 17:10:54 17:10:55 17:43:38 18:16:22 18:49:05 19:21:49 19:54:33 20:27:16 21:00:00 21:32:43 21:32:44 22:05:27 22:38:11 23:10:54 23:43:38 - Hwaseong Nam, 2020年05月24日 00:28 M D
시침과 분침이 같이 조금씩 초단위로 움직이기 때문에 90도만 해도 여러가지 시간이 나올수 있다고 생각합니다. - Hwaseong Nam, 2020年05月24日 00:29 M D
처음 00:16:22의 경우 정각 12시를 기준으로 시침의 경우 (16*60+22) / 43200 * 360 = 8.183333 도를 회전하였습니다. 분침의 경우 (16*60+22) / 3600 * 360 = 98.2 도를 회전하였습니다. 그래서 시침과 분침의 각도는 90도가 아닙니다. - ­박철희, 2021年09月22日 11:37 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 によって変換されたページ (->オリジナル) /