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
'개발노트 > 프로그래머스' 카테고리의 다른 글
인덱스 바꾸기 코틀린 (0) | 2023.07.31 |
---|---|
대문자와와 소문자 코틀린 (0) | 2023.07.31 |
중복된 문자 제거하기 코틀린 (0) | 2023.07.31 |
프로그래머스 최대값만들기 (0) | 2023.07.28 |
프로그래머스 점위치 (0) | 2023.07.28 |