[ Algorithm Link ]
최종 코드 미리보기
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
}
[ 작성코드 정리]
- str,map{} 을 통해 str 각각의 문자를 Char.code 를 통해 유니코드 형식으로 변수 unicode에 할당해둔다.
- unicode가 'a' 의 unicode 97 부터 , 'z' 에 해당하는 122 까지 포함되는지 확인한다, 해당 범위에 변수 unicode 값이 포함된다면 소문자에 해당하는 것이기 때문.마찬가지로 A ( 65 ) ~ Z ( 90 ) 에 포함되는지 확인하여 unicode에 할당된 값이 대문자인지 확인한다.
- 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]
'Algorithm' 카테고리의 다른 글
[Algorithm - Method Chaining ] Kotlin - programmers Lv1 [ 신규아이디 추천 ] (0) | 2024.04.25 |
---|---|
[Algorithm - Stack] Kotlin - programmers Lv1 [ 크레인 게임 ] (0) | 2024.04.23 |
[Algorithm] Kotlin / Programmers Lv0 [ 평행 ] (0) | 2024.04.06 |
[Algorithm] Kotlin - programmers Lv0 [ 안전지대 ] - 테스트 8, 9번 에러 해결 (1) | 2024.03.20 |
[Algorithm] Kotlin - programmers lv0 [ 겹치는 선분의 길이 ] - 테스트 1, 9번 오류 해결 (0) | 2024.03.15 |