본문 바로가기

Algorithm

[Algorithm - Unicode] Kotlin - programmers Lv1 [ 시저 암호 ]

[ Algorithm Link ]

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

최종 코드 미리보기
fun solution2(str: String, n: Int): String {
    var answer = ""
    str.map {
        answer += when (it) {
            in 'a'..'z' -> ('a'.code + (it.code + n - 'a'.code) % ('z' - 'a' + 1)).toChar()
            in 'A'..'Z' -> ('A'.code + (it.code + n - 'A'.code) % ('Z' - 'A' + 1)).toChar()
            else -> {
                it
            }
        }
    }

    return answer
}

[ 작성 코드 정리 ] 

  • when + 범위지정을 통해 str 각각의 인덱스가 소문자 [a-z] or 대문자 [A-Z] 에 해당할 때를 구분해준다.
    • ✅ 'a'..'z' 와 같은 방식으로 문자열도 범위를 지정해서 it ( str 각각의 인덱스 ) 포함되는지 확인할 수 있다.
  • it 의 Unicode + n 이 알파뱃 맥시멈인 'z' or 'Z' 를 넘지 않도록 'z' - 'a'  + 1 ( 26 / 알파뱃 개수 ) 로 나눈 나머지만 더해준다
  • .toChar() 로 Char 타입으로 바꾼 뒤 answer 에 더해준다.

 

 

 

 

제출 코드 - 통과 → 리팩토링 전

 

fun solution (str: String, n: Int ) : String {
    var answer = ""
    str.map {
        var unicode = it.code
        if ( (97..122).contains(unicode) ) {
            answer += if (unicode + n > 122) {
                (97 + (unicode + n - 122) % 26).toChar()
            } else {
                (unicode + n ).toChar()
            }
        }  else if ((65..90).contains(unicode)) {
            answer += if (unicode + n > 90) {
                (66 + (unicode + n - 90) % 26).toChar()
            } else {
                (unicode + n ).toChar()
            }
        } else {
            answer += it
        }
    }
    return answer
}

 

[ 작성코드 정리]

  1. str,map{} 을 통해 str 각각의 문자를 Char.code 를 통해 유니코드 형식으로 변수 unicode에 할당해둔다.
  2. unicode가 'a' 의 unicode 97 부터 , 'z' 에 해당하는 122 까지 포함되는지 확인한다, 해당 범위에 변수 unicode 값이 포함된다면 소문자에 해당하는 것이기 때문.마찬가지로 A ( 65 ) ~ Z ( 90 ) 에 포함되는지 확인하여 unicode에 할당된 값이 대문자인지 확인한다.
  3. unicode에 해당하는 str 문자열의 특정 인덱스가 영문 대,소 문자에 해당될 경우, 변수 unicode에 n만큼 더해주고 Char타입으로 answer에 더해준다. 만약 변수 unicode + n의 Unicode값이 알파뱃의 마지막인 'z', 'Z'에 해당하는 Unicode를 넘어설 경우, 26(알파뱃 갯수)를 나눈 나머지를 'a' , 'A'  -1 Unicode에서 더해주고 answer에 추가한다.

 

 

 

알고리즘 회고

 

최근에 유니코드 관련 내용이 궁금해서 이것 저것 만져봤던게 문제 푸는데 큰 도움이 됐다. 꾸준히 여러가지 기능, 개념들을 학습 해야겠다

 

정규 표현식에 대해서 학습 해보면 더 좋은 방식으로 풀 수 있을 것 같다는 생각이 들었다.

 

' a ' 와 같은 작은 따옴표로 Char 타입 명시하기, when 범위 지정 과 같은 기본적인 내용 들을 앱개발 학습 초기에만 학습하고 사용을 안하다 보니 금방 잊어버렸다, 이번 알고리즘 문제를 풀면서 확실하게 복습한 것 같다.

 

str.split("") 와 같이 특별한 조건 없이 문자열을 나눌 떄는 split 함수를 사용하면 좋지 않다.

➡️ "ab" 문자열을 .split("") 하게 되면 [ , a, b, , ] 와 같이 문자열 앞, 뒤로 빈 요소가 들어가기 때문에 앞 뒤로 빈 요소를 넣어서 사용하지 않을 때는 null 오류가 나기 쉽기  때문이다.

 

 

 

 

 

 

 

 


[Reference]