3이 나타나는 시간을 전부 합하면?

디지털 시계에 하루동안(00:00~23:59) 3이 표시되는 시간을 초로 환산하면 총 몇 초(second) 일까요?

디지털 시계는 하루동안 다음과 같이 시:분(00:00~23:59)으로 표시됩니다.

00:00 (60초간 표시됨)
00:01 
00:02 
...
23:59
0:0:0~23:59:59 라는건가요? 아니면 24:00:00까지인건가요? 24:59:59까지인건가요? - *IDLE*, 2015/02/11 03:51 M D
24시까지 표현이면 00:00:00 부터 23:59:59 까지가 되겠네요 - 23king, 2015/02/11 11:09 M D
3이 나타나는 시간을 다 합하라는게 다른분들 풀이처럼 3이 나타난 총 시간을 표시하라는 건가요? 아니면 3이 나타나는 시간인 00:03 + 00:13 -> 00:16..... 처럼 시간 자체를 더하라는 건가요? 제가 바보인건지 설명이 약간 애매하네요. - 정기석, 2015/02/17 11:26 M D
네 저도 이 문제를 보고 상당히 애매했었는데.. 3이 나오는 시간을 합하라는 얘기입니다. 즉 시계에 1시 3분이 60초동안 유지 되죠 그 시간을 합하라는 겁니다 초단위로.. - 23king, 2015/02/17 11:28 M D
문제가 명확하지 않아 질문자의 의도에 맞게 수정했습니다. - 길가의풀, 2015/02/17 13:57 M D
파이썬 초보자입니다. 처음에는 24,300초가 나왔는데, 제기된 여러 답들을 보고 제 풀이가 틀린 것을 찾아냈습니다. 사실 풀이가 여러 언어로 되어 있어서 답을 알 기 힘든 면도 있지만, 어쨓든 도움이 되었네요. 감사합니다 ^ ^ ! - chj9991, 2016/02/25 18:40 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

58개의 풀이가 있습니다. 1 / 6 Page

Python으로 해 보았습니다. 결과는 29,700초 나왔습니다.

sumSec=0    # 초의 총합을 저장할 변수
for hour in range(24) :     # 시간
    for minute in range(60) :   #분
        if '3' in str(hour) or '3' in str(minute) : # 시간이나 분에 3이 들어가면
            sumSec += 60            # 60초씩 더함
print(sumSec)
문자열의 in 연산자를 사용하는 방법이 있었네요. 훌륭하네요^^ - 디디, 2016/03/19 21:52 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬입니다.

def clock(num):
    sec = 0
    for h in range(24):
        for m in range(60):
            if str(num) in str(h) + str(m): # 문자열로 변환한 시간에 해당 숫자가 들어있으면
                sec += 60
    return sec

print(clock(3))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

python 3.4

시간에 3 이 들어가면 60*60 값을 더한 다음에 넘기고, 시간에는 3 이 없고 분에 3 이 들어가면 60 을 더하여 값을 구했습니다.

s = 0
for h in range(24):
    if "3" in str(h): s += (60*60)
    else:
        for m in range(60):
            if "3" in str(m): s += 60
print(s)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

하루는 24 시 한시간 60분 1분은 60 초

이중에서 3만 있는 숫자를 구합니다. 시 + 분 + 초

시는 3,13,23 분과 초는 3, 13, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 53

그래서 모두 합하면

def three_num(num):
    list=[]
    for i in xrange(num):
        k=str(i)
        if '3' in k:
            k2=int(k)
            list.append(k2)
    return list

lista=three_num(24)
listb=three_num(60)


sum=0
for h in lista:
    for m in listb:
        for s in listb:
            sum=sum+h+m+s

print sum

합은 51975 입니다. (맞나 --;)

중복된 숫자가 있는거 같습니다 ~~ - 정기석, 2015/02/17 11:23 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

시간 클래스를 만들었습니다

22:52:30

class PyTime():
    def __init__(self, hour, minute, second):
        self.hour = hour
        self.minute = minute
        self.second = second

    def __str__(self):
        return '{0:02}:{1:02}:{2:02}'.format(self.hour, self.minute, self.second)

    def __add__(self, other):
        tempmin, self.second = divmod(self.second + other.second, 60)
        temphour, self.minute = divmod(self.minute + other.minute + tempmin, 60)
        self.hour = (self.hour + other.hour + temphour) % 24
        return self


if __name__ == '__main__':
    ans = PyTime(0, 0, 0)
    for h in range(24):
        for m in range(60):
            for s in range(60):
                t = PyTime(h, m, s)
                if '3' in str(t): ans = ans + t
    print(ans)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

문제가 완전히 바뀌었군요. 그냥 3600*3 + 15*21*60이라서 암산으로도 됩니다. (29700)

전체 합에서 3이 안 들어간 수를 출현 횟수만큼 뺐습니다.

@a=(276*60*60,1770*24*60,1770*24*60,237*45*45,1290*21*45,1290*21*45);
push @b, $a[$_]-$a[$_+3] for (0..2);
for(1,0){
    $b[$_]+=int($b[$_+1]/60);
    $b[$_+1]%=60;
}
$b[0]%=24;
print join(":",@b);
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

문제 설명이 바뀌었길래 다시 풀었습니다. 숫자 3이 포함되어 있다는걸 걸러내는 방법은 itoa와 strchr를 이용했습니다.

3이 포함된 분은 3, 13, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 53 분이 있습니다. 총 15개인데 시간이 0부터 24이므로 24*15 = 360번 3이 등장합니다.

그리고 3은 등장해서 60초간 지속되므로 총 시간은 360*60 = 21600초 라는 결과를 구했습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
    int h, m, count = 0;
    char ch[3];

    for(h=0 ; h<=23 ; h++)  //h,m가 반복문을 돌면서 실제 시계처럼 돌아가는 생각을 하였습니다
    {
        for(m=0 ; m<=59 ; m++)
        {
            itoa(m, ch,10);
            if(strchr(ch, '3')) //3이 포함된 시각일때 count++
            {
                count++;
                //printf("%2d:%2d  %d번 3이 나왔습니다.\n", h, m, count);
            }
        }
    }
    printf("%d", count*60);     // hh:mm 형식의 디지털 시계에서 분 단위가 60초 지속되므로 60을 곱한 결과를 출력
}
시간에 3이 몇번 들어가든 1번으로 카운트하셔야 합니다. 예를들어 "03:30:03"이라면 지훈님의 코드라면 +3이지만 위의 문제에서는 +1입니다. - Shim Won, 2015/02/17 02:35 M D
Shim Won 님이 말씀주신대로 고치려다 아예 문제 설명이 바뀌었길래 다시 풀었습니다. - 백지훈, 2015/02/19 21:15 M D
3시, 13시, 23시의 경우가 계산이 되지 않았습니다. - *IDLE*, 2015/02/22 20:48 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

그냥 계산할 수 있을 것 같아서 계산했습니다.

시 3, 13, 23 (길이 3) 분, 초 3, 13, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 53 (길이 15)

  • A. 한시간동안 3이 분에 나타난 경우 : 15 * 60
  • B. 하루동안 3이 시간에 나타난 경우 : 3 * 60 * 60 -> 10800
  • C. 3이 안들어가는 시간 : (24 - 3) -> 21
  • 총 : B + A * C = 10800 + 21 * 900 -> 10800 + 18900 -> 29700
puts (3 * 60 * 60) + 21 * (60 * 15)

고쳤습니다 -0-

죄송합니다 제가 문제를 조금 난해하게 작성했네요 초는 계산안하셔도 됩니다 어차피 분이 3을 가리키고있으면.. 초는 의미가 없죠 ^^;; - 23king, 2015/02/17 11:32 M D
엇! 그래서 중복되는걸 (15 * 15) 뺏는데 -0- 그래도 틀렸나요? - Shim Won, 2015/02/17 11:34 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

1일동안(00:00~23:59)의 모든 시간들을 초단위로 구한 후에 3이 포함되어 있는 시간들을 count 했습니다.

hour = 0
min = 0
sec = 0
count = 0

while True:
    curtime = "%s:%s" % (hour, min)
    if curtime.find("3") != -1:
        count += 1
    if hour == 23 and min == 59 and sec == 59:
        break
    elif min == 59 and sec == 59:
        hour += 1
        min = 0
        sec = 0
    elif sec == 59:
        min += 1
        sec = 0
    else:
        sec += 1

print count

결과는 29700초로 나오네요.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

시간마다 분,초는 반복되므로 1시간마다 반복되는 값(1575초)을 미리 구해두고 시간에 3이 포함되었는지 확인하여 3이 있으면 1시간(3600초), 없으면 아까 구해둔값(1575초)를 더함 초로 환산할경우 총 43,875초로 나옴

// 하루 총 86400초
// 분,초는 반복되므로 미리 구함
$hourSum = 0;
for($m=0;$m<60;$m++)
    for($s=0;$s<60;$s++)
        if( strpos($m.$s,"3") !== false ) $hourSum +=1; // 3이 포함되어 있으면 1+ 3600회 처리  분,초를 하나의 문자열로 합쳐서 처리하여 중복계산을 막음

// echo $hourSum; // 1575초

// 시간에 3이 포함된경우 1시간을 초로 추가하고, 포함되지 않은경우 아까 구한 시간 합을 더함
$sum = 0;
for($h=0;$h<24;$h++)
    if( strpos("".$h,"3") !== false )
        $sum += 3600;
    else
        $sum += $hourSum;


var_dump( $sum ); // int(43875)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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


언어별 풀이 현황
전 체 x 58
python x 26
perl x 1
cpp x 5
기 타 x 8
php x 2
java x 8
cs x 4
javascript x 1
matlab x 1
objectivec x 1
ruby x 1