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과 마찬가지로 빠른 조회 성능을 얻을 수 있습니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움고유한 항목을 저장하기 위한 Go 세트(set) 관용구를 시연하는 프로그래밍 언어 선호도 추적기를 만드세요. 이 챌린지는 중복 없이 프로그래밍 언어를 추적하기 위해 map[string]struct{} 패턴을 사용하는 방법을 보여줍니다.
두 개의 입력을 받게 됩니다:
- 처리할 언어의 수를 나타내는 문자열 (예:
"6") - 쉼표로 구분된 프로그래밍 언어들이 포함된 문자열 (예:
"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")
당신의 과제는 다음과 같습니다:
- 고유한 프로그래밍 언어를 저장하기 위해 Go 관용구인
map[string]struct{}를 사용하여 세트를 생성합니다. - 입력 문자열을 쉼표로 분리하여 개별 언어 이름을 가져오도록 파싱합니다.
- 빈 구조체 리터럴인
{}를 값으로 사용하여 각 언어를 세트에 추가합니다. - 각 언어를 만날 때마다 다음을 출력하여 처리 결과를 표시합니다:
- 언어가 세트에 새로 추가되는 경우:
"Added: [language]" - 언어가 이미 세트에 존재하는 경우:
"Already exists: [language]"
- 언어가 세트에 새로 추가되는 경우:
- 모든 언어를 처리한 후, 요약을 표시합니다:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- 마지막으로, 세트에 있는 모든 고유 언어를 나열합니다:
- 헤더:
"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]" 형식으로 나열
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.