Scala 프로그래밍 과제 4

   

  • 이번 Scala 프로그래밍 과제는 Scala의 주요 자료구조 중 하나인 리스트(List)를 다루는 방법을 익히는 것입니다. 실습 내용을 숙지한 후 실습 내용을 통해 배운 리스트 관련 메서드, 연산자를 활용하여 과제를 수행하세요.
  • 단, 어떠한 경우에도 함수 외부의 변수를 사용하거나 함수 내부에서 배정문(assignment statement)을 사용해서 변수의 값을 지정해서는 안됩니다.
  • 제출방법 : 작성한 코드를 ‘hw4.scala‘라는 이름으로 저장한 후 아래 출력 화면을 캡쳐한 이미지와 함께 압축하여 ‘학번_hw4.zip‘로 저장하세요. 압축된 파일을 이루리 과제 게시판에 업로드하면 됩니다.
    • 작성한 코드를 hw4.scala라는 하나의 파일 안에 작성해주세요. 하나의 scala 파일 안에 여러개의 class, object, 함수를 정의할 수 있습니다.
    • 모든 필드들을 구현한 후 object 안에 def main()을 통해 출력해주세요.
    • 또한 파일을 실행한 Run 출력만을 캡쳐해서 scala 파일과 압축해주세요.
  • 제출기한 : 6월 3일 월요일 11:59pm

       

과제 진행 시 어려운 점이 있으면 Ed Discussion 게시판을 이용해 질문하세요. 게시판을 통해 하기 어려운 질문이라면 아래 TA 이메일을 통해 문의하시기 바랍니다.

   

조교: Aditi(diwakarmzu@gmail.com)

   


  1. 두 개의 리스트를 원소 단위로 더하여 하나의 리스트로 반환하는 함수 list_add을 작성하세요. (단, 리스트의 끝에서부터 더합니다. 둘 중 하나의 리스트가 더 길 땐 남는 값을 그대로 출력합니다.)
  • 함수 형태
def list_add(l1: List[Int], l2: List[Int]): List[Int] = {
    // ?
}
  • 실행 예시
scala> list_add(List(1, 2, 3), List(1, 2, 3, 4, 5))
res1: List[Int] = List(8, 6, 4, 2, 1)

   


  1. 리스트에 정수형 숫자 $m$를 추가하고 정렬하여 반환하는 함수 insort를 작성하세요.
  • 함수 형태
def insort(l: List[Int], m: Int): List[Int] = {
    // ?
}
  • 실행 예시
scala> insort(List(1, 2, 4, 5), 3)
res1: List[Int] = List(1, 2, 3, 4, 5)

   


  1. 리스트의 끝에서부터 $i$개의 원소를 포함하는 리스트를 반환하는 함수 ltake를 작성하세요.
  • 함수 형태
def ltake(l: List[Int], i: Int): List[Int] = {
    // ?
}
  • 실행 예시
scala> ltake(List(1, 2, 3, 4), 2)
res1: List[Int] = List(3, 4)

   


  1. 정수 리스트 $l$과 정수를 입력받아 불 값을 출력하는 함수 $f$를 입력받아 리스트의 모든 원소가 $f$를 적용했을 때 true로 평가되면 true, 아니면 false를 반환하는 함수 lall를 작성하세요.
  • 함수 형태
def lall(f: Int => Boolean, l: List[Int]): Boolean = {
    // ?
}
  • 실행 예시
scala> lall(x => x > 0, List(1, 2, 3, 4))
res1: Boolean = true

   


  1. 리스트의 모든 원소에 함수 $f$를 적용한 결과값들의 리스트를 반환하는 함수 lmap을 작성하세요.
  • 함수 형태
def lmap(f: Int => Int, l: List[Int]): List[Int] = {
    // ?
}
  • 실행 예시
scala> lmap(x => x + 1, List(1, 2, 3))
res1: List[Int] = List(2, 3, 4)

   


  1. 리스트의 모든 원소에 함수 $f$를 적용하고 결과값이 true인 값들만 모아 리스트로 반환하는 함수 lfilter를 작성하세요.
  • 함수 형태
def lfilter(f:Int => Boolean, l: List[Int]): List[Int] = {
    // ?
}
  • 실행 예시
scala> lfilter(x => x > 2, List(1, 2, 3))
res5: List[Int] = List(3)

   


  1. 정수 $n$과 함수 $f$를 입력받아, $f(n-1), f(n-2), \ldots, f(0)$를 순서대로 갖는 리스트를 반환하는 함수 ltabulate를 작성하세요.
  • 함수 형태
def ltabulate(n: Int, f: Int => Int): List[Int] = {
      // ?
}
  • 실행 예시
scala> ltabulate(4, (x:Int) => x * x)
res0: List[Int] = List(9, 4, 1, 0)

   


  1. 리스트를 반대로 반환하는 함수 lrev를 작성하세요.
  • 함수 형태
def lrev(l: List[Int]): List[Int] = {
    // ?
}
  • 실행 예시
scala> lrev(List(1, 2, 3))
res1: List[Int] = List(3, 2, 1)

   


  1. 리스트 여러 개를 하나의 리스트로 합쳐 반환합니다.
  • 함수 형태
def lconcat(l: List[List[Int]]): List[Int] = {
    // ?
}
  • 실행 예시
scala> lconcat(List(List(1, 2, 3), List(4, 5, 6)))
res6: List[Int] = List(1, 2, 3, 4, 5, 6)

   


  1. 시작 값 $e$와 리스트 $l = (x_1, x_2, \ldots, x_n)$, 함수 $f$가 주어졌을 때 아래 식을 계산하는 함수 lfoldr를 작성하세요. \(f(x_1, \ldots, f(x_{n−1}, f(x_n, e)))\)
  • 함수 형태
def lfoldr(f: (Int, Int) => Int, l: List[Int], e: Int): Int = {
    // ?
}
  • 실행 예시
scala> lfoldr((x:Int, y:Int) => x - y, List(1, 2, 3), 0)
res1: Int = 2

   


  1. 리스트 두 개를 하나의 리스트로 묶어 반환하는 함수 lzip을 작성하세요. (단, 리스트의 끝에서부터 묶어나가야 합니다. 둘 중 하나의 리스트가 더 길면 남는 원소는 버립니다.)
  • 함수 형태
def lzip(a: List[String], b: List[Int]): List[(String, Int)] = {
    // ?
}
  • 실행 예시
scala> lzip(List("A", "B", "C", "D"), List(1, 2, 3, 4, 5, 6))
res32: List[(String, Int)] = List((A,3), (B,4), (C,5), (D,6))

   


  1. 주어진 리스트를 홀수 번째 원소들의 리스트와 짝수 번째 원소들의 리스트로 묶어 반환하는 함수 split를 작성하세요.
  • 함수 형태
def split(l: List[Int]): (List[Int], List[Int]) = {
    // ?
}
  • 실행 예시
scala> split(List(1, 2, 3, 4, 5))
res33: (List[Int], List[Int]) = (List(1, 3, 5),List(2, 4))

   


  1. 두 개의 리스트의 데카르트 곱(Cartesian product)을 반환하는 함수 cartprod를 작성하세요.
  • 함수 형태
def cartprod(l1: List[Int], l2: List[Int]): List[(Int, Int)] = {
    // ?
}
  • 실행 예시
scala> cartprod(List(1, 2), List(3, 4, 5))
res34: List[(Int, Int)] = List((1,3), (1,4), (1,5), (2,3), (2,4), (2,5))