>알고리즘 문제
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함수가 람다 함수를 인자로 받음
}
'코틀린-안드로이드' 카테고리의 다른 글
10일차)알고리즘 문제(성격 유형 검사) (0) | 2024.06.01 |
---|---|
9일차)알고리즘 문제(햄버거 만들기), 코드카타 리뷰(collection APIs, Stringbuilder, stack, queue, deque, subList() vs slice()),코틀린 문법(널 안정성) (0) | 2024.05.31 |
7일차)알고리즘 문제(대충 만든 자판), git&github-1회차 (0) | 2024.05.29 |
6일차)알고리즘 문제(문자열 나누기) (0) | 2024.05.28 |
5일차)알고리즘 문제(체육복,숫자짝꿍), 코틀린 문법 (0) | 2024.05.27 |