이번에 원티드에서 진행하는 프리온보딩 챌린지 iOS과정을 신청했다. 해당 과정을 진행하기 전에 사전과제 및 이력서를 제출해야 되서 오랜만에 구조체, 오류 처리 등을 다루며 사전과제를 진행했다.
우선, 구현해야 되는 기능은 다음과 같다.
성적 관리 프로그램
프로젝트 이름
- MyCreditManager
사용 언어 / 환경
- Swift
- Xcode 기본 템플릿 중 [macOS - Command Line Tool]
프로그램의 메뉴
- 학생추가
- 학생삭제
- 성적추가(변경)
- 성적삭제
- 평점보기
- 종료
프로그램 동작조건
- 사용자가 종료 메뉴를 선택하기 전까지는 계속해서 사용자의 입력을 받습니다
- 메뉴선택을 포함한 모든 입력은 숫자 또는 영문으로 받습니다
성적별 점수
- A+ (4.5점) / A (4점)
- B+ (3.5점) / B (3점)
- C+ (2.5점) / C (2점)
- D+ (1.5점) / D (1점)
- F (0점)
평점
- 각 과목의 점수 총 합 / 과목 수
- 최대 소수점 2번째 자리까지 출력
- 예)
- 3.75
- 4.1
- 2
- 예)
프로그램 동작모습
예시 화면의 굵은 글씨는 콘솔 출력 내용이며, 얇은 글씨는 콘솔을 통한 입력 내용입니다.
메뉴의 잘못된 입력 처리
학생추가
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 이미 존재하는 학생은 다시 추가하지 않습니다
학생 삭제
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 없는 학생은 삭제하지 않습니다
성적추가
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 없는 학생의 성적은 추가하지 않습니다
성적삭제
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 없는 학생의 성적은 삭제하지 않습니다
평점보기
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 해당 학생의 과목과 성적을 모두 출력한 후 마지막 줄에 평점을 출력합니다
- 없는 학생은 평점을 보여주지 않습니다
종료
- 프로그램을 종료합니다
처음 문제를 봤을 때는 생각보다 단순할 것이라고 생각했지만, 구조체나 옵셔널 바인딩 등 최근에 다루지 않았던 지식들이 등장해서 조금 시간이 걸렸다. 좋은 코드를 짜기 위해 최대한 노력했지만, 아직 오류 처리 부분이나 enum등을 잘 활용하지 못한 것 같다는 생각이 든다. 또한 class 와 struct의 차이점도 잘 기억이 나지 않아서 그 부분을 해결하는 것도 조금 시간이 걸렸었다. 최대한 반복되는 코드를 없애고자 했지만 아직도 많이 부족하다는 것을 느끼게 되었다.
우선 코드는 다음과 같다.
import Foundation
var classStudent = [Student]()
var studentCount = 0
var student: Student = Student()
var grade = ["A+","A","B+","B","C","C+","D","D+","F"]
while 1 == 1 {
print("원하는 기능을 입력해주세요")
print("1: 학생추가, 2: 학생삭제, 3: 성적추가(변경), 4: 성적삭제 5: 평점보기, X: 종료")
let selectNumber = readLine()
if let num = selectNumber, !selectNumber!.isEmpty {
if num == "X" {
print("프로그램을 종료합니다...")
break
} else if num == "1" {
selectOne()
} else if num == "2" {
selectTwo()
} else if num == "3" {
selectThree()
} else if num == "4" {
selectFour()
} else if num == "5" {
selectFive()
}
} else {
print("뭔가 입력이 잘못되었습니다. 1~5 사이의 숫자 혹은 X를 입력해주세요.")
}
}
func selectOne() {
print("추가할 학생의 이름을 알려주세요")
let addStudent = readLine()
if let stu = addStudent, !addStudent!.isEmpty {
student.name = addStudent
let existStudent = classStudent.contains{ $0 == student }
if existStudent == true {
print("\(stu)는 이미 존재하는 학생입니다\n")
} else {
classStudent.append(student)
print("\(stu) 학생을 추가했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func selectTwo() { //예외처리 해야함
print("삭제할 학생의 이름을 입력해주세요.")
let deleteStudent = readLine()
if let stu = deleteStudent, !deleteStudent!.isEmpty {
student.name = stu
if let index = classStudent.firstIndex(where: { $0.name == student.name }) {
print("\(stu) 학생을 삭제 했습니다\n")
classStudent.remove(at: index)
} else {
print("\(stu) 학생을 찾지 못했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func selectThree() {
print("성적을 추가할 학생의 이름, 과목 이름, 성적(A+, A, F 등)을 띄어쓰기로 구분하여 차례로 작성해주세요.")
let addGrade = Array(readLine()!.components(separatedBy: " "))
if addGrade.count == 3 && transferGrade(addGrade[2]) != -1 {
student.name = addGrade[0]
if let index = classStudent.firstIndex(where: { $0.name == student.name }) {
print("\(addGrade[0]) 학생의 \(addGrade[1])과목이 \(addGrade[2])로 추가(변경) 되었습니다\n")
classStudent[index].classGrade[addGrade[1]] = addGrade[2]
} else {
print("\(addGrade[0]) 학생을 찾지 못했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func selectFour() {
print("성적을 삭제할 학생의 이름, 과목 이름을 띄어쓰기로 구분하여 차례로 작성해주세요.")
let deleteGrade = Array(readLine()!.components(separatedBy: " "))
if deleteGrade.count == 2 {
student.name = deleteGrade[0]
if let index = classStudent.firstIndex(where: { $0.name == student.name}) {
if (classStudent[index].classGrade.removeValue(forKey: deleteGrade[1]) != nil) == true {
print("\(deleteGrade[0]) 학생의 \(deleteGrade[1]) 과목의 성적이 삭제되었습니다.")
} else {
print("\(deleteGrade[0]) 학생은 \(deleteGrade[1]) 과목을 수강하지 않았습니다.")
}
} else {
print("\(deleteGrade[0]) 학생을 찾지 못했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func selectFive() {
print("평점을 알고싶은 학생의 이름을 입력해주세요")
let meanStudent = readLine()
if let stu = meanStudent, !meanStudent!.isEmpty {
if let index = classStudent.firstIndex(where: { $0.name == stu }) {
var mean: Float = 0
var gradeCount: Float = 0
for student in classStudent[index].classGrade {
mean += transferGrade(student.value)
gradeCount += 1
print("\(student.key) : \(student.value)")
}
print("평점 : \(mean / gradeCount)")
} else {
print("학생을 찾지 못했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func transferGrade(_ grade: String) -> Float{
if grade == "A+" {
return 4.5
} else if grade == "A" {
return 4
} else if grade == "B+" {
return 3.5
} else if grade == "B" {
return 3
} else if grade == "C+" {
return 2.5
} else if grade == "C" {
return 2
} else if grade == "D+" {
return 1.5
} else if grade == "D" {
return 1
} else if grade == "F" {
return 0
} else {
return -1
}
}
이상으로 글을 마치며, 앞으로 진행될 과정이 나에게 큰 도움이 되었으면 좋겠다!
'기타' 카테고리의 다른 글
Adjust 정리 (0) | 2023.04.24 |
---|---|
[iOS 면접 실제 질문 모음] (4) | 2023.04.09 |
인텔리픽 모의면접 후기 (0) | 2023.03.10 |
쉽고 개인정보처리방침 (0) | 2023.02.02 |
Slack 신고 알림 화면 (0) | 2022.09.26 |
이번에 원티드에서 진행하는 프리온보딩 챌린지 iOS과정을 신청했다. 해당 과정을 진행하기 전에 사전과제 및 이력서를 제출해야 되서 오랜만에 구조체, 오류 처리 등을 다루며 사전과제를 진행했다.
우선, 구현해야 되는 기능은 다음과 같다.
성적 관리 프로그램
프로젝트 이름
- MyCreditManager
사용 언어 / 환경
- Swift
- Xcode 기본 템플릿 중 [macOS - Command Line Tool]
프로그램의 메뉴
- 학생추가
- 학생삭제
- 성적추가(변경)
- 성적삭제
- 평점보기
- 종료
프로그램 동작조건
- 사용자가 종료 메뉴를 선택하기 전까지는 계속해서 사용자의 입력을 받습니다
- 메뉴선택을 포함한 모든 입력은 숫자 또는 영문으로 받습니다
성적별 점수
- A+ (4.5점) / A (4점)
- B+ (3.5점) / B (3점)
- C+ (2.5점) / C (2점)
- D+ (1.5점) / D (1점)
- F (0점)
평점
- 각 과목의 점수 총 합 / 과목 수
- 최대 소수점 2번째 자리까지 출력
- 예)
- 3.75
- 4.1
- 2
- 예)
프로그램 동작모습
예시 화면의 굵은 글씨는 콘솔 출력 내용이며, 얇은 글씨는 콘솔을 통한 입력 내용입니다.
메뉴의 잘못된 입력 처리
학생추가
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 이미 존재하는 학생은 다시 추가하지 않습니다
학생 삭제
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 없는 학생은 삭제하지 않습니다
성적추가
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 없는 학생의 성적은 추가하지 않습니다
성적삭제
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 없는 학생의 성적은 삭제하지 않습니다
평점보기
- 메뉴를 선택한 후에도 잘못 입력한 것이 있으면 처리해 주어야합니다
- 해당 학생의 과목과 성적을 모두 출력한 후 마지막 줄에 평점을 출력합니다
- 없는 학생은 평점을 보여주지 않습니다
종료
- 프로그램을 종료합니다
처음 문제를 봤을 때는 생각보다 단순할 것이라고 생각했지만, 구조체나 옵셔널 바인딩 등 최근에 다루지 않았던 지식들이 등장해서 조금 시간이 걸렸다. 좋은 코드를 짜기 위해 최대한 노력했지만, 아직 오류 처리 부분이나 enum등을 잘 활용하지 못한 것 같다는 생각이 든다. 또한 class 와 struct의 차이점도 잘 기억이 나지 않아서 그 부분을 해결하는 것도 조금 시간이 걸렸었다. 최대한 반복되는 코드를 없애고자 했지만 아직도 많이 부족하다는 것을 느끼게 되었다.
우선 코드는 다음과 같다.
import Foundation
var classStudent = [Student]()
var studentCount = 0
var student: Student = Student()
var grade = ["A+","A","B+","B","C","C+","D","D+","F"]
while 1 == 1 {
print("원하는 기능을 입력해주세요")
print("1: 학생추가, 2: 학생삭제, 3: 성적추가(변경), 4: 성적삭제 5: 평점보기, X: 종료")
let selectNumber = readLine()
if let num = selectNumber, !selectNumber!.isEmpty {
if num == "X" {
print("프로그램을 종료합니다...")
break
} else if num == "1" {
selectOne()
} else if num == "2" {
selectTwo()
} else if num == "3" {
selectThree()
} else if num == "4" {
selectFour()
} else if num == "5" {
selectFive()
}
} else {
print("뭔가 입력이 잘못되었습니다. 1~5 사이의 숫자 혹은 X를 입력해주세요.")
}
}
func selectOne() {
print("추가할 학생의 이름을 알려주세요")
let addStudent = readLine()
if let stu = addStudent, !addStudent!.isEmpty {
student.name = addStudent
let existStudent = classStudent.contains{ $0 == student }
if existStudent == true {
print("\(stu)는 이미 존재하는 학생입니다\n")
} else {
classStudent.append(student)
print("\(stu) 학생을 추가했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func selectTwo() { //예외처리 해야함
print("삭제할 학생의 이름을 입력해주세요.")
let deleteStudent = readLine()
if let stu = deleteStudent, !deleteStudent!.isEmpty {
student.name = stu
if let index = classStudent.firstIndex(where: { $0.name == student.name }) {
print("\(stu) 학생을 삭제 했습니다\n")
classStudent.remove(at: index)
} else {
print("\(stu) 학생을 찾지 못했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func selectThree() {
print("성적을 추가할 학생의 이름, 과목 이름, 성적(A+, A, F 등)을 띄어쓰기로 구분하여 차례로 작성해주세요.")
let addGrade = Array(readLine()!.components(separatedBy: " "))
if addGrade.count == 3 && transferGrade(addGrade[2]) != -1 {
student.name = addGrade[0]
if let index = classStudent.firstIndex(where: { $0.name == student.name }) {
print("\(addGrade[0]) 학생의 \(addGrade[1])과목이 \(addGrade[2])로 추가(변경) 되었습니다\n")
classStudent[index].classGrade[addGrade[1]] = addGrade[2]
} else {
print("\(addGrade[0]) 학생을 찾지 못했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func selectFour() {
print("성적을 삭제할 학생의 이름, 과목 이름을 띄어쓰기로 구분하여 차례로 작성해주세요.")
let deleteGrade = Array(readLine()!.components(separatedBy: " "))
if deleteGrade.count == 2 {
student.name = deleteGrade[0]
if let index = classStudent.firstIndex(where: { $0.name == student.name}) {
if (classStudent[index].classGrade.removeValue(forKey: deleteGrade[1]) != nil) == true {
print("\(deleteGrade[0]) 학생의 \(deleteGrade[1]) 과목의 성적이 삭제되었습니다.")
} else {
print("\(deleteGrade[0]) 학생은 \(deleteGrade[1]) 과목을 수강하지 않았습니다.")
}
} else {
print("\(deleteGrade[0]) 학생을 찾지 못했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func selectFive() {
print("평점을 알고싶은 학생의 이름을 입력해주세요")
let meanStudent = readLine()
if let stu = meanStudent, !meanStudent!.isEmpty {
if let index = classStudent.firstIndex(where: { $0.name == stu }) {
var mean: Float = 0
var gradeCount: Float = 0
for student in classStudent[index].classGrade {
mean += transferGrade(student.value)
gradeCount += 1
print("\(student.key) : \(student.value)")
}
print("평점 : \(mean / gradeCount)")
} else {
print("학생을 찾지 못했습니다\n")
}
} else {
print("입력이 잘못되었습니다. 다시 확인해주세요.")
}
}
func transferGrade(_ grade: String) -> Float{
if grade == "A+" {
return 4.5
} else if grade == "A" {
return 4
} else if grade == "B+" {
return 3.5
} else if grade == "B" {
return 3
} else if grade == "C+" {
return 2.5
} else if grade == "C" {
return 2
} else if grade == "D+" {
return 1.5
} else if grade == "D" {
return 1
} else if grade == "F" {
return 0
} else {
return -1
}
}
이상으로 글을 마치며, 앞으로 진행될 과정이 나에게 큰 도움이 되었으면 좋겠다!
'기타' 카테고리의 다른 글
Adjust 정리 (0) | 2023.04.24 |
---|---|
[iOS 면접 실제 질문 모음] (4) | 2023.04.09 |
인텔리픽 모의면접 후기 (0) | 2023.03.10 |
쉽고 개인정보처리방침 (0) | 2023.02.02 |
Slack 신고 알림 화면 (0) | 2022.09.26 |