๋‚ด ๋‹ต์•ˆ

 1def solution(plans):
 2    q = []
 3    answer = []
 4    for plan in plans:
 5        h, m = map(int, plan[1].split(':'))
 6        plan[1] = h*60 + m
 7        plan[2] = int(plan[2])
 8    plans.sort(key = lambda x: x[1])
 9
10    for plan in plans:
11        if q:
12            free_time = plan[1] - q[-1][1]
13        while q:
14            q[-1][2] -= free_time
15            free_time = -1 * q[-1][2]
16
17            print (free_time, q[-1][2])
18            if free_time < 0:
19                break
20
21            if q[-1][2] <= 0:
22                answer.append(q.pop()[0])
23
24        q.append(plan)
25    while q:
26        answer.append(q.pop()[0])
27
28    return answer

๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋‹ต์•ˆ

 1def solution(plans):
 2    plans = sorted(map(lambda x: [x[0], int(x[1][:2]) * 60 + int(x[1][3:]), int(x[2])], plans), key=lambda x: -x[1])
 3    q = []
 4
 5    while plans:
 6        cur = plans.pop()
 7
 8        for idx, item in enumerate(q):
 9            if item[0] > cur[1]:
10                q[idx][0] += cur[2]
11
12        q.append([cur[1]+cur[2], cur[0]])
13
14    q.sort()
15    return list(map(lambda x: x[1], q))

๋ฌธ์ œ

๋””์ž์ธ ์”ฝํ‚น์ด๋ž€

  • ๊ณต๊ฐ์˜ ๊ณผ์ •์„ ํ†ตํ•ด ๋ฌธ์ œ์ ์„ ์ฐพ์•„๋‚ด๊ณ , ์•„์ด๋””์–ด๋ฅผ ๋ฐœ์‚ฐํ•˜๊ณ , ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ๊ฒ€์ฆ ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š”, ๋ฐ˜๋ณต์  ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋ก  ๋ฐ ์‚ฌ๊ณ ๋ฐฉ์‹

๋””์ž์ธ ์”ฝํ‚น ํ”„๋กœ์„ธ์Šค

  • ๊ณต๊ฐ - ๋ฌธ์ œ ์ •์˜ - ์•„์ด๋””์–ด ๋„์ถœ - ํ”„๋กœํ† ํƒ€์ดํ•‘ - ํ…Œ์ŠคํŒ…

1. ๊ณต๊ฐ

๊ณต๊ฐ ํ”„๋กœ์„ธ์Šค

  1. ๋ฉด๋‹ดํ•˜๊ธฐ
  2. ๊ด€์ฐฐํ•˜๊ธฐ
  3. ๊ฒฝํ—˜ํ•˜๊ธฐ

๋ฉด๋‹ด์ง€ ์ค€๋น„ํ•˜๊ธฐ

  • ์ˆœ์ฐจ์  ๊ฒฝํ—˜ ์งˆ๋ฌธ : ์–ด๋–ค ์ˆœ์„œ๋กœ ํ–‰๋™ํ•˜๊ณ  ๊ฒฝํ—˜ํ•˜๋Š”์ง€ ๋ฌผ์–ด๋ณด์ž
  • ๊ฐ์ • ์งˆ๋ฌธ
  • ์ด์œ  ์งˆ๋ฌธ : ํ–‰๋™ ๋˜๋Š” ๊ฐ์ •์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ๋ฌผ์–ด๋ณด์ž
  • ๋˜ ์งˆ๋ฌธ : “๋˜…“๋ผ๋Š” ์งˆ๋ฌธ์„ ๋งŽ์ด ํ•˜์ž
  • ๊ตฌ์ฒดํ™” ์งˆ๋ฌธ

๊ด€์ฐฐํ•˜๊ธฐ | ๋ชจ๋‹ˆํ„ฐ๋ง

  • ํ˜„์žฅ ์ค‘์‹ฌ ๊ด€์ฐฐ : ์„ธ์ƒ์„ ๋„“๊ณ  ๊นŠ๊ฒŒ ๋ฐ”๋ผ๋ณด๊ธฐ

๊ด€์ฐฐํ•˜๊ธฐ | ์‰๋„์ž‰

  • ์‚ฌ๋žŒ์˜ ์ฒดํ—˜์ด๋‚˜ ํ–‰๋™์„ ๊ทธ์ž๋ฆฌ์—์„œ ๊ด€์ฐฐํ•˜๊ธฐ

๊ด€์ฐฐํ•˜๊ธฐ | ๋งฅ๋ฝ ์งˆ์˜๋ฒ•

MSA๋ž€ ๋ฌด์—‡์ธ๊ฐ€

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐœ๋…

  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค(microservice)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋А์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ์„œ๋น„์Šค์˜ ๋ชจ์ž„์œผ๋กœ
  • ๊ตฌ์กฐํ™”ํ•˜๋Š” ์„œ๋น„์Šค ์ง€ํ–ฅ ์•„ํ‚คํ…์ฒ˜(SOA) ์Šคํƒ€์ผ์˜ ์ผ์ข…์ธ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ธฐ๋ฒ•์ด๋‹ค
  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ์„œ๋น„์Šค๋“ค์€ ์„ฌ์„ธ(fine-grained)ํ•˜๊ณ  ํ”„๋กœํ† ์ฝœ์€ ๊ฐ€๋ฒผ์šด ํŽธ์ด๋‹ค.

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํŠน์ง•

  1. ์ž์œจ์„ฑ : ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ ์„œ๋น„์Šค๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ์šด์˜ํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅ
  2. ์ „๋ฌธ์„ฑ : ๊ฐ ์„œ๋น„์Šค๋Š” ์ผ๋ จ์˜ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜๋ฉฐ ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘”๋‹ค

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ๊ธฐ์ˆ ์  ํŠน์ง•

  • ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋Š” ๊ทธ ํฌ๊ธฐ๊ฐ€ ์ž‘์„ ๋ฟ, ์„œ๋น„์Šค ์ž์ฒด๋Š” ํ•˜๋‚˜์˜ ๋ชจ๋…ธ๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค
  • ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค
  • ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ์ž‘์•„์•ผ ํ•œ๋‹ค
  • ๊ฐ ์„œ๋น„์Šค๋Š” ๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค๋กœ ๊ตฌ๋™๋˜๋ฉฐ, REST API์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ๋˜์–ด์•ผ ํ•œ๋‹ค

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์ด์ 

  • ๋ฏผ์ฒฉ์„ฑ : ์†Œ๊ทœ๋ชจ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ํ™œ๋™ํ•˜๋ฉฐ ๋” ๋…๋ฆฝ์ ์ด๋ฉด์„œ ์‹ ์†ํ•˜๊ฒŒ ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์œ ์—ฐํ•œ ํ™•์žฅ์„ฑ : ์„œ๋น„์Šค๊ฐ€ ์ง€์›ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ธฐ๋Šฅ์˜ ์ˆ˜์š”๋ฅผ ์ถฉ์กฑํ•˜๋„๋ก ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์†์‰ฌ์šด ๋ฐฐํฌ

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ์กฐ๊ฑด

  1. ๋น„์šฉ
  2. ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ
  3. ์šด์˜ ์ธํ”„๋ผ
  4. ๋ฐฐํฌ ์ฃผ๊ธฐ

๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์‹ค์Šต (ELK)

ELK๋ž€

ELK๋Š” Elasticsearch, Logstash ๋ฐ Kibana : ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ ์„ธ ๊ฐœ์˜ ๋จธ๋ฆฌ๊ธ€

  • Elasticserach๋Š” ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„
  • Logstash๋Š” ์—ฌ๋Ÿฌ ์†Œ์Šค์—์„œ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ๋ณ€ํ™˜ํ•œ ํ›„ Elasticsearch ๊ฐ™์€ “stash"๋กœ ์ „์†กํ•˜๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ
  • Kibana๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Elasticsearch์—์„œ ์ฐจํŠธ์™€ ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”

Kibana

Elasticsearch์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์›น ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์‹œ๊ฐํ™” ํ”Œ๋žซํผ

  • Elasticsearch์— ์žˆ๋Š” ์ธ๋ฑ์Šค์˜ ํŒจํ„ด์„ ์ฐพ์•„์„œ, ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค

Logstash

์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘, ๋ณ€ํ™˜, ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ, Jruby(JVM ๊ธฐ๋ฐ˜ Ruby)๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค

Docker ์‹ค์Šต

Docker๋ž€ ๋ฌด์—‡์ธ๊ฐ€

Docker๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹ ์†ํ•˜๊ฒŒ ๊ตฌ์ถ•, ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ”Œ๋žซํผ

Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  1. ๊ฐœ์„ ๋˜๊ณ  ์™„๋ฒฝํ•œ ์ด์‹์„ฑ
  2. ๊ฒฝ๋Ÿ‰์˜ ์ค‘๋Ÿ‰, ๋ฏธ์„ธํ•œ ์—…๋ฐ์ดํŠธ
  3. ์ž๋™ํ™”๋œ ์ปจํ…Œ์ด๋„ˆ ์ž‘์„ฑ
  4. ์ปจํ…Œ์ด๋„ˆ ๋ฒ„์ „ํ™”
  5. ์ปจํ…Œ์ด๋„ˆ ์žฌ์‚ฌ์šฉ
  6. ๊ณต์œ  ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Docker ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ - Kubernetes

  • Kubernetes๋Š” Google์—์„œ ๋‚ด๋ถ€์šฉ์œผ๋กœ ๊ฐœ๋ฐœ๋œ ํ”„๋กœ์ ํŠธ์—์„œ ํŒŒ์ƒ๋œ ์˜คํ”ˆ์†Œ์Šค ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”Œ๋žซํผ
  • Docker์— ์ž์ฒด ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํˆด (Docker Swarm)์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ ๋Œ€์‹  Kubernetes๋ฅผ ์„ ํƒํ•œ๋‹ค
  • Kubernetes๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ฐฐ์น˜, ์—…๋ฐ์ดํŠธ, ์„œ๋น„์Šค๊ฐ์ง€, ์Šคํ† ๋ฆฌ์ง€ ํ”„๋กœ๋น„์ €๋‹, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์˜ ๊ด€๋ฆฌ์— ํ•„์ˆ˜์ ์ธ ํƒœ์Šคํฌ๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๊ณ  ์ž๋™ํ™”ํ•œ๋‹ค

ํด๋ผ์šฐ๋“œ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ

ํด๋ผ์šฐ๋“œ๋ž€

๊ฐœ์ธ์ด ๊ฐ€์ง„ ๋‹จ๋ง๊ธฐ๋ฅผ ํ†ตํ•ด์„œ๋Š” ์ฃผ๋กœ ์ž…/์ถœ๋ ฅ ์ž‘์—…๋งŒ ์ด๋ฃจ์–ด์ง€๊ณ , ์ •๋ณด๋ถ„์„ ๋ฐ ์ฒ˜๋ฆฌ, ์ €์žฅ, ๊ด€๋ฆฌ ์œ ํ†ต ๋“ฑ์˜ ์ž‘์—…์€ ํด๋ผ์šฐ๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ œ3์˜ ๊ณต๊ฐ„์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์ปดํ“จํŒ… ์‹œ์Šคํ…œ ํ˜•ํƒœ

ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…์ด ํ•„์š”ํ•œ ์ด์œ 

  1. ๋น„์šฉ์ ˆ๊ฐ
  2. ์†๋„ํ–ฅ์ƒ
  3. ํ™•์žฅ์„ฑ
  4. ์ƒ์‚ฐ์„ฑ

ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ์„œ๋น„์Šค๋ชจ๋ธ