본문 바로가기
프로그래밍언어/알고리즘

알고리즘 4편 정규표현식 말고 아스키 코드로 문자 숫자 필터링하기 코틀린(kotlin) 으로 시작하는 문제해결방법

by by 앵과장 2021. 9. 14.
반응형

안녕하세요
앵과장입니다.



모든 문제풀이는 kotlin 으로 진행하겠습니다.
오늘은 문자를 처리할때 알파뱃 대소문자만 필터링할때 또는 숫자만 처리할때 필요한 문자열처리에 대해서 알아보려고합니다.

빈도수는 자주 사용되는점 인지하세요!!

문자열을 필터링 할때 보통 어떻게 진행 하시나요?

문자열 필터링

저는 주로 regex 정규표현식으로 처리를 한적이 많습니다.
많은 샘플들이 정규표현식을 선호하기도합니다.
인터넷 검색해보면 많은 사람들이 정규표현식을 사랑합니다.
원하는 문자열에 형태를 validation 할수 있습니다.

오늘의 문제  

영어 알파뱃과 특수문자로 이루어진 문자열중에서
영어 알파뱃만 뒤집고 특수문자는 자기자리에 있는 문자열로 출력해보세요

예시)
A!P!P!L!e
e!L!P!P!A

 val regex = "^[a-zA-Z]*\$".toRegex() fun solution(a: String): String {
    var answer = ""; 
    var index=0 
    var alphabet = mutableListOf<Char>() 
    var result = mutableListOf<Char>() //알파뱃에 부함하는 데이터만 리스트로 생성 
    for (item in a.toCharArray()){
        if(item.toString().matches(regex)){
            alphabet.add(item) 
        } 
    } //알파뱃 리스트 뒤집기 
    val alphabetArray = reverse(alphabet.joinToString("")).toCharArray() //전달받은 문자열 loop 돌리면서 정규표현식에 걸리면 뒤집힌 배열에 0번째부터 저장 
    for (item in a.toCharArray()){
        if(item.toString().matches(regex)){
            result.add(alphabetArray.get(index)) index++ 
        }else{
            result.add(item) 
        } 
    } //특수문자를 제외한 뒤집힌 영문자 문자열 체이닝 
    answer =result.joinToString("") 
    return answer; 
} 

fun reverse(str:String):String{
    val stringToChar = str.toCharArray() 
    var listOfTempChar = mutableListOf<Char>() 
    stringToChar.forEachIndexed{
        index, charString -> listOfTempChar.add(index,stringToChar.get(stringToChar.lastIndex-index)) 
    } 
    return listOfTempChar.joinToString("") 
}

문자열 에서 영대소문자 만가져올때 어떻게 하시나요?
특수문자 필터링 또는 숫자만 가져올때는 어떻게하면될까요?

보통 정규표현식을 사용하게됩니다.
개발된 소스코드를 보면 많은 부분 정규표현식을 사용한 부분들이 있고 다양한 샘플소스에서도 정규표현으로 처리된 소스레벨을 보게됩니다.

오늘은 아스키코드를 사용하여 필터링 하는 방법에 대해서 알아보도록 하겠습니다.

아스키 코드란?

ASCII(American Standard Code for Information Interchange)의 줄임말이다.
이름에서부터 알 수 있듯이
American을 위한 문자 집합이고
이는 영문 키보드로 입력할 수 있는
모든 기호가 할당되어 있는 부호 체계이다.
그래서 000(0x00)부터 127(0x7F)까지 총 128개의 부호가 사용된다.

알고리즘에서는 복잡도를 줄이기위해서 많은부분들 최적화된 형태를 표현하는데
아스키코드도 그중하나라고 이해하시면될것같습니다.

아스키코드로 해봤던적이 거의 없긴한데 아 ~~
Javascript 구현할때 keyup, keydown 할떄 한참 브라우저마다 크로스브라우징 문제로 특정 이벤트 키값이 인식되지 않아 브라우저마다 인식되는 키로 변조할때 사용했던기억이 있는데 그떄 이후 사용한 적이 없는것으로 기억됩니다.

그럼 아스키 코드로 한번 해당 문제를 풀어보도록 하겠습니다.

fun solution(a: String): String {
    val chars = a.toCharArray()
    for (k:Int in 0 until chars.size / 2) {
        val tmp = chars[k]
        val last = chars[chars.size - k - 1]
        if ((tmp.code in 91..96) || tmp.code < 65 
        || 122 < tmp.code || (last.code in 91..96) 
        || last.code < 65 || 122 < last.code) {
            continue 
        }
        chars[k] = last chars[chars.size - k - 1] = tmp 
    }
    return String(chars); 
}

참 쉽죠잉!!

code
char 의 문자에 해당하는 아스키 코드를 반환합니다.

배열로변경한 char을 정규표현식이 아닌 아스키코드 범위에서 대소문자를 구별해서 변경하는 아주 이해만하면 간단한 부분입니다.

여러분들도 재미있는 알고리즘으로 하나씩 발전해보세요

 

다음 알고리즘 클릭

 

알고리즘 5편 특정 문자열 찾기 및 최소거리 탐색 코틀린으로 시작하는 문제 해결

안녕하세요 앵과장입니다. 알고리즘 잘해쳐나가고 있나요? 저도 개발을 이렇게 나이먹고 문제해결방법 하고 있을줄은 몰랐습니다. 아에 못할거라고 생각하고 접근을 안했는데 하니까 됩니다.

angryfullstack.tistory.com