Menu
Coddy logo textTech

간단한 숫자 검증기

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

challenge icon

챌린지

쉬움

인터페이스가 동작 계약을 정의하는 방식과 사용자 정의 에러가 유효성 검사 실패 시 의미 있는 피드백을 제공하는 방식을 보여주는 숫자 유효성 검사 시스템을 만드세요. 이 챌린지는 인터페이스를 생성하고, 이를 사용자 정의 타입으로 구현하며, 유효성 검사 에러를 적절하게 처리하는 능력을 테스트합니다.

두 개의 입력을 받게 됩니다:

  • 쉼표로 구분된 유효성 검사 대상 숫자들을 포함하는 문자열 (예: "45,150,25,200,75")
  • "min:max" 형식의 유효성 검사 범위를 포함하는 문자열 (예: "1:100")

당신의 과제는 다음과 같습니다:

  1. 단일 메서드 Validate() error를 가진 Validator 인터페이스를 정의합니다.
  2. Value (int)와 Message (string)라는 두 개의 필드를 가진 ValidationError 구조체라는 사용자 정의 에러 타입을 생성합니다.
  3. ValidationError에 대해 "Validation failed: [message] (value: [value])" 형식의 메시지를 반환하는 Error() string 메서드를 구현합니다.
  4. Number (int), Min (int), Max (int)라는 세 개의 필드를 가진 NumberValidator 구조체를 생성합니다.
  5. 다음과 같이 동작하는 NumberValidatorValidate() error 메서드를 구현합니다:
    • 숫자가 유효 범위 내에 있으면(경계값 포함) nil을 반환합니다.
    • 숫자가 최솟값보다 작으면 "number below minimum range" 메시지와 함께 ValidationError를 반환합니다.
    • 숫자가 최댓값보다 크면 "number above maximum range" 메시지와 함께 ValidationError를 반환합니다.
  6. 첫 번째 입력을 쉼표로 분리하여 개별 숫자 문자열을 얻도록 파싱합니다.
  7. 두 번째 입력을 콜론으로 분리하여 최솟값과 최댓값을 추출하도록 파싱합니다.
  8. strconv 패키지를 사용하여 모든 문자열 값을 정수로 변환합니다.
  9. 유효성 검사 헤더를 표시합니다: "=== NUMBER VALIDATION SYSTEM ==="
  10. 유효성 검사 매개변수를 표시합니다: "Validating numbers in range [min] to [max]"
  11. 각 숫자에 대해:
    • 숫자와 범위 값을 사용하여 NumberValidator 인스턴스를 생성합니다.
    • 검사기(validator)에서 Validate() 메서드를 호출합니다.
    • 유효성 검사를 통과하면(에러가 nil인 경우), "✓ [number] is valid"를 표시합니다.
    • 유효성 검사에 실패하면(에러가 nil이 아닌 경우), "✗ [error_message]"를 표시합니다.
  12. 유효성 검사 요약을 표시합니다:
    • "=== VALIDATION SUMMARY ==="
    • "Total numbers checked: [total_count]"
    • "Valid numbers: [valid_count]"
    • "Invalid numbers: [invalid_count]"
  13. 완료 메시지를 표시합니다: "Number validation completed successfully"

입력 문자열을 분리하기 위해 strings 패키지를, 문자열을 정수로 변환하기 위해 strconv 패키지를, 그리고 형식화된 출력을 위해 fmt 패키지를 사용하세요. 이 챌린지는 인터페이스를 사용하여 유연한 유효성 검사 시스템을 구축하는 동시에 사용자 정의 에러 타입을 통해 상세한 에러 정보를 제공하는 방법을 보여줍니다.

직접 해보기

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// 입력 읽기
	var numbersInput string
	var rangeInput string
	fmt.Scanln(&numbersInput)
	fmt.Scanln(&rangeInput)
	
	// 입력 파싱
	numberStrings := strings.Split(numbersInput, ",")
	rangeParts := strings.Split(rangeInput, ":")
	
	// 범위 값을 정수로 변환
	min, _ := strconv.Atoi(rangeParts[0])
	max, _ := strconv.Atoi(rangeParts[1])
	
	// TODO: 아래에 코드를 작성하세요
	// 1. Validator 인터페이스 정의
	// 2. ValidationError 구조체 생성 및 Error() 메서드 구현
	// 3. NumberValidator 구조체 생성 및 Validate() 메서드 구현
	// 4. 각 숫자를 처리하고 유효성 검사 수행
	// 5. 결과 및 요약 표시
	
	// 유효성 검사 헤더 표시
	fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
	fmt.Printf("Validating numbers in range %d to %d\n", min, max)
	
	// 여기서 각 숫자 처리
	
	// 유효성 검사 요약 표시
	fmt.Println("=== VALIDATION SUMMARY ===")
	// 여기에 요약 출력 추가
	
	fmt.Println("Number validation completed successfully")
}

로직 & 흐름의 모든 레슨