Menu
CoddyTech

Sleep과 Ticker

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 64번째.

때로는 프로그램 실행의 타이밍을 제어해야 합니다. Go는 이를 위해 time 패키지에서 두 가지 필수 함수를 제공합니다. 실행을 일시 중지하는 time.Sleep과 일정한 간격으로 작업을 수행하는 time.NewTicker입니다.

time.Sleep 함수는 지정된 시간 동안 프로그램을 일시 중지합니다. 매개변수로 time.Duration을 받으며, 해당 시간이 지날 때까지 실행을 차단합니다:

fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")

일정한 간격으로 작업을 반복하려면 time.NewTicker를 사용해 지정된 간격으로 채널에 값을 보내는 ticker를 만듭니다. 주기적으로 실행해야 하는 작업에 유용합니다:

ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
    <-ticker.C // 다음 틱을 기다립니다
    fmt.Println("Tick", i+1)
}

이러한 타이밍 함수는 Go 프로그램에서 지연을 만들고, 시간 제한을 구현하고, 반복 작업을 예약하는 데 필수적입니다.

challenge icon

챌린지

쉬움

time.Sleep를 사용해 안내 지시 사이에 멈춤을 만들고, Go 프로그램의 기본적인 시간 제어를 보여 주는 명상 세션 타이머를 만드세요.

두 개의 입력을 받습니다.

  • 명상 단계를 포함하는 문자열로, 형식은 "step1:duration,step2:duration,step3:duration"입니다(예: "Breathe in:3,Hold:2,Breathe out:4").
  • 반복할 사이클 수를 포함하는 문자열입니다(예: "5").

해야 할 작업은 다음과 같습니다.

  1. 첫 번째 입력을 쉼표로 분리해 개별 명상 단계를 가져옵니다.
  2. 각 단계에서 콜론으로 분리해 지시와 지속 시간(초)을 추출합니다.
  3. strconv 패키지를 사용해 지속 시간 문자열을 정수로 변환합니다.
  4. 두 번째 입력을 정수로 변환해 사이클 수를 가져옵니다.
  5. 세션 헤더를 표시합니다: "=== MEDITATION TIMER ==="
  6. 세션 설정을 표시합니다: "Starting meditation session with [number_of_cycles] cycles"
  7. 각 사이클에 대해(사이클 1부터 시작):
    • 다음을 표시합니다: "--- Cycle [cycle_number] ---"
    • 각 명상 단계에 대해:
      • 다음을 표시합니다: "[instruction]..."
      • time.Sleep을 사용해 지정된 시간 동안 멈춥니다(검사가 빠르게 끝나도록 지속 시간에 time.Millisecond를 곱합니다. 예: time.Duration(duration) * time.Millisecond. 출력에는 여전히 초 단위로 표시됩니다).
      • 멈춘 후 다음을 표시합니다: "[instruction] complete ([duration] seconds)"
    • 사이클의 모든 단계를 완료한 후 다음을 표시합니다: "Cycle [cycle_number] finished"
  8. 모든 사이클이 완료되면 세션 요약을 표시합니다.
    • "=== SESSION COMPLETE ==="
    • "Total cycles completed: [number_of_cycles]"
    • "Steps per cycle: [number_of_steps]"
    • "Total meditation time: [total_seconds] seconds"(모든 단계의 지속 시간 합계에 사이클 수를 곱한 값)
  9. 완료 메시지를 표시합니다: "Meditation session finished - well done!"

대기 작업에는 time 패키지를, 입력 문자열 분리에는 strings 패키지를, 문자열을 정수로 변환하는 데는 strconv 패키지를, 출력에는 fmt 패키지를 사용하세요. time.Sleep은 time.Duration 매개변수를 받으므로 먼저 정수를 변환해야 합니다: time.Duration(duration) * time.Millisecond. 실제 타이머라면 time.Second를 사용하겠지만, 정수 초 단위로 멈추면 검사 시간이 초과됩니다. 이 과제에서는 안내 명상이나 운동 타이머와 같은 실제 응용 분야에서 프로그램 실행 중 시간에 맞춘 멈춤을 만들기 위해 time.Sleep을 사용하는 방법을 보여 줍니다.

직접 해보기

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// 공백을 올바르게 처리하려면 bufio.Scanner를 사용해 입력을 읽으세요
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	stepsInput := scanner.Text()
	
	scanner.Scan()
	cyclesInput := scanner.Text()
	
	// 명상 단계와 반복 횟수를 파싱하세요
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: 아래에 코드를 작성하세요
	// 각 단계를 파싱하여 지시 사항과 지속 시간을 추출하세요
	// 접근하기 전에 parts 슬라이스에 요소가 충분한지 확인하세요
	// 세션 제목과 설정을 표시하세요
	// 반복 횟수와 단계를 순회하세요
	// 일시 정지에는 time.Sleep을 사용하세요: time.Duration(duration) * time.Millisecond
	// 완료 메시지와 요약을 표시하세요
	
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 & 흐름의 모든 레슨

직접 연습해 보세요: 온라인 Go 컴파일러