전체 글 476

Data Access 기술 선정

정상혁님이 쓰신 글 Java에서 XML없이 SQL개발하기 을 보고 Mybatis 를 버려야겠다는 생각을 했다. 정상혁님의 글 내용중에도 있지만, 현재 Mybatis 를 썼을 때 발생하는 장점이 많이 퇴색했다. Mybatis 는 조인된 결과를 담는 ResultMap 과 내부에서 쓰는 Association 같은 것을이 너무 불편했고, 쿼리에선 값이 정상적으로 조회되는데 Mybatis 결과가 객체에 정상적으로 셋팅되지 않을때, 이유를 알기 어렵고, 쿼리 결과를 개발자가 직접 핸들링 하기가 힘들다. 또한 Mybatis 에서 제공되는 기법들은 Spring JDBC에서도 모두 제공되고 있다. 그런데, 국내에서는 Mybatis 가 거의 관례처럼 돼버렸다. 요즘은 그래도 김영한 ORM 전도사님께서 국내최초로 ORM 책..

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..