본문 바로가기
개발노트/프로그래머스

문자열 정렬하기(1) 코틀린

by 시계속세상은아직돌아가는중 2023. 7. 31.

https://school.programmers.co.kr/learn/courses/30/lessons/120850

 

프로그래머스

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

programmers.co.kr

package com.example.answersheet

fun main() {

    var str = "p2o4i8gj2"
    var number = sol(str)

    println(str)


    println("$number")


}

fun sol(my_string: String): MutableList<Int> {
    var numberList = mutableListOf<Int>()

    for (i in my_string) {
        if (i.toInt() in 48..57) {
            numberList.add(i.toString().toInt())
        }
    }

    numberList.sort()
   return  numberList
}
class Solution {
    fun solution(my_string: String): MutableList<Int> {
       var numberList = mutableListOf<Int>()

    for (i in my_string) {
        if (i.toInt() in 48..57) {
            numberList.add(i.toString().toInt())
        }
    }

    numberList.sort()
   return  numberList
    }
}

내가 결론적으로 풀게된 형태는 MutableList형태를 return하는 함수로,

 

for문에서

i.toInt()는 i를 Int값으로 변환해주는 즉 아스키 코드 값으로 변환해주는 식이다.

 

그러므로 48..57 즉 48 이상 57이하일 때 = ASCII에서 0부터 9를 나타내는 것으로, 해당 for문을 돌면서 my_string의 요소들을 돌면서 숫자들만 반환하게 하는 식이 완성된다.

 

아스키 코드 48 .. 57 범위에는 숫자 0~9만 포함되어있기 때문에 이외는 numberList에 add되지 않는다.


numberList에 해당 값을

numberList.add(i.toString().toInt())

 

1차로 string으로 받은 뒤 받은 문자열을 int형으로 변환한다.

이는 스트링에서 정수를 추출했기 때문이다.

정수를 추출하였다면 int형태로 받은 뒤 비교하는게 더 쉬워진다.

 

해당 문제를 풀면서 수 많은 오류를 범했는데, 그 중 대표적인 오류는

var number:String? = ""

for (i in str) {
        if (i.toInt() in 48..57) {
            number += i
        }
    }

 위 부분을 list형태 말고 string으로 += 해서 스트링에서 다시 list로 배치해서 풀려고 했었다. 이는 심각한 시간낭비였다.

애초에 lsit에 해당 string을 int형태로 저장해주면 되는 것 이었다.

 

해당 문제를 sort로 간단하게 정렬을 끝내서 아쉬워서 for문을 통해 한 번 더 풀어보았다.

 

fun sol(my_string: String): MutableList<Int> {
    var numberList = mutableListOf<Int>()

    for (i in my_string) {
        if (i.toInt() in 48..57) {
            numberList.add(i.toString().toInt())
        }
    }

    for (i in 0 until numberList.size-1){
        for(j in 0 until  numberList.size-i-1){
             val temp = numberList[j]
            if(numberList[j]>numberList[j+1]){
                numberList[j] = numberList[j+1]
                numberList[j+1] = temp
            }
        }
    }
   return  numberList
}

 

해당 for문을 해석하자면 이러하다

 

1. size-1의 인덱스 미만(untill을 사용해서 0 <= untill <.size-1)을 선언한다.

 

이는 불필요한 마지막 인덱스의 수 비교를 하지 않도록 한다.

size-1은 인덱스에 접근하기 쉽게 하기 위한 수식이며(0부터 시작하기 위해)

해당 예시배열에서 인덱스는 0,1,2,3인데, 인덱스 2와 3을 비교했다면 3과 다른 수를 비교할 필요가 없기 때문이다.

 

또한 설계단계에서 실수해서 마지막 인덱스 [3]을 존재하지 않는 인덱스 [4]와 비교하게 된다면, 운나쁘게 정말 최후의 최후에 들어가게 된다면 오류가 발생하게 될 것이다.

 

 

2.중첩for문을 사용해 범위를 좁혀가며 numberList[0]이 numberList[1]보다 크다면 [0]과 [1]의 위치를 바꿔 정렬한다.

 

만약 중첩문 없이 

for(i in 0 untill numberList.size-1{

  var temp = numberList[i]
  
if(numberList[i] > numberList[i+1]{

  numberList[i] = numberList[+1]
  numberList[i+1] = temp
  
  }
  
}

였다면 예시 스트링

var str = "p2o4i8gj2"

에서 추출한 숫자 2,4,8,2에서 정렬이 된다면 

 

2482

2482

2428

 

의 순서로 결과가 나올 것이다.

 

하지만 중첩문을 이용하게 된다면,

 

i = 0 

j in 0 until .size-1

 

2482

2482

2428

 

이후

i = 1

j in 0 untill .size-2

 

예시 리스트의 사이즈는 4이므로, 사이즈는 -2의 인덱스 [j ] = [1]과 [j+1] = [2]까지 비교를 하게 된다

 

2428

2248

 

로 다시 한 번 정렬이 된다.

 

 

 

참고 블로그

1. 문자열 목록으로 정리하기

https://www.techiedelight.com/ko/convert-string-to-list-kotlin/

 

Kotlin에서 쉼표로 구분된 문자열을 목록으로 변환

이 기사에서는 Kotlin에서 쉼표로 구분된 문자열을 목록으로 변환하는 다양한 방법을 살펴봅니다. Kotlin 문자열을 분할하는 표준 방법은 split() 기능. 우리는 사용할 수 있습니다 split() 다음과 같은

www.techiedelight.com

2. joinToString

https://kkh0977.tistory.com/682

 

53. (kotlin/코틀린) joinToString 사용해서 배열 데이터 출력 형식 변경 실시 - arrayOf , ArrayList

/* =========================== */ [개발 환경 설정] ​ 개발 툴 : Eclipse 개발 언어 : kotlin /* =========================== */ ​ /* =========================== */ [소스 코드] package ex1 //===== [코틀린 메인 시작 부분] ===== fun

kkh0977.tistory.com

3. 인트 추출

https://codechacha.com/ko/kotlin-extract-integers-from-string/

 

Kotlin - 문자열에서 숫자(int)만 추출하는 방법

String에서 Integer만 추출하는 방법을 소개합니다. 다음 코드는 정규표현식으로 Integer만 추출하는 코드입니다. `replace()`에 정규표현식과 정규표현식에 해당하는 문자와 변경할 String을 전달합니다.

codechacha.com