성적 통계 실습
1. 각 학생의 총점과 평균 계산
2. 각 과목별 평균 계산
3. 총점 상위 3명 및 단일 과목 상위 3명 추출 후 파일 저장
해결 접근법:
1. 텍스트 파일을 줄 단위로 읽어오기

2. 데이터 처리
(1) 각 학생의 총점과 평균 계산
import scala.collection.mutable.ListBuffer
import scala.io.Source
case class Student(name: String, korean: Double, math: Double, english: Double, total: Double, average: Double)
object GradeAnalytics {
def main(args: Array[String]): Unit = {
// 가변 리스트로 모든 학생 정보 저장
val studentList = ListBuffer[Student]()
// 1. 파일을 줄 단위로 읽기
val source = Source.fromFile("scores.txt")
val linesIterator = source.getLines()
linesIterator.next() // 첫 번째 줄(헤더) 건너뛰기
while (linesIterator.hasNext) {
val data = linesIterator.next().split(",") // 쉼표로 구분
val name = data(0)
val korean = data(1).toDouble
val math = data(2).toDouble
val english = data(3).toDouble
val total = korean + math + english
val average = total / 3
val student = Student(name, korean, math, english, total, average)
studentList += student
}
source.close()
studentList.foreach(println)
}
}
(2) 각 과목의 평균 계산

(3) 총점 상위 3명
(4) 단일 과목 상위 3명

3. 결과를 파일로 출력


전체 코드:
package examples
import java.io.PrintWriter
import scala.collection.mutable.ListBuffer
import scala.io.Source
case class Student(name: String, korean: Double, math: Double, english: Double, total: Double, average: Double)
object GradeStatistics {
def main(args: Array[String]): Unit = {
val studentList = ListBuffer[Student]()
// 파일 읽기
val source = Source.fromFile("scores.txt")
val iterator = source.getLines()
iterator.next() // 헤더 제거
while (iterator.hasNext) {
val parts = iterator.next().split(",") // 쉼표 구분자
val name = parts(0)
val korean = parts(1).toDouble
val math = parts(2).toDouble
val english = parts(3).toDouble
val total = korean + math + english
val average = total / 3
studentList += Student(name, korean, math, english, total, average)
}
source.close()
// 과목별 평균 계산
var totalKorean = 0.0
var totalMath = 0.0
var totalEnglish = 0.0
studentList.foreach { s =>
totalKorean += s.korean
totalMath += s.math
totalEnglish += s.english
}
println("국어 평균:", totalKorean / studentList.length)
println("수학 평균:", totalMath / studentList.length)
println("영어 평균:", totalEnglish / studentList.length)
// 총점 상위 3명
val topTotal = studentList.sortWith((a, b) => a.total > b.total).slice(0, 3)
println("총점 상위 3명:")
topTotal.foreach(println)
// 과목별 상위 3명
val topKorean = studentList.sortWith((a, b) => a.korean > b.korean).slice(0, 3)
println("국어 상위 3명:")
topKorean.foreach(println)
val topMath = studentList.sortWith((a, b) => a.math > b.math).slice(0, 3)
println("수학 상위 3명:")
topMath.foreach(println)
val topEnglish = studentList.sortWith((a, b) => a.english > b.english).slice(0, 3)
println("영어 상위 3명:")
topEnglish.foreach(println)
// 파일 쓰기
val writer = new PrintWriter("grade_statistics_result.txt")
writer.println("이름, 국어, 수학, 영어, 총점, 평균")
studentList.foreach { s =>
val avg = f"${s.average}%.1f"
writer.println(s"${s.name}, ${s.korean}, ${s.math}, ${s.english}, ${s.total}, ${avg}")
}
writer.println("-" * 40)
writer.println("총점 상위 3명:")
topTotal.foreach { s =>
val avg = f"${s.average}%.1f"
writer.println(s"${s.name}, ${s.korean}, ${s.math}, ${s.english}, ${s.total}, ${avg}")
}
writer.println("-" * 40)
writer.println("국어 상위 3명:")
topKorean.foreach { s =>
val avg = f"${s.average}%.1f"
writer.println(s"${s.name}, ${s.korean}, ${s.math}, ${s.english}, ${s.total}, ${avg}")
}
writer.println("-" * 40)
writer.println("수학 상위 3명:")
topMath.foreach { s =>
val avg = f"${s.average}%.1f"
writer.println(s"${s.name}, ${s.korean}, ${s.math}, ${s.english}, ${s.total}, ${avg}")
}
writer.println("-" * 40)
writer.println("영어 상위 3명:")
topEnglish.foreach { s =>
val avg = f"${s.average}%.1f"
writer.println(s"${s.name}, ${s.korean}, ${s.math}, ${s.english}, ${s.total}, ${avg}")
}
writer.println("-" * 40)
writer.close()
}
}
주민등록번호로 출신 지역 조회
주민등록번호 앞 두 자리를 기준으로 해당 지역을 출력합니다:
예: 42: 후베이성, 33: 저장성, 11: 베이징, 31: 상하이
object IDCardRegionLookup {
def main(args: Array[String]): Unit = {
val idCode = "42005200210030051".substring(0, 2)
println("추출된 코드: " + idCode)
val region = idCode match {
case "11" => "베이징"
case "12" => "톈진"
case "13" => "허베이성"
case "14" => "산시성"
case "15" => "내몽골"
case "21" => "랴오닝성"
case "22" => "지린성"
case "23" => "헤이룽장성"
case "31" => "상하이"
case "32" => "장쑤성"
case "33" => "저장성"
case "34" => "안후이성"
case "35" => "푸젠성"
case "36" => "장시성"
case "37" => "산둥성"
case "41" => "허난성"
case "42" => "후베이성"
case "43" => "후난성"
case "44" => "광둥성"
case "45" => "광시성"
case "46" => "하이난성"
case "50" => "충칭"
case "51" => "쓰촨성"
case "52" => "구이저우성"
case "53" => "윈난성"
case "54" => "티베트"
case "61" => "산시성"
case "62" => "간쑤성"
case "63" => "칭하이성"
case "64" => "닝샤"
case "65" => "신장"
case "71" => "타이완"
case "81" => "홍콩"
case "82" => "마카오"
case "91" => "해외"
case _ => "알 수 없음"
}
println("해당 지역: " + region)
}
}
숫자 입력에 따른 요일 출력

정사각형, 직사각형, 사다리꼴 면적 계산
