코틀린-안드로이드

8일차)알고리즘 문제(둘만의 암호), 코틀린 문법(람다 함수,고차함수)

songyooho 2024. 5. 30. 20:32

>알고리즘 문제

1. 문제

 

2. 솔루션

class Solution {
    fun solution(s: String, skip: String, index: Int): String {
        var answer: String = ""
        var charList=mutableListOf<Char>() //index만큼 넘어갔을때 나오는 알파벳을 찾기위한 리스트
        var charMap=mutableMapOf<Char,Int>() //skip을 제외한 알파벳 순서
        var idx=0
        
        //skip을 제외한 알파벳 순서 정보를 채워넣음
        for(i:Char in 'a'..'z'){
            if(!skip.contains(i)){
                charList+=i
                charMap.put(i,idx)
                ++idx
            }
        }
        
        //index만큼 넘어갔을때 나오는 알파벳 찾기
        for(i:Char in s){
            var tmp=charMap[i]?:throw IllegalArgumentException()
            tmp+=index
            var cSize=charList.size
            if(tmp>=cSize){
                tmp%=cSize //2바뀌이상 돌아갈 수도 있으므로 %를 사용
            }
            answer+=charList[tmp]
        }
        
        return answer
    }
}

 

1)리스트나 맵 하나만 사용할시 알파벳의 순서찾을때나 index만큼 넘어간 뒤 나오는 알파벳을 찾을때 실행시간이 늘어나는 단점이 존재하기에 둘 다 사용해서 시간복잡도를 O(1)으로 줄임

2)Map은 value값이 nullable이므로 ?:throw를 이용해 null처리

3)index값이 커서 두 바뀌이상 돌 수도 있으므로 %를 이용하여 나오는 알파벳을 찾음

 

 

>코틀린 문법(람다 함수,고차함수)

 

1. 람다 함수:(익명- anonymous- 함수)

 

1)특징

-fun 키워드 없이 사용

-함수명이 없음

-고차함수에서 많이 사용

 

2)선언

<1>형식: {매개변수 -> 함수 본문}

<2>함수타: (매개변수자료형) -> 반환값 자료형(반환값이 없으면 Unit)

<3>예시

val sum={no1:Int, no2:Int -> no1+no2}

 

3)종류

<1>매개변수 없는 람다함수: 쓰는 방식은 동일하나 화살표 생략 가능

{-> 함수본문} //일반적인 형태
{함수본문} // 이 경우 화살표 생략가능

 

<2>매개변수 1개인 람다함수: 생략 후 it으로 대체가능

val some ={no:Int ->print(no)} //일반적인 형태
val some:(Int) ->Unit={print(it)} //생략 형태

@단 아래처럼 쓰는 경우 함수 타입을 꼭 명시해 줘야함=>(Int) ->Unit 이부분

@함수타입은 (A, B, C,...) -> R 형태로 쓰이므로 앞에 ( )를 꼭 씌워야 함

-매개변수없는 경우는  () -> A 형

 

<3>반환값이 존재하는 람다함수: return을 사용하는 대신 맨 아랫줄 실행결과가 반환값으로 사용됨

-예시

val some={no1:Int, no2:Int ->
	println("in lamda function")
    no1+no2
}

 

4)typealias

<1>사용: 별칭을 이용하여 타입을 선언할 수 있음

<2>예시

 typealias MyInt = Int //타입 적을시 Int대신 MyInt로 대신 적기 가능
 typealias MyFunType = (Int, Int) -> Boolean //함수타입도 가능

 

5)람다 함수에서 타입 생략

<1>매개변수 타입 생략

-사용: 만약 람다함수에서 함수타입을 미리 적어뒀으면 매개변수에서 타입을 생략가능하다.

-예시

val somefun:(Int, Int) -> Boolean = {no1,no2 ->no1>no2}
//선언시 함수타입에서 매개변수 타입을 추론가능하므로 함수에선 생략

 

<2>함수 타입 생략

-사용: 만약 람다함수에서 매개변수와 반환값 타입추론이 가능하면 함수타입은 생략가능하다.

-예시

val somefun = {no1:Int, no2:Int -> no1>no2}

 

 

2. 고차함수(high order function)

 

1)의미: 함수를 매개변수로 전달 받거나 반환하는 함수

2)사용: 주로 람다 함수를 인자로 받음

3)예시

fun hof(arg: (Int) -> Boolean): () -> String {
	val result = if(arg(10)){
    	"valid"
    }else{
    	"invalid"
    }
    return {"hof result: $result"}
}

//(Int) -> Boolean 타입 함수를 매개변수로 받음
//() -> String 타입 함수를 반환값으로 가짐

fun main(){
	val result=hof({no -> no>0}) //hof함수가 람다 함수를 인자로 받음
}