오늘은 위의 과제물을 수행해 볼 것이다!
첫번째 문제 - 학생 관리
학생의 이름을 등록한다. 이름과 ID를 입력받아 Dictionary에 등록되도록 한다!
var students: [String: String] = ["001": "배추", "002": "뭉치"]
내가 직접 짜본 코드다.
빈 Dictionary를 만들지 않고 직접 바로 넣었더니, 보기도 좋지 않고, 출력했을때 "뭉치"부터 거꾸로 나왔다.
var students: [String: String] = [:]
students["001"] = "배추"
students["002"] = "뭉치"
뭔가 다른 방법이 있지 않을까 싶어서 답지를 한번 보고 구현해봤다.
답지에는 빈 Dictionary를 선언하고 직접 값을 넣는 방법을 사용했다.
조금 더 깔끔한 코드가 된 것 같다. 그리고 순서도 제대로 나왔다!!
두번째 문제 - 과목 관리
var subjects: Set<String> = ["컴퓨터공학", "심리학", "양자역학"]
subjects.insert("수의학과")
subjects.remove("양자역학")
마찬가지로 직접 작성한 코드이다.
"배추"와 "뭉치"에 각각 입력을 해야하지만, 그냥 Subjects라는 변수를 만들어서 거기에 집어넣었다..
문제가 의도한 바와는 다른 코드를 작성하고 말았다..ㅜㅜ
var subjects: [String: Set<String>] = [:]
subjects["배추"] = ["심리학", "서양문학", "인문학"]
subjects["뭉치"] = ["컴퓨터공학", "양자역학"]
subjects["배추"]?.insert("경제학")
subjects["뭉치"]?.remove("인문학")
겹치는 과목이 없게 하기 위해서, Set을 이용해서 값을 선언하였고, 빈 Dictionary를 만들었다.
그리고 "배추"와 "뭉치에 각각의 과목을 입력하였고, insert와 remove를 사용해서 더하거나 뺐다.
다만 여기서 더하거나 뺄 때, 왜 옵셔널(?기호)가 들어가는지 이해를 하지 못했었다.
아마 코드의 값이 정확하지 않거나, 문제가 있을때 nil을 return하기 위해서라고 추측하고 있는데,
검색을 해봐도 이것에 대한 설명은 나오지 않았다. 너무 기초적인 부분이라 다루지 않은건지,
수많은 글에서 그냥 기본적으로 ?를 넣고 있었고 설명이 없었다.
아무래도 팀원들이나 튜터님이 오시면 물어보고 따로 정리해서 포스팅을 해야할 것 같다.
세번째 문제 - 과목별 성적 관리
var grades: [String: [String: [Int]]] = [:]
grades["배추"] = ["심리학": [10], "서양문학": [28], "인문학": [25]]
grades["뭉치"] = ["컴퓨터공학": [30], "양자역학": [27]]
grades["배추"]?["심리학"]?.append(30)
//append와 insert의 차이는, insert는 중간에 있는 값. append는 마지막 값
grades["뭉치"]?["양자역학"]?.removeLast()
// 말 그대로 배열의 마지막 항목을 제거한다고 보면 된다.
요런식으로.
grades 변수를 선언해서, 빈 Dictionary를 다시 만들어 주었다.
하지만 이번에는 Dictionary의 값을 [String: [Int]]로 선언해서, 과목명과 점수를 입력할 수 있게 하였다.
그리고 값을 더하거나 뺴주면 되는데.
append와 insert의 차이는, 마지막에 넣느냐와 중간에 넣느냐의 차이이다.
네번째 문제 - 성적 평균 계산
func calculateAverage(for student: String, subject: String) -> Double? {
guard let studentGrades = grades[student], let subjectGrades = studentGrades[subject] else {
return nil
} // part1
let total = subjectGrades.reduce(0, +)
return Double(total) / Double(subjectGrades.count)
} // part2
if let average = calculateAverage(for: "배추", subject: "심리학") {
print("배추의 심리학 평균: \(average)")
} else {
print("배추의 심리학 성적을 찾지 못했습니다.")
} // part3
네번째 문제는 정말 이해가 가지 않았다.
해당 학생과 과목이 없을 경우 nil을 return하는 역할을 가진 part1 부분의 코드.
그리고 Part2의 코드는 성적들의 값을 더하고 나눠서 평균을 구하는 역할을 한다.
그리고 마지막 part3부분은 배추의 심리학 평균점수를 출력하고, 혹은 배추의 심리학이라는 과목을 찾지 못했다면 찾지 못했다는 메시지를 출력하는 코드이다.
답지를 보고나서야 이해가 가기 시작했다.
아무래도 한번 더 복습해야겠다고 느꼈다. 감이 안와서 답지나 다른 사람의 코드를 보고 공부하다보면,
어떻게 코드가 작동하는지는 이해가 가는데, 왜 애초에 이 코드를 선택하는지, 다른 방법으로 코딩할 수는 없는건지 궁금하다.
갈길이 멀다! 더 열심히 달려보자.
'개발일지' 카테고리의 다른 글
기초 문법 복습 - String과 Character (0) | 2024.10.09 |
---|---|
운동 관리 시스템을 만들어보자! (function) (2) | 2024.09.30 |
은행 계좌 관리 시스템을 구축해보자!(willSet, didSet) (2) | 2024.09.26 |
직사각형의 넓이와 둘레를 계산해보자. (0) | 2024.09.26 |
데이터 다루기 실습 (0) | 2024.09.20 |
살아남는 iOS 개발자가 되기 위해 끊임없이 노력하고 있습니다.