티스토리 뷰

코드카타

 

가장 큰 수

 

문제

 

numbers의 최대 길이는 100,000이기에 주어진 수에서

가능한 모든 순열을 만드는 방법은 시간초과를 발생시킨다.

 

 

입출력 예시

 

[0, 0, 0], 0 < 모든 숫자가 0으로 들어왔을 때의 경우를 추가

 

 

풀이

class Solution {
    fun solution(numbers: IntArray): String {
    
        var res = numbers.map { it.toString() }
            .sortedWith { a, b -> (b + a).compareTo(a + b) }
            .joinToString("")
            
        return if (res[0] == '0') "0" else res
    }
}

정수를 이어붙이기 위해 정수를 모두 문자열로 변환해준다.

 

그 다음 구분자를 통해 정수 문자열을 2개씩 결합하며 비교한 뒤

비교 결과에 따라 numbers의 요소를 정렬한다.

 

결과 문자열이 0으로 시작한다면 numbers의 요소는 전부 0에 해당한다.

 

 

CompareTo

fun main() {
    val num1 = 10
    val num2 = 5

    println(num1.compareTo(num2)) // 출력: 1 (num1 > num2)
    println(num2.compareTo(num1)) // 출력: -1 (num2 < num1)
    println(num1.compareTo(10))   // 출력: 0 (num1 == 10)
}

compareTo 함수는 객체의 비교를 수행하고 그 결과에 따른 정수 값을 반환한다.

 

 

문자열 비교

fun main() {
    println("106" > "610") // false
    println("62" > "26") // true
    println("210" > "102") // true
}

문자열은 맨 앞의 글자부터 순서대로 각 문자의 유니코드를 기준으로 비교한다.

 

 

sortedWith

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)

    // 오름차순 정렬
    val ascending = numbers.sortedWith { a, b -> a.compareTo(b) }
    println(ascending) // [1, 2, 3, 4, 5]

    // 내림차순 정렬
    val descending = numbers.sortedWith { a, b -> b.compareTo(a) }
    println(descending) // [5, 4, 3, 2, 1]
}

정의한 비교자(Comparator)를 기반으로 요소들을 정렬한다.

(여기서 compareTo함수는 비교자에 해당한다.)

 

람다식이 1을 반환하면 좌측 요소를 우측 요소 앞에 정렬시키고, 

-1을 반환하면 우측 요소를 좌측 요소 앞에 정렬시킨다.

 

0을 반환할 때는 두 요소가 같은 경우이기에 정렬 순서를 유지한다.

 

 

비교 과정

(a는 좌측 요소, b는 우측 요소에 해당한다.)

a = "6", b = "10" -> ( "106" ).compareTo( "610" ) = -1 -> "10"을 "6"앞에 정렬시킨다.

a = "10", b = "2" -> ( "210" ).compareTo( "102" ) = 1 -> "10"를 "2"앞에 정렬시킨다.  

a = "2", b = "6" -> ( "62" ).compareTo( "26" ) = 1 -> "2"를 "6"앞에 정렬시킨다.

["6", "10", "2"] -> ["6", "2", "10"]

numbers가 [6, 2, 10]에 해당할 때 문자열을 요소로 가지는 배열의 정렬은 다음과 같이 이뤄진다.

 

 

 

회고

정렬이 어떤식으로 이루어지는지 도저히 이해가 안되서

함수 하나하나 뜯어보면서 로직을 이해하였다.

 

요새 로직 이해하기 왤케 어렵지...

 


 

챌린지반 3주차 세션 정리

 

디자인 패턴

 

Singleton 패턴

싱글톤 패턴은 프로그램 내에 인스턴스가 하나만 존재하도록 하고,

어디서든지 인스턴스에 접근할 수 있도록 하는 디자인 패턴이다.

 

인스턴스를 사용하기 전까지 객체가 생성되지 않으며,

멀티 스레드 환경에서 사용하면 동기화를 보장하지 않는다는 특징이 있다.

 

 

코틀린에서는 object로 간단하게 싱글톤 객체를 정의할 수 있다.

 

 

Strategy 패턴

 

전략 패턴은 객체의 행동을 캡슐화하여 동적으로

행위를 변경할 수 있도록 하는 디자인 패턴이다.

 

공통된 객체의 행동을 인터페이스에 정의한 뒤 인터페이스를 상속받은

클래스에 객체의 행동을 구현하여 캡슐화를 진행한다.

 

 

Observer 패턴

 

객체의 상태 변화를 관찰하는 옵저버들이 있고,

그 상태 변화가 발생할 때마다 옵저버들에게 자동으로

통보가 이루어지도록 하는 디자인 패턴이다.

 

채널 구독과 알림 시스템이 이 패턴으로 구현된다.

 

 

Decorator 패턴

 

객체의 결합을 통해 기능을 동적으로 확장할 수 있게 해준다.

스트리밍 시스템 같은 거 구현할 때 쓰이는 디자인 패턴이다.

 

 

MVVM 패턴

 

개요

 

개발하다 보면 계속해서 요구사항이 들어오게 되는데 

최대한 적은 수정으로 요구사항들을 해결하기 위해 사용하는

디자인 패턴이 바로 MVVM(Model-View-ViewModel) 패턴이다.

 

 

패턴 동작 과정

 

MVVM 패턴은 UI(View)와 비즈니스 로직(Model)을 분리하기에

UI 변경 시 비즈니스 로직의 코드를 거의 수정하지 않아도 된다.

 

기능을 추가할 때는 ViewModel을 확장하거나 새로운 ViewModel을

추가하며, ViewModel은 여러 View에서 재사용될 수 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함