[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ถ”์„ ํŠธ๋ž˜ํ”ฝ / ํŒŒ์ด์ฌ
Problem Solving ๐Ÿ”ฅ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ถ”์„ ํŠธ๋ž˜ํ”ฝ / ํŒŒ์ด์ฌ

๋ฌธ์ œ ์„ค๋ช…

์ถ”์„ ํŠธ๋ž˜ํ”ฝ

์ด๋ฒˆ ์ถ”์„์—๋„ ์‹œ์Šคํ…œ ์žฅ์• ๊ฐ€ ์—†๋Š” ๋ช…์ ˆ์„ ๋ณด๋‚ด๊ณ  ์‹ถ์€ ์–ดํ”ผ์น˜๋Š” ์„œ๋ฒ„๋ฅผ ์ฆ์„คํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์ด๋‹ค. ์žฅ์•  ๋Œ€๋น„์šฉ ์„œ๋ฒ„ ์ฆ์„ค ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘๋…„ ์ถ”์„ ๊ธฐ๊ฐ„์ธ 9์›” 15์ผ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•œ ํ›„ ์ดˆ๋‹น ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๊ณ„์‚ฐํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.์ดˆ๋‹น ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์€ ์š”์ฒญ์˜ ์‘๋‹ต ์™„๋ฃŒ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ž„์˜ ์‹œ๊ฐ„๋ถ€ํ„ฐ 1์ดˆ(=1,000๋ฐ€๋ฆฌ์ดˆ)๊ฐ„ ์ฒ˜๋ฆฌํ•˜๋Š” ์š”์ฒญ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ž…๋ ฅ ํ˜•์‹

  • solutionํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š”lines๋ฐฐ์—ด์€N(1 โ‰ฆNโ‰ฆ 2,000)๊ฐœ์˜ ๋กœ๊ทธ ๋ฌธ์ž์—ด๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ๋กœ๊ทธ ๋ฌธ์ž์—ด๋งˆ๋‹ค ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์™„๋ฃŒ์‹œ๊ฐ„S์™€ ์ฒ˜๋ฆฌ์‹œ๊ฐ„T๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋‹ค.
  • ์‘๋‹ต์™„๋ฃŒ์‹œ๊ฐ„S๋Š” ์ž‘๋…„ ์ถ”์„์ธ 2016๋…„ 9์›” 15์ผ๋งŒ ํฌํ•จํ•˜์—ฌ ๊ณ ์ • ๊ธธ์ด2016-09-15 hh:mm:ss.sssํ˜•์‹์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค.
  • ์ฒ˜๋ฆฌ์‹œ๊ฐ„T๋Š”0.1s,0.312s,2s์™€ ๊ฐ™์ด ์ตœ๋Œ€ ์†Œ์ˆ˜์  ์…‹์งธ ์ž๋ฆฌ๊นŒ์ง€ ๊ธฐ๋กํ•˜๋ฉฐ ๋’ค์—๋Š” ์ดˆ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•˜๋Š”s๋กœ ๋๋‚œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ ๋ฌธ์ž์—ด2016-09-15 03:10:33.020 0.011s์€2016๋…„ 9์›” 15์ผ ์˜ค์ „ 3์‹œ 10๋ถ„ **33.010์ดˆ**๋ถ€ํ„ฐ2016๋…„ 9์›” 15์ผ ์˜ค์ „ 3์‹œ 10๋ถ„ **33.020์ดˆ**๊นŒ์ง€**0.011์ดˆ**๋™์•ˆ ์ฒ˜๋ฆฌ๋œ ์š”์ฒญ์„ ์˜๋ฏธํ•œ๋‹ค.(์ฒ˜๋ฆฌ์‹œ๊ฐ„์€ ์‹œ์ž‘์‹œ๊ฐ„๊ณผ ๋์‹œ๊ฐ„์„ ํฌํ•จ)
  • ์„œ๋ฒ„์—๋Š” ํƒ€์ž„์•„์›ƒ์ด 3์ดˆ๋กœ ์ ์šฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ์‹œ๊ฐ„์€0.001 โ‰ฆ T โ‰ฆ 3.000์ด๋‹ค.
  • lines๋ฐฐ์—ด์€ ์‘๋‹ต์™„๋ฃŒ์‹œ๊ฐ„S๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

์ถœ๋ ฅ ํ˜•์‹

  • solutionํ•จ์ˆ˜์—์„œ๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐlines๋ฐฐ์—ด์— ๋Œ€ํ•ด์ดˆ๋‹น ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋ฆฌํ„ดํ•œ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ์ œ

์˜ˆ์ œ1

  • ์ž…๋ ฅ: [
    2016-09-15 01:00:04.001 2.0s,
    2016-09-15 01:00:07.000 2s
    ]

  • ์ถœ๋ ฅ: 1

์˜ˆ์ œ2

  • ์ž…๋ ฅ: [
    2016-09-15 01:00:04.002 2.0s,
    2016-09-15 01:00:07.000 2s
    ]

  • ์ถœ๋ ฅ: 2

  • ์„ค๋ช…: ์ฒ˜๋ฆฌ์‹œ๊ฐ„์€ ์‹œ์ž‘์‹œ๊ฐ„๊ณผ ๋์‹œ๊ฐ„์„ํฌํ•จํ•˜๋ฏ€๋กœ
    ์ฒซ ๋ฒˆ์งธ ๋กœ๊ทธ๋Š”01:00:02.003 ~ 01:00:04.002์—์„œ 2์ดˆ ๋™์•ˆ ์ฒ˜๋ฆฌ๋˜์—ˆ์œผ๋ฉฐ,
    ๋‘ ๋ฒˆ์งธ ๋กœ๊ทธ๋Š”01:00:05.001 ~ 01:00:07.000์—์„œ 2์ดˆ ๋™์•ˆ ์ฒ˜๋ฆฌ๋œ๋‹ค.
    ๋”ฐ๋ผ์„œ, ์ฒซ ๋ฒˆ์งธ ๋กœ๊ทธ๊ฐ€ ๋๋‚˜๋Š” ์‹œ์ ๊ณผ ๋‘ ๋ฒˆ์งธ ๋กœ๊ทธ๊ฐ€ ์‹œ์ž‘ํ•˜๋Š” ์‹œ์ ์˜ ๊ตฌ๊ฐ„์ธ01:00:04.002 ~ 01:00:05.0011์ดˆ ๋™์•ˆ ์ตœ๋Œ€ 2๊ฐœ๊ฐ€ ๋œ๋‹ค.

์˜ˆ์ œ3

  • ์ž…๋ ฅ: [
    2016-09-15 20:59:57.421 0.351s,
    2016-09-15 20:59:58.233 1.181s,
    2016-09-15 20:59:58.299 0.8s,
    2016-09-15 20:59:58.688 1.041s,
    2016-09-15 20:59:59.591 1.412s,
    2016-09-15 21:00:00.464 1.466s,
    2016-09-15 21:00:00.741 1.581s,
    2016-09-15 21:00:00.748 2.31s,
    2016-09-15 21:00:00.966 0.381s,
    2016-09-15 21:00:02.066 2.62s
    ]

  • ์ถœ๋ ฅ: 7

  • ์„ค๋ช…: ์•„๋ž˜ ํƒ€์ž„๋ผ์ธ ๊ทธ๋ฆผ์—์„œ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ 1์ดˆ ๊ฐ ๊ตฌ๊ฐ„์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๊ตฌํ•ด๋ณด๋ฉด(1)์€ 4๊ฐœ,(2)๋Š” 7๊ฐœ,(3)๋Š” 2๊ฐœ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ์ดˆ๋‹น ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์€ 7์ด ๋˜๋ฉฐ, ๋™์ผํ•œ ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๊ฐ–๋Š” 1์ดˆ ๊ตฌ๊ฐ„์€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ์—์„œ๋Š” ๊ตฌ๊ฐ„์ด ์•„๋‹Œ ๊ฐœ์ˆ˜๋งŒ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฌธ์ œ์ด๋‹ค.
๋”ฑํžˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณด๋Š” ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๊ณ , ๊ตฌํ˜„๋ ฅ์„ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ์ด๋“ฏํ•˜๋‹ค.
์‹œ๊ฐ„์„ ๋ชจ๋‘ second ๋‹จ์œ„๋กœ ๋ฐ”๊พธ์–ด์•ผ ๊ณ„์‚ฐ์ด ์‰ฌ์›Œ์ง„๋‹ค.

second๋กœ ๋ฐ”๊พธ์—ˆ์„ ๋•Œ ์†Œ์ˆ˜์ ์ด ์ƒ๊ธฐ๋Š”๋ฐ, ์ด๋Š” ๋ถ€๋™์†Œ์ˆ˜์  ์ด์Šˆ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ๋‚˜๋Š” ๋ชจ๋“ ๊ฐ’์ด 1000์„ ๊ณฑํ•ด ms ๋‹จ์œ„๋กœ ๋ฐ”๊ฟจ๋‹ค.

๊ทธ ํ›„ ์‹œ์ž‘์‹œ๊ฐ„, ์ข…๋ฃŒ์‹œ๊ฐ„์„ ๊ตฌํ•œ๋‹ค.
์กฐ๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์ •๋‹ต์ด ๋˜๋Š” ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š”
ํŠน์ •ํ•œ ์š”์ฒญ์˜ ์‹œ์ž‘์‹œ๊ฐ„ ~ ์‹œ์ž‘์‹œ๊ฐ„ + 1000ms - 1ms, ์ข…๋ฃŒ์‹œ๊ฐ„ ~ ์ข…๋ฃŒ์‹œ๊ฐ„ + 1000ms - 1ms ์— ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ 
๋”ฐ๋ผ์„œ ์ •๋‹ต์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์‹œ๊ฐ„์˜ ๊ฒฝ์šฐ๋ฅผ ๋‹ค ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋œ๋‹ค.

def isIn(start, times):
    # ํŠน์ • ์‹œ๊ฐ„ start๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ช‡ ๊ฐœ์˜ ์‹œ๊ฐ„์ด ์žˆ๋Š”๊ฐ€?
    ret = 0
    end = start + 1000 - 1
    for time in times:
        if start <= time[1] and end >= time[0]:
            ret += 1
    return ret

def solution(lines):
    times = []
    for line in lines:
        p = line.split(' ')
        end = p[1].split(':')
        end = int(end[0]) * 3600 * 1000 + int(end[1]) * 60 * 1000 + float(end[2]) * 1000
        start = end - (float(p[2][:-1]) * 1000) + 1
        times.append((start, end))

    ret = 0
    for time in times:
        start, end = time
        ret = max(isIn(start, times), ret)
        ret = max(isIn(end, times), ret)

    return ret