Menu
Coddy logo textTech

구조체 Map

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

맵의 값으로 구조체를 저장하면 맵은 매우 강력해집니다. 이 패턴을 사용하면 의미 있는 키를 사용하여 복잡하고 구조화된 데이터를 정리함으로써 쉽게 조회하고 검색할 수 있습니다.

구조체를 맵의 값으로 사용하면, 기본적으로 각 키가 전체 데이터 레코드를 가리키는 컬렉션을 생성하게 됩니다. 이러한 맵을 선언하고 초기화하는 방법은 다음과 같습니다:

type Student struct {
    ID    int
    Grade string
}

students := map[string]Student{
    "Alice": {ID: 101, Grade: "A"},
    "Bob":   {ID: 102, Grade: "B"},
}

다른 맵 작업과 마찬가지로 맵을 통해 구조체 데이터에 접근하고 작업할 수 있습니다. 학생의 정보를 가져오려면 학생의 이름을 키로 사용하면 됩니다:

alice := students["Alice"]
fmt.Println(alice.ID)    // 출력: 101
fmt.Println(alice.Grade) // 출력: A

이 패턴은 사용자 프로필, 제품 카탈로그 또는 구성 설정과 같이 구조화된 데이터와 빠른 키 기반 액세스가 모두 필요한 관련 데이터 컬렉션을 저장하기 위해 Go 애플리케이션에서 매우 흔히 사용됩니다.

quiz icon실력 점검

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

quiz icon실력 점검

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

quiz icon실력 점검

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

challenge icon

챌린지

쉬움

구조체를 값으로 사용하는 맵을 활용하여 학생 성적 관리 시스템을 만드세요. 이 챌린지는 효율적인 조회 및 검색을 위해 의미 있는 키를 사용하여 복잡한 학생 데이터를 구성하는 방법을 보여줍니다.

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

  • 학생 수를 나타내는 문자열 (예: "4")
  • 다음 형식의 학생 데이터를 포함하는 문자열: "name1:id1:grade1,name2:id2:grade2,name3:id3:grade3" (예: "Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")

수행해야 할 작업은 다음과 같습니다:

  1. 다음 필드를 가진 Student 구조체를 정의합니다:
    • ID (int) - 학생의 ID 번호
    • Grade (string) - 학생의 문자 성적
  2. 키는 학생 이름(string)이고 값은 Student 구조체인 맵을 생성합니다.
  3. 두 번째 입력에서 학생 데이터를 파싱합니다:
    • 입력 문자열을 쉼표로 분리하여 개별 학생 항목을 얻습니다.
    • 각 항목을 콜론으로 분리하여 이름, ID, 성적을 구분합니다.
    • ID 문자열을 정수로 변환합니다.
    • Student 구조체를 생성하고 이름을 키로 하여 맵에 추가합니다.
  4. 모든 학생을 이름의 알파벳 순서대로 다음 형식으로 표시합니다: "[name]: ID [id], Grade [grade]"
  5. 성적 통계를 계산하고 표시합니다:
    • 각 성적(A, B, C, D, F)별 학생 수를 셉니다.
    • 데이터에 존재하는 각 성적의 개수를 다음 형식으로 표시합니다: "Grade [grade]: [count] students"
    • 성적을 알파벳 순서(A, B, C, D, F)로 표시합니다.
  6. ID가 가장 높은 학생을 찾아 다음 형식으로 표시합니다: "Highest ID: [name] ([id])"
  7. 총 학생 수를 표시합니다: "Total students: [count]"

ID 문자열을 정수로 변환하려면 strconv 패키지를 사용하고, 학생 이름을 알파벳 순으로 정렬하려면 sort 패키지를 사용하세요. 이 챌린지는 구조체 값을 가진 맵이 의미 있는 식별자를 사용하여 복잡한 데이터 컬렉션을 구성하고 액세스하는 효율적인 방법을 어떻게 제공하는지 보여줍니다.

치트 시트

맵은 구조체를 값으로 저장할 수 있어, 각 키가 전체 데이터 레코드를 가리키는 컬렉션을 생성할 수 있습니다:

type Student struct {
    ID    int
    Grade string
}

students := map[string]Student{
    "Alice": {ID: 101, Grade: "A"},
    "Bob":   {ID: 102, Grade: "B"},
}

키를 사용하여 맵을 통해 구조체 데이터에 접근합니다:

alice := students["Alice"]
fmt.Println(alice.ID)    // 출력: 101
fmt.Println(alice.Grade) // 출력: A

이 패턴은 사용자 프로필, 제품 카탈로그 또는 구성 설정과 같이 구조화된 데이터와 빠른 키 기반 접근이 모두 필요한 관련 데이터 컬렉션을 저장하는 데 일반적으로 사용됩니다.

직접 해보기

package main

import (
	"fmt"
)

func main() {
	// 입력 읽기
	var numStudentsStr string
	var studentData string
	fmt.Scanln(&numStudentsStr)
	fmt.Scanln(&studentData)
	
	// TODO: 여기에 Student 구조체 정의
	
	// TODO: 학생들을 저장할 맵 생성 (이름을 키로, Student 구조체를 값으로)
	
	// TODO: 학생 데이터를 파싱하고 맵에 채우기
	
	// TODO: 모든 학생을 이름순(알파벳순)으로 표시
	
	// TODO: 성적 통계 계산 및 표시
	
	// TODO: ID가 가장 높은 학생을 찾아 표시
	
	// TODO: 총 학생 수 표시
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨