프로그래밍 199

스칼라의 자료구조 공부중 - 자바와의 비교.

스칼라의 단방향 연결 리스트를 보다가, 자바로 먼저 구현해봐야겠다는 생각에 자바로 초간단 단방향 연결 리스트를 구현해보았다. package kwo2002.java; /** * Created by kwo2002 on 2015-08-06. */ public class SingleNode { private SingleNode next; private E e; public SingleNode(E e) { e = this.e; } public SingleNode(E e, SingleNode next) { e = this.e; next = this.next; } public void appendToTail(E e) { SingleNode end = new SingleNode(e); SingleNode current..

M X N 행렬의 한 원소가 0이라면, 해당 원소가 속한 행과 열의 모든 원소를 0으로 바꾸는 함수를 작성하라

/** * Created by kwo2002 on 2015-08-04. */ object MatrixZero { def getZeroElemIndex(matrix: Array[Array[Int]]): Array[Array[Int]] = { def go(i: Int, j: Int): (Int, Int) = { if (i > matrix.length) { (-1, -1) } else { if (matrix(i)(j) == 0) { (i, j) } else { if (j >= matrix(i).length - 1) { go(i + 1, 0) } else { go(i, j + 1) } } } } val zeroIndex: (Int, Int) = go(0, 0) if (zeroIndex._1 >= 0) { mod..

curry의 변환을 역으로 수행하는 고차 함수를 구현하라.

def uncurry[A, B, C](f: A => B => C): (A, B) => C = { (a, b) => f(a).apply(b) }회고.좀 헤맸다. a와 b를 인자로 받으면,함수 f를 호출하여 결과로 B를 인자로 받고 C를 리턴하는 함수를 리턴 받고,리턴 받은 함수에 b를 인자로 넘겨서 C를 리턴 받도록 처리함. 풀고보니 간단한데, 함수형 프로그래밍에 익숙치 않아서 헤맸던듯..

Array[A]가 주어진 비교 함수에 의거해서 정렬되어 있는지 점검하는 함수를 구현하라.

package scala /** * Created by kwo2002 on 2015-08-04. */ object Chapter2 { def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = { def go(n: Int): Boolean = { if (n >= as.length - 1) { true } else { if (ordered(as(n), as(n + 1))) { go(n + 1) } else { false } } } go(0) } def main(args: Array[String]) { print(isSorted[Int](Array(1, 3, 2, 9), (a, b) => if (a < b) true else false )) }..

n번째 피보나치 수를 돌려주는 재귀 함수를 작성하라

/** * Created by kwo2002 on 2015-08-04. */ object Fibonacci { def fibonacci(n: Int): Int = { def go(a: Int, b: Int): Int = { if(b >= n) { b }else { print(b + " ") go(b, a + b) } } print(0 + " ") go(0, 1) } def main(args: Array[String]) { println(fibonacci(25)) } } 회고1. n번째 피보나치 수를 돌려주는 재귀 함수 자체는 아주 쉬웠으나,피보나치 수열을 print 해주는건 의외로 약간의 고민이 필요했음. 2. 재귀 호출로 go의 b인자가 결국 피보나치 수열인건데, 첫번째 피보나치 수열 (위에서는 0) ..

같은 문자가 반복될 경우, 그 횟수를 사용해 문자열을 압축하는 메소드를 구현하라.(3)

def zipString2(str: String): String = { def go(i: Int, li: Int, cnt: Int, zipStr: StringBuilder): String = { if (i >= str.length) { zipStr.append(str.charAt(li)) zipStr.append(cnt) zipStr.toString() } else { if (str.charAt(li) == str.charAt(i)) { go(i + 1, li, cnt + 1, zipStr) } else { zipStr.append(str.charAt(li)) zipStr.append(cnt) go(i + 1, i, 1, zipStr) } } } val zipStr: String = go(1, 0, 1,..

같은 문자가 반복될 경우, 그 횟수를 사용해 문자열을 압축하는 메소드를 구현하라.(2)

import scala.StringBuilder /** * Created by kwo2002 on 2015-08-03. */ object ZipString { def zipString(str: String): String = { def go(n: Int, cnt: Int, zipString: StringBuilder): String = { if (cnt == 1) { zipString.append(str.charAt(n)) } if (n >= str.length - 1) { zipString.append(cnt) zipString.toString() } else { if (str.charAt(n) == str.charAt(n + 1)) { go(n + 1, cnt + 1, zipString) } else..

같은 문자가 반복될 경우, 그 횟수를 사용해 문자열을 압축하는 메소드를 구현하라.

/** * Created by kwo2002 on 2015-08-03. */ object ZipString { def zipString(str: String): String = { def go(n: Int, cnt: Int, zipString: StringBuilder): String = { if (cnt == 1) { zipString.append(str.charAt(n)) } if (n >= str.length - 1) { if (cnt > 1) { zipString.append(cnt) } zipString.toString() } else { if (str.charAt(n) == str.charAt(n + 1)) { go(n + 1, cnt + 1, zipString) } else { if (cnt..