프로그래밍/Algorithm

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

모지사바하 2015. 8. 3. 17:13
/**
* 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 > 1) {
zipString.append(cnt)
}

go(n + 1, 1, zipString)
}
}
}

go(0, 1, new StringBuilder)
}

def main(args: Array[String]) {
println(zipString("aaabccddeeef"))
}

}

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

가령 압축해야 할 문자열이 aaabccddeeef 라면 a3b1c2d2e3f 과 같이 압축되어야 한다.

압축결과로 만들어지는 문자열이 원래 문자열보다 짧아지지 않는 경우, 이 메소드는 원래 문자열을 그대로 반환해야한다.


회고

1. 문제를 적으면서 다시 읽다보니 문제를 약간 잘못 이해하고 풀은게 있음.

압축결과로 만들어지는 문자열이 원래 문자열보다 짧아지지 않는 경우, 이 메소드는 원래 문자열을 그대로 반환해야한다. 라는 부분이 있어서 

문자가 한개만 있는 경우는 아예 1이라는 숫자 자체를 제거했는데, 누구 맘대로 1을 제거했는지 모르겠네 ㅋㅋ 문제에는 그런 내용이 아예 없는데..


2. 쉽게 풀었는데 풀고나니 if 점철..

더나은 방법이 없을까?


3. scala 이기 때문에, for loop 대신 재귀함수를 작성해서 해결하고 있는데,, 제대로 하고있는거 맞겠지 ??