Scala를 활용한 성적 통계 및 데이터 처리 실습

성적 통계 실습

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)
  }
}

숫자 입력에 따른 요일 출력

요일 예시

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

면적 계산 예시

태그: Scala ListBuffer Source PrintWriter match

5월 21일 03:20에 게시됨