Menu
Coddy logo textTech

Set 생성하기

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

이제 Go의 세트(set) 관용구 뒤에 숨겨진 개념을 이해했으므로, 첫 번째 세트를 만들어 실제로 적용해 볼 차례입니다. 이 과정은 간단하며 이미 맵(map)에서 배운 것과 동일한 패턴을 따릅니다.

Go에서 세트(set)를 생성하려면, map[T]struct{} 패턴을 사용하여 변수를 선언합니다. 여기서 T는 저장하려는 요소의 타입입니다. 다음은 고유한 색상 이름을 저장하기 위한 세트를 생성하는 방법입니다:

colors := make(map[string]struct{})

맵 리터럴 구문을 사용하여 몇 가지 시작 값으로 세트를 초기화할 수도 있습니다:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

각 값이 빈 구조체 리터럴인 {}임에 주목하세요. 이것은 struct{}의 제로 값을 생성하며, 이는 맵에 키가 존재하도록 허용하면서도 메모리 공간을 전혀 차지하지 않습니다.

이 접근 방식의 장점은 Go의 기존 map 인프라를 활용하면서 진정한 set 의미론(semantics)을 제공한다는 점입니다. 각 색상 이름은 한 번만 나타날 수 있으며, 일반적인 map과 마찬가지로 빠른 조회 성능을 얻을 수 있습니다.

quiz icon실력 점검

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

quiz icon실력 점검

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

quiz icon실력 점검

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

challenge icon

챌린지

쉬움

고유한 항목을 저장하기 위한 Go 세트(set) 관용구를 시연하는 프로그래밍 언어 선호도 추적기를 만드세요. 이 챌린지는 중복 없이 프로그래밍 언어를 추적하기 위해 map[string]struct{} 패턴을 사용하는 방법을 보여줍니다.

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

  • 처리할 언어의 수를 나타내는 문자열 (예: "6")
  • 쉼표로 구분된 프로그래밍 언어들이 포함된 문자열 (예: "Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")

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

  1. 고유한 프로그래밍 언어를 저장하기 위해 Go 관용구인 map[string]struct{}를 사용하여 세트를 생성합니다.
  2. 입력 문자열을 쉼표로 분리하여 개별 언어 이름을 가져오도록 파싱합니다.
  3. 빈 구조체 리터럴인 {}를 값으로 사용하여 각 언어를 세트에 추가합니다.
  4. 각 언어를 만날 때마다 다음을 출력하여 처리 결과를 표시합니다:
    • 언어가 세트에 새로 추가되는 경우: "Added: [language]"
    • 언어가 이미 세트에 존재하는 경우: "Already exists: [language]"
  5. 모든 언어를 처리한 후, 요약을 표시합니다:
    • "Total languages processed: [total_count]"
    • "Unique languages: [unique_count]"
  6. 마지막으로, 세트에 있는 모든 고유 언어를 나열합니다:
    • 헤더: "Programming languages in set:"
    • 각 언어를 별도의 줄에 표시: "- [language]"

입력 문자열을 분리하기 위해 strings 패키지를 사용하고, 개수 문자열을 정수로 변환하기 위해 strconv 패키지를 사용하세요. 언어를 추가하기 전에 세트에 이미 존재하는지 확인하려면 comma ok 관용구인 _, exists := languageSet[language]를 사용하세요. 이 챌린지는 Go 세트 관용구가 고유 항목을 추적하고 데이터 중복을 방지하는 효율적인 방법을 어떻게 제공하는지 보여줍니다.

치트 시트

Go에서 세트(set)를 생성하려면, T가 요소 타입인 map[T]struct{} 패턴을 사용하세요:

colors := make(map[string]struct{})

맵 리터럴 구문을 사용하여 시작 값으로 세트를 초기화할 수도 있습니다:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

각 값은 빈 구조체 리터럴인 {}이며, 이는 struct{}의 제로 값(zero value)을 생성하고 메모리 공간을 차지하지 않으면서 맵에 키가 존재할 수 있도록 합니다.

세트에 요소가 존재하는지 확인하려면, comma ok 관용구를 사용하세요:

_, exists := languageSet[language]

직접 해보기

package main

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

func main() {
	// 입력 읽기
	var countStr string
	var languagesStr string
	fmt.Scanln(&countStr)
	fmt.Scanln(&languagesStr)
	
	// 개수 문자열을 정수로 변환 (이 챌린지에서는 필요하지 않음)
	_, _ = strconv.Atoi(countStr)
	
	// 언어 문자열을 쉼표로 분리
	languages := strings.Split(languagesStr, ",")
	
	// map[string]struct{} 관용구를 사용하여 세트 생성
	languageSet := make(map[string]struct{})
	
	// TODO: 아래에 코드를 작성하세요
	// 각 언어를 처리하고 세트에 존재하는지 확인하세요
	// comma ok 관용구 사용: _, exists := languageSet[language]
	// "Added: [language]" 또는 "Already exists: [language]" 출력
	// 빈 구조체 리터럴 {}을 사용하여 세트에 언어 추가
	
	// 요약 정보 출력
	// 처리된 총 언어 수와 고유 언어 수 출력
	
	// 세트에 있는 모든 고유 언어 출력
	fmt.Println("Programming languages in set:")
	// 일관된 출력을 위해 맵을 슬라이스로 변환하고 정렬
	// 각 언어를 "- [language]" 형식으로 나열
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨