Menu
Coddy logo textTech

하나로 합치기

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

challenge icon

챌린지

쉬움

이제 작업 목록 애플리케이션을 완성할 시간입니다. 이 마지막 단계에서는 이전 레슨에서 배운 모든 것을 하나로 결합합니다. Task 구조체, addTask, viewAllTasks, completeTask, removeTask를 메뉴 action 세션으로 구동합니다.

다음 세 가지 입력을 받습니다.

  • 쉼표로 구분된 application 이름과 사용자 이름이 포함된 문자열(예: "MyTasks,Alice")
  • 목록이 시작할 때 포함된 작업이 "name1:status1,name2:status2" 형식으로 들어 있는 문자열. 여기서 status는 "true" 또는 "false"입니다(예: "Write report:false,Call dentist:true"). 목록이 비어 있는 상태로 시작하면 이 줄은 비어 있습니다.
  • 쉼표로 구분된 세션의 action이 포함된 문자열. action은 이름만 있거나, |로 연결된 이름과 하나의 매개변수로 구성됩니다(예: "add|Buy groceries,view,complete|2,remove|0,exit"). action 목록은 항상 "exit"로 끝납니다.

작업 이름에는 공백이 포함될 수 있으므로 이전 레슨에서처럼 bufio.Scanner를 사용하여 세 줄을 모두 읽으세요.

해야 할 일은 다음과 같습니다.

  1. Name(string) 및 Completed(bool) 필드를 가진 동일한 Task 구조체를 정의합니다.
  2. 이미 작성한 네 함수를 동일한 시그니처로 다시 가져옵니다.
    • addTask(tasks []Task, taskName string) []Task
    • 완료된 작업에는 "[x] [task_name]"을, 아직 열린 작업에는 "[ ] [task_name]"을 출력하는 viewAllTasks(tasks []Task)
    • completeTask(tasks *[]Task, index int)
    • removeTask(tasks []Task, index int) []Task
  3. 두 번째 입력을 바탕으로 시작 목록을 만듭니다. 빈 줄은 빈 목록을 의미한다는 점을 기억하세요.
  4. 첫 번째 프로젝트 단계에서와 정확히 동일하게 환영 메시지와 메뉴를 출력합니다.
    • "Welcome to [app_name], [user_name]!"
    • "1. Add Task"
    • "2. View Tasks"
    • "3. Complete Task"
    • "4. Remove Task"
    • "5. Exit"
    • "Current tasks: [count]"
  5. action을 순서대로 실행합니다. 모든 action은 먼저 헤더를 출력합니다.
    • "add": "--- ADD TASK ---"를 출력하고, 매개변수로 지정된 작업을 추가한 다음 "Task '[task_name]' added!"를 출력합니다.
    • "view": "--- VIEW TASKS ---"를 출력하고, viewAllTasks로 모든 작업을 나열한 다음 요약 줄을 출력합니다.
    • "complete": "--- COMPLETE TASK ---"를 출력하고, 해당 index의 작업을 완료 처리한 다음 "Task '[task_name]' marked as completed!"를 출력합니다.
    • "remove": "--- REMOVE TASK ---"를 출력하고, 해당 index의 작업을 제거한 다음 "Task '[task_name]' removed successfully!"를 출력합니다.
    • "exit": "--- EXIT ---"를 출력한 다음 "Final list:", 전체 목록, 요약 줄을 차례로 출력하고 마지막으로 "Goodbye, [user_name]!"을 출력합니다. exit 이후에는 아무것도 실행되지 않습니다.
  6. 이전 레슨에서처럼 index는 0부터 시작합니다. "complete" 또는 "remove"의 index가 목록의 범위를 벗어나면 대신 "Invalid task number"를 출력하고 목록을 변경하지 않습니다.
  7. 요약 줄은 이미 배운 다음 형식입니다. "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

strings 패키지를 사용하여 입력 줄을 분할하고, strconv 패키지를 사용하여 index를 숫자로 변환하세요. 이 마지막 단계에서는 한 번에 하나씩 작성한 작은 함수들이 모여 작동하는 프로그램이 되는 과정을 보여 줍니다.

직접 해보기

package main

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

type Task struct {
	Name      string
	Completed bool
}

// TODO: Bring back addTask, viewAllTasks, completeTask and removeTask
// 이 프로젝트의 이전 수업에서

func main() {
	// 입력 줄을 읽기 위한 스캐너 생성
	scanner := bufio.NewScanner(os.Stdin)

	// 애플리케이션 이름과 사용자 이름 읽기
	scanner.Scan()
	names := scanner.Text()

	// 목록이 시작하는 작업들 읽기
	scanner.Scan()
	taskData := scanner.Text()

	// 세션의 액션들 읽기
	scanner.Scan()
	actionData := scanner.Text()

	// TODO: 구현 완료하기
	// 1. names를 ","로 분할하여 앱 이름과 사용자 이름 가져오기
	// 2. taskData에서 시작 작업 슬라이스 구성하기
	// 3. 환영 메시지, 메뉴 및 현재 작업 수 출력하기
	// 4. actionData의 모든 액션을 순서대로 실행하고, 먼저 헤더를 출력하기
}

로직 & 흐름의 모든 레슨

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