전체 글 59

배열과 리스트

배열 메모리의 연속된 공간에 값이 채워져 있는 형태의 자료구조. 인덱스를 통하여 참조할 수 있다. 새로운 값을 삽입하거나 특정 인덱스에 있는 값을 삭제하기 어렵다. 값을 삽입하거나 삭제하려면 해당 인덱스 주변에 있는 값을 이동시키는 과정이 필요하기 때문. (배열은 연속되어야 하기 때문!) 배열의 크기는 선언할 때 지정할 수 있으며, 한 번 선언하면 크기를 늘리거나 줄일 수 없다. 리스트 인덱스가 없다. 값에 접근하려면 Head 부터 순서대로 접근해야 한다. 따라서, 값에 접근하는 속도가 느리다. 데이터를 삽입하거나 삭제하는 연산 속도가 빠르다. 리스트의 크기는 정해져 있지 않으며, 크기가 변하기 쉬운 데이터를 다룰 때 적절하다. 포인터를 저장할 공간이 필요하므로 배열보다 구조가 복잡하다. String t..

코딩 테스트 2023.01.11

시간 복잡도와 표기법

시간 복잡도 알고리즘에서 시간 복잡도는 주어진 문제를 해결하기 위한 연산 횟수를 말한다. 일반적으로 수행 시간은 1억 번의 연산을 1초의 시간으로 간주하여 예측한다. 시간 복잡도 정의하기 빅-오메가 : 최선일 때(Best case)의 연산 횟수를 나타낸 표기법 빅-세타 : 보통일 때(Average case)의 연산 횟수를 나타낸 표기법 빅-오 : 최악일 때(Worst case)의 연산 횟수를 나타낸 표기법 코딩 테스트에서는 어떤 시간 복잡도 유형을 사용해야 하나? 빅-오 표기법을 기준으로 수행 시간을 계산하는 것이 좋다. 시간 복잡도 계산 아래의 코드는 연산 횟수에서 큰 차이를 보이는 것 같지만 코딩 테스트에서 상수는 무시하기 때문에 시간 복잡도는 두 경우 모두 O(n)으로 같다. // 연산 횟수 N f..

코딩 테스트 2023.01.01

GraphQL 개념 정리

GraphQL 이란? Graph Query Language. 페이스북이 GraphQL을 만들었다. 2012년부터 페이스북 앱들을 지원하고 있다. 2015년에 페이스북이 GraphQL Specification을 오픈소스화 했다. GraphQL은 개념 또는 스펙이기 때문에 GraphQL이라는 것을 다운로드 받거나 설치할 수는 없다. 실제로 다운로드 받을 수 있는 건 GraphQL Implementations 이다. 여기서 Implementations 이란, GraphQL 스펙을 코드로 번역한 것. 즉, GraphQL은 특정 언어에 종속되지 않는다는 뜻. GraphQL은 왜 생겨났을까? REST API 문제를 해결하기 위한 대안으로 만들어졌다. RESTful API란 무엇인가요? RESTful API는 두 컴..

개념 정리 2022.12.12

자바(Java)란 무엇인가?

참조 https://namu.wiki/w/Java https://hermeslog.tistory.com/480 Java 유료 논쟁, Oracle JDK와 OpenJDK의 차이 정리 출처 : jsonobject.tistory.com/395 Java 유료 논쟁, Oracle JDK와 OpenJDK의 차이 정리 Oracle JDK와 OpenJDK Java 애플리케이션을 실행하기 위해서는 JVM이 필요하고 컴파일하기 위해서는 JDK가 필요하다. 일반.. hermeslog.tistory.com 개요 썬 마이크로시스템즈에서 1995년에 개발한 객체 지향 프로그래밍 언어. 창시자는 제임스 고슬링. 2010년에 오라클이 썬 마이크로시스템즈를 인수하면서 Java의 저작권을 소유. 자바 에디션 Java SE(Java St..

개념 정리 2021.10.04

Do it! 코틀린 프로그래밍, 10-3 파일 입출력

표준 입출력의 기본 개념 fun main() { print("enter: ") val input = readLine()!! println("$input") } //enter: 안녕하세염? //안녕하세염? Kotlin의 입출력 API 처리 목적 관련 자바 라이브러리 파일 처리 java.io.File 바이트 단위의 입력 처리 java.io.InputStream 바이트 단위의 출력 처리 java.io.OutputStream 문자 기반 읽기 처리 java.io.Reader 문자 기반 쓰기 처리 java.io.Writer 버퍼를 가진 읽기 처리 java.io.BufferedReader 스트림은 데이터가 강물에 띄운 것처럼 흘러간다는 의미로 데이터가 머물러 있지 않고 전달되는 개념을 말한다. 자바의 io, nio(..

코틀린 2021.09.30

Do it! 코틀린 프로그래밍, 10-1 코틀린 표준 함수

람다식과 고차 함수 복습 람다식 // val 변수 이름: 자료형 선언 = { 매개변수[,...] -> 람다식 본문 } val sum: (Int, Int) -> Int = { x, y -> x + y } val mul = { x: Int, y: Int -> x * y } 매개변수가 1개인 경우, 매개변수를 생략하고 it으로 표기할 수 있다. val add: (Int) -> Int = {it + 1} 만일 추론된 반환 자료형이 Unit이 아닌 경우에는 본문의 마지막 표현식이 반환값으로 처리됨. val isPositive: (Int) -> Boolean = { val isPositive = it > 0 isPositive // 마지막 표현식이 반환됨 } val isPositiveLabel: (Int) -> B..

코틀린 2021.09.28

Do it! 코틀린 프로그래밍, 09-5 시퀀스 활용하기

코틀린의 시퀀스(Sequence)는 순차적인 컬렉션으로 요소의 크기를 특정하지 않고, 나중에 결정할 수 있는 특수한 컬렉션. 예를 들어 특정 파일에서 줄 단위로 읽어서 요소를 만들때 해당 파일의 끝을 모르면 줄이 언제 끝날지 알 수 없는 경우가 있는데 이럴 때 사용할 수 있다. 따라서 시퀀스는 처리 중에는 계산하고 있지 않다가 toList()나 count() 같은 최종 연산에 의해 결정된다. 요소 값 생성하기 generateSequence()로 생성하기 fun main() { // 시드 값 1을 시작으로 1씩 증가하는 시퀀스 정의 val nums: Sequence = generateSequence(1) {it + 1} // take()를 사용해 원하는 요소 개수만큼 획득하고 toList()를 사용해 Li..

코틀린 2021.09.26

Do it! 코틀린 프로그래밍, 09-4 컬렉션의 확장 함수

확장 함수의 종류 연산자(Operator) 더하고 빼는 등의 계산 집계(Aggregator) 최대, 최소, 집합, 총합 등의 계산 검사(Check) 요소를 검사하고 순환 필터(Filter) 원하는 요소를 골라냄 변환(Transformer) 뒤집기, 정렬, 자르기 등 컬렉션의 연산 fun main() { val list1 = listOf("1", "2", "3") val list2 = listOf(1, 2, 3) val map1 = mapOf("hi" to 1, "hello" to 2, "bye" to 3) println(list1 + "4") println(list2 + 4) println(list2 + listOf(5, 6, 7)) println(list2 - 2) println(list2 - list..

코틀린 2021.09.09

Do it! 코틀린 프로그래밍, 09-3 Set과 Map 활용하기

Set은 정해진 순서가 없는 요소들의 집합을 나타내는 컬렉션. List의 경우 값이 중복되더라도 요소로 저장할 수 있지만 Set의 경우에는 집합의 개념이기 때문에 동일한 요소를 중복해서 가질 수 없다. 다시 말하면 모든 요소가 유일해야 한다. Map은 키와 값의 쌍으로 저장된다. 키는 중복될 수 없고 유일하다. 하지만 값은 중복해서 사용할 수 있다. Set 생성 헬퍼 함수인 setOf()를 이용해 불변형 Set을 생성하고 mutableSetOf()를 이용해 가변형 Set을 생성할 수 있다. val set1 = setOf("hi", 1, 2.3, 'c') // 자료형 혼합 val set2: Set = setOf(1, 3, 4) // 정수형만 초기화 mutableSetOf()는 MutableSet 인터페이스..

코틀린 2021.09.02

Do it! 코틀린 프로그래밍, 09-2 List 활용하기

List는 순서에 따라 정렬된 요소를 가지는 컬렉션. 불변형 List 생성 listOf() 가변 인자를 받을 수 있기 때문에 원하는 만큼 요소를 지정할 수 있음. 자료형을 지정해 선언할 수 있지만 그렇지 않으면 기본적으로 Any를 사용. var l = listOf("hi", 1, 2.2, 'c') // 컬렉션 반복 for(i in l) println(i) // 인덱스 사용 for(index i l.indices) println(l[i]) // 비어있는 List // 반드시 형식 매개변수를 지정 val emptyList: List = emptyList() // listOfNotNull() // null을 제외한 요소로만 List를 구성 val nnl: List = listOfNotNull(1,2,3,nul..

코틀린 2021.08.28