■ 코틀린 알고리즘 ■
✔️ 문자열 내림 차순 정렬 : List에서 sorted() 사용후 reversed() 후 joinToString으로 붙임
✔️ String에서 아스키 코드 변환 : toInt, 아스키 코드( Enter = 13, 숫자 0 = 48, 대문자 A = 65 , 소문자 a = 97)
✔️ 문자열 길이 : Sting.length()
✔️ toIntOrNull() : 기능은 같고 다만 숫자로 바꿀수 없는건 null이 반환
✔️ String 문자열을 하나씩 쪼갤려면(char) for(in) 사용하면 된다.
✔️ 약수의 개수 for(a in 1..input) { if(input % a == 0) {count++} }
✔️ 2차원 배열 초기화 : var answer = Array(arr1.size){IntArray(arr1[0].size)}
✔️ 배열 또는 리스트를 해당 원소가 갖고 있는 인덱스와 함께 저장해줌
[ ex) arr1.mapIndexed { index, arr -> arr.mapIndexed { index2, value -> arr2[index].[index2] + value }.toIntArray() }.toTypedArray()
✔️ map{ it } : 컬렉션 인자를 다른 값 또는 다른 타입으로 변환 시 사용
✔️ (1..count) 구문은 Collection으로 인지된다.
✔️ let{ it } : 람다식으로 중괄호를 채워야하며 해당 객체를 it으로 호출 가능하다. 즉 어떤 것을 추가하기 위해 형식적인 let { }을 이용하는 것이다.
✔️ 최대공약수 : 2개의 자연수 a, b(a > b)에 대해서 a를 b로 나눈 나머지가 r일 때, a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 즉, 5와 2가 있을때(큰수에서 작은수를 나누는것을 가정) 5에서 2를 나누면 나머지 1이 나오고 다시 나머지 1을 2로 나누면 0이 되기 때문에 여기서 최대 공약수는 1이다. 만약 12와 4가 있는 경우는 12를 4로 나누면 나머지 0이 나오기 때문에 최대 공약수는 4이다. 이것을 코드로 풀어쓴다면,
while (b!=0){
num = a % b
a = b
b = num
}
greatest_common = nn
✔️ 10진수 -> n진수 변환 : String(변환하려는 n진수) 를 사용한다.
[EX] aa = number.String(3).toInt() [10진수를 3진수로 변환]
n진수 -> 10진수 변환 : toInt(현재 n진수)를 사용한다. [EX] aa = number.toInt(3) [3진수를 10진수로 변환]
✔️ 띄어쓰기가 있는 문자열을 띄어쓰기 기준으로 각각 문자열을 비교하고 싶다면 split()과 joinToString()과 mapIndexed()를 이용하여 변환하면 된다.
[EX] 문자열 "hello my family"가 있다고 가정했을때 hello 한 단어, my 한 단어, family 한 단어로 분리하고 추후에 조건을 주고 문자열 변환을 하는 경우
"hello my familly".split(" ").joinToString(" ").{it->it.mapIndexd{index, char}.joinToString을 사용하면 구체적으로 문자를 변환 및 쪼갤 수 있다.
✔️ 알파벳의 개수는 26개
✔️ max와 min 이용하는 방법 : maxOrNull()함수를 이용하는데 기본적으로 코틀린은 ?연산자를 선언하지 않으면 null을 허용하지 않는 변수로 선언되기 때문에 maxOrNull()!!를 사용한다. min도 마찬가지로 minOrNull()!!을 사용한다.
✔️ sort()와 sorted() 차이는 sort()는 리턴값 없이 컬렉션 자체를 정렬해주기 때문에 변경이 가능한 리스트를 정렬할 때 사용이되며, sorted()는 원본 컬렉션을 바꾸지 않고 정렬된 리스트를 새로 리턴되기 때문에 데이터 변경이 불가능한 리스트를 정렬할 때 사용이된다.
✔️ 정렬을 할 때 조건을 주기위해 sortBy{}, sortedBy{}를 이용한다.
✔️ 배열의 범위 만큼 크기 자르기 : slice()
✔️ 배열을 생성할때 주의할점은 IntArray(배열의 사이즈) 이고, intArrayof(배열에 넣을 값)이다. 그러니까 IntArray는 배열의 크기를 만들고 값을 넣지 않으며, intArrayof는 배열을 즉시 생성하고 값도 넣는것이다.
✔️ 소수 찾는 함수(bo olean 값 반환)
fun isPrime(n: Int): Boolean {
var i = 2
while(i * i <= n){
if(n % i++ == 0) {
return false
}
}
return true
}
✔️ 총 n개의 intArray에서 4개를 고르는 함수
for (a in 0 .. nums.size -4 ) {
for (i in a+1..nums.size - 3) {
for (j in i + 1..nums.size - 2) {
for (k in j + 1..nums.size - 1) {
println("$nums[a] + $nums[i] + $nums[j] + $nums[k]")
if(isPrime(nums[a] + nums[i] + nums[j] + nums[k]) == true){
count++
}
}
}
}
}
✔️ 맵에 대해 오름차순 및 내림차순
[EX]
키에 대해서 내림차순으로 키 값만 뽑고 싶을때 값 부분에 _를 넣어 공백으로 만들어준다.
val list = failutrMap.toList().sortedByDescending { (key,_)->key }
값에 대해서 내림차순으로 키 값만 뽑고 싶을때 값 부분에 _를 넣어 공백으로 만들어준다.
val list = failutrMap.toList().sortedByDescending { (_,value)->value }
아니면 둘 다 매개변수에 값을 집어넣고 -> 오른쪽 구문에 키를 뽑을지 값을 뽑을지 결정하면 된다.
val list = failutrMap.toList().sortedByDescending { (key,value)->(value) }
✔️ 맵을 list로 변경하고 key 또는 값을 뽑기 위해선 first(key),second(값) 구문을 사용하면 된다.
{EX] for( i in 0 .. N-1){
answer[i] = list[i].second.toInt() //second이기 때문에 값을 뽑는다.
}
✔️ 맵 컬렉션을 사용하는 방법 : map[key] = value 구문을 사용하여 값을 가져오거나 설정 가능, 또한 get(key)를 이용해 값을 가져올 수 있다. put(key)를 이용해 키를 넣어 값을 넣을 수 있다.
✔️ array나 list를 문자열로 만드는 함수 : jointoString()이다. 여기서 인자를 separator(각 원소 사이를 결정), prefix(제일 앞 문자를 결정), postfix(제일 뒤 인자를 결정) 여기서 많이 쓰는것은 separator를 많이 사용한다 예시를보자.
[EX] println(aa.joinToString()) ==> 1, 2, 3, 4
println(aa.joinToString(separator = "")) ==> 1234
println(aa.joinToString(separator = ",")) ==> 1,2,3,4
✔️ List관련 정렬 함수
sort : 함수를 호출한 객체 자체의 값을 정렬한다.
sorted :정렬한 값을 return한다. (별도의 변수에 저장)
sortBy/sortedBy : 정렬 기준을 selector 함수로 지정한다.
sortWith/sortedWith : 정렬 기준을 comparator로 지정한다.
✔️ Map에서 key 정렬 : toSortedMap 함수 사용
[EX] var map = mutableMapOf<int,int>() map.toSortedMap()
✔️ Map에서 value 정렬 : 맵을 List로 변환 후 sortedWith 함수 이용하여 정렬하고 CompareBy 함수를 이용하여 Pair의 second 요소를 정렬 기준으로 선택한다.
[EX] var map = mutableMapOf<int,int>()
var sortedByValue = map.toList().sortedWith(compareBy({it.second})).toMap()
✔️ 여러 리스트를 한 리스트로 한 곳에 모으는 함수 : flatMap()함수와 toList()를 이용
[EX]
var Strings = listOf("abc","def")
var aa = Strings.flatMap { it.toList() }
aa.joinToString(",")
println(aa.joinToString(","))
✔️Stack의 함수들 : push() : 스택에 값 추가, peek() : 스택의 맨 위의 값 가져옴, pop(): 스택의 맨 위의 값 삭제
✔️ 입력 1개 :
입력 2개 : val (A,B) = readln().split(" ").map { it.toInt() }
✔️ 백준에서 입력 출력에서 메모리 절약하는 BufferedReader, BufferdWriter
[EX]
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
val st1 = StringTokenizer(br.readLine()) //콘솔창 첫번째 줄 공백을 기준으로 나눔
val st2 = StringTokenizer(br.readLine()) //콘솔창 두번째 줄 공백을 기준으로 나눔
val n = st1.nextToken().toInt() //콘솔창 첫번째 줄의 수열의 갯수
val x = st1.nextToken().toInt() //콘솔창 첫번째 줄의 주어지는 정수의 수(첫번째 input은 n을 받았고 이 x는 콘솔창 첫번째줄의 두 번째 input 값이 된다)
var a = st2.nextToken().toInt() // 콘솔창 2번째 줄의 입력값이 추가됨
bw.write("") //콘솔에 출력하는것이 아닌 버퍼에 올라가게만 함
bw.flush() //wirte()를 통해 버퍼에 올라간 것들을 한번에 출력하는 함수
'코딩테스트' 카테고리의 다른 글
코딩테스트 준비(feat, 프로그래머스, 백준, 백준허브) (0) | 2022.09.28 |
---|