[Algorithm] HackerRank : Encryption

1Consumption·2020년 7월 12일
0

HackerRank Medium: Encryption

코드

func encryption(s: String) -> String {
    let rs = s.replacingOccurrences(of: " ", with: "")
    let min = Int(floor(sqrt(Double(rs.count))))
    let max = Int(ceil(sqrt(Double(rs.count))))
    var r = max
    var c = max
    var answer = ""
    
    for minValue in min...max {
        for maxValue in minValue...max {
            if maxValue * minValue >= rs.count && r * c > maxValue * minValue {
                r = minValue
                c = maxValue
            }
        }
    }
    
    var encrypted = [String](repeating: "", count: r)
    
    for (index, char) in rs.enumerated() {
        encrypted[index / c].append(char)
    }
    
    for col in 0..<c {
        for row in 0..<r {
            if encrypted[row].count > col {
                answer.append(String(Array(encrypted[row])[col]))
            }
        }
        answer.append(" ")
    }
    
    return answer
}

문제 설명

L은 공백을 제거한 문자열의 길이이다. row와 column은 다음 조건을 만족한다.

또한 row * column >= L을 만족하는 최소값이 row, column이 된다.

공백을 제거한 문자열을 column 자리수 만큼 나누면 row개의 문자열이 완성 된다.

if man was meant to stay on the ground god would have given us roots 이 문자열은
ifmanwas
meanttos
tayonthe
groundgo
dwouldha
vegivenu
sroots
이처럼 변환 된다.

이 변환된 값을 같은 column끼리 묶고, 다음 column 끼리 묶은 값 사이에 공백을 집어넣어 변환하면 된다.

imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau 이 리턴 된다.

풀이 과정

먼저 s의 공백이 제거된 rs를 만들고, rs를 통해 얻을 수 있는 row, column의 최소, 최대값을 구한다.
row * column의 값이 최소가 되는 row, column 값을 찾는다.

rs를 돌면서 column의 길이만큼 문자열을 잘라준다.

같은 column끼리 묶어주고, 현재 column에 글자가 없는 경우는 무시한다.

profile
개발자가되고싶어요

0개의 댓글