경험의 기록

😀 입출력

import java.io.*
import java.util.*

// 자바의 BufferedReader, InputStreamReader 이용
fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))){

    val str = readLine() // 한줄 입력받기 (String)
    println(str) // 출력
    
    // 1 2 3 으로 들어온 입력 한번에 Type 바꿔 할당하기
    val (a,b,c) = readLine().split(" ").map { it.toInt() }
}

 

😀 String (문자열) 관련 메소드

fun main() {
    var str = "abcd"
    var str2 = "123"

    str.length // 문자열의 길이
    str[1] // 문자열의 특정 위치 접근
    str2.toInt() // 문자열 타입 변환 to'Type'()

    str.isEmpty() // 문자열 길이가 0이면 true, 아니면 false
    str.isBlank() // 문자열 길이가 0이거나 공백으로만 이루어져 있다면 true, 아니면 false
    str.contains("a") // 문자열에 a가 포함되어 있으면 true, 아니면 false
    str.compareTo("abd") // 문자열 사전순 비교, str 이 앞이면 -1, 같으면 0, 뒤면 1

    str.split(" ") // 공백으로 구분하여 List<String> 반환
    str.substring(2,4) // 2 ~ 3 위치 문자열 반환 (마지막 범위 포함 X)
    str.substring(1) // 1부터 끝까지 문자열 반환

    str.trim() // 문자열 앞 뒤 공백 제거 (문자열 사이 공백 제거 X) 결과 반환
    str.lowercase() // 대문자 => 소문자 결과 반환
    str.uppercase() // 소문자 => 대문자 결과 반환
    str.replace("a","b") // 문자열 "a"를 전부 "b"로 바꾼 결과 반환
    str.reversed() // 문자열 뒤집은 결과 반환

    str += "ef" // 문자열 추가
}

 

😀 StringBuilder 관련 메소드

코틀린에서 문자열을 합치기 위하여 자바의 StringBulider를 사용할 수 있다.

문자열을 단순히 '+' 연산을 실행하면 아예 새로운 문자열을 생성하기 때문에 효율이 떨어진다.

하지만 StringBulider는 문자열을 더하는 효율적인 방식으로 작동한다.

fun main() {
    val sb = StringBuilder()

    sb.append("abc") // 문자열 추가
    sb.insert(2,"ef") // 2 위치에 문자열 ef 삽입

    sb.delete(0, 2) // 0 ~ 1 범위의 문자열 삭제 (마지막 범위 포함 X)
    sb.deleteCharAt(1) // 1 위치의 문자 삭제
    
    sb.setCharAt(1, 'g') // 1 위치의 문자 g로 변경
    sb.reverse() // 문자열 뒤집기
    
    sb.setLength(0) // 문자열 길이 0으로 조절 (기존보다 짧은 길이면 삭제)
    sb.setLength(5) // 문자열 길이 5으로 조절 (기존보다 긴 길이면 공백으로 채움)

    // 배열의 숫자를 하나의 문자열로 합침 (1 2 3 4)
    val arr = arrayOf(1,2,3,4)
    arr.forEach { sb.append(it).append(' ') }
}

 

😀 Array, List, Set, Map

fun main(){

    // 1. Array
    /* 배열은 사이즈가 할당되어 있다. */
    val arr1 = arrayOf(1,2,3) // 1,2,3을 담은 배열 생성
    val arr2 = Array(3){0} // 크기가 3이고 초기값이 0인 배열 생성
    val arr3 = emptyArray<Int>() // Int 타입의 빈 배열 생성
    arr1[0] = 7 // 0번째 값을 7로 바꾼다 (배열은 Mutable 타입이기 때문에 수정 가능)


    // 2. List
    /* 리스트는 순서를 가지고, 사이즈가 자동으로 정해지며 기본은 Immutable 타입 */
    val list1 = listOf(1,2,3) // 1,2,3을 담은 리스트 생성
    val list2 = List(3){0} // 크기가 3이고 초기값이 0인 리스트 생성
    val list3 = arrayListOf<Int>(1,2,3) // 1,2,3을 담은 arrayList 생성 (Mutable)
    // list1[0] = 1 --> 오류발생 (수정 불가능)
    list3[0] = 1 // 0번째 값을 1로 바꾼다 (arrayList 는 Mutable 타입)
    list3.add(10) // 다음 값으로 10을 추가


    // 3. Set
    /* 집합은 순서를 가지지 않고, 중복 불가능. 사이즈가 자동으로 정해지며 기본은 Immutable 타입 */
    val set1 = setOf(1,2,3) // 1,2,3을 담은 Set 생성 (수정 불가)
    val set2 = mutableSetOf(1,2,3) // 1,2,3을 담은 mutableSet 생성 (수정 가능)
    set2.remove(2) // 집합에서 2 삭제


    // 4. Map
    /* 요소를 키와 값의 쌍의 형태로 저장. 키는 중복 불가능. 사이즈 자동, 기본 Immutable */
    val map1 = mapOf(1 to "Kim", 2 to "Han") // 수정 불가능
    val map2 = mutableMapOf(1 to "Kim", 2 to "Han") // 수정 가능
    map2.size // 맵의 사이즈 반환
    map2.keys // 맵의 모든 키 반환
    map2.values // 맵의 모든 값 반환
    map2.isEmpty() // 맵이 비어있으면 true, 아니면 false
    map2.containsKey(1) // 1에 해당하는 키가 있으면 true, 아니면 false
    map2.containsValue("Kim") // Kim에 해당하는 값이 있다면 true, 아니면 false
    map2[1] // 키에 해당하는 값 반환, 없다면 null
    map2.getOrDefault(1, "2") // 키에 해당하는 값 반환, 없다면 "2" 반환
    map2.put(3, "Lee") // 3과 Lee의 쌍 추가
    map2.remove(1) // 1에 해당하는 요소 제거
    map2.clear() // 초기화
}

 

😀 Collection 관련 메소드

fun main(){
    val list = arrayListOf(1,2,3,4,5)

    list.forEach() { print("$it " )} // 컬렉션에 포함된 모든 요소 출력
    list.minOrNull() // 컬렉션 최솟값 반환
    list.maxOrNull() // 컬렉션 최댓값 반환

    list.first() // 첫 번째 요소 반환
    list.first { it > 3 } // 조건에 맞는 첫 번째 요소 반환
    list.last() // 마지막 요소 반환
    list.last{it < 3} // 조건에 맞는 마지막 요소 반환

    list.filter { it < 3 } // 조건에 맞는 요소 반환
    list.map { it+5  } // 수식을 적용하여 값 변경하여 반환
    list.count() { it < 3 } // 조건에 맞는 요소의 개수 반환
    list.any { it < 3 } // 조건에 하나라도 일치하는 요소가 있다면 true
    list.all { it < 3 } // 모든 요소가 조건에 맞다면 true
    list.none { it < 3 } // 조건에 하나도 맞지 않으면 true

    list.reduce { acc, i -> acc * i } // 내부의 데이터를 다 모아줌
    list.fold(10) { acc, i -> acc * i } // 내부의 데이터를 다 모아줌 (초기값 지정)

    list.sorted() // 컬렉션 정렬하여 반환
    list.sortedDescending() // 컬렉션 정렬하여 반환 (내림차순)
    list.sort() // 컬렉션 정렬 (Mutable 타입만 가능)

    list.sortedBy { it } // 특정 기준점으로 컬렉션 정렬하여 반환
    list.sortedByDescending { it } // 특정 기준점 기준 컬렉션 정렬하여 반환 (내림차순)
}

 

😀 큐(Queue), 스택(Stack), 우선순위 큐(PriorityQueue)

import java.util.*

fun main(){

    // 1. Queue
    var q : Queue<Int> = LinkedList() // 큐로 선언하고 LinkedList 로 할당
    q.add(1)    // 객체를 큐에 추가 (큐가 가득찬 상태이면 illegalStateException 발생)
    q.offer(3)  // 객체를 큐에 추가 (큐가 가득찬 상태이면 false 반환)

    q.element()    // 맨 앞 객체 리턴 (큐가 비어있는 상태이면 NoSuchElementException 발생)
    q.elementAt(1) // 인덱스 값의 객체 리턴
    q.peek()   // 맨 앞 객체 리턴 (큐가 비어있는 상태이면 null 반환)

    q.remove()  // 삭제하면서 객체 반환 (큐가 비어있는 상태이면 NoSuchElementException 발생)
    q.poll()  // 삭제하면서 객체 반환 (큐가 비어있는 상태이면 false 반환)

    q.size // 큐 사이즈
    q.isEmpty() // 비어있으면 true, 아니면 false


    // 2. Stack
    var s = Stack<Int>()

    s.push(1) // 객체를 스택에 추가
    s.peek() // 맨 위의 객체 반환 (비어 있는 상태이면 EmptyStackException 발생)
    s.pop() // 맨 위의 객체 삭제하고 반환 (비어 있는 상태이면 EmptyStackException 발생)
    s.isEmpty() //비어있으면 true, 아니면 false
    s.size // 스택 사이즈


    // 3. PriorityQueue
    val pq = PriorityQueue<Int>() // 오름차순
    val pq2 = PriorityQueue<Int>(Collections.reverseOrder()) // 내림차순

    val pq3 = PriorityQueue<Node>()
}

// index 기준 비교 (오름차순)
data class Node(
    val index : Int,
    val value : Int
) : Comparable<Node> {
    override fun compareTo(other: Node): Int = index - other.index
}
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading