ALL Post 204

삽입 정렬(Insertion sort)

삽입 정렬(Insertion sort) 삽입 정렬은 원소가 있어야 하는 자리에 '삽입'한다고 하여 삽입 정렬이다. 5, 7, 2, 4 ,6 이라는 원소가 있고, 여기서 세 번째 원소인 2를 선택했다고 하자. 오름차순 정렬이라면 2는 맨 첫 번째에 위치해야 한다. 방법은 간단하다. 2보다 앞에 위치한 원소를 하나씩 비교하며 앞의 원소보다 2가 더 작다면 한 칸씩 앞으로 보내면 된다. 앞에서 공부한 버블, 선택 정렬과 마찬가지로 두 번째 원소부터 비교를 시작한다. 이전 원소들을 비교해나가기 때문에 첫 번째 원소부터 시작하지 않아도 된다. 버블 정렬, 선택 정렬과 같이 제자리 정렬(in-place) 알고리즘이다. 또한 버블, 선택 정렬에 비해 속도가 빠르다. 배열이 길어질수록 효율이 떨어진다는 ..

알고리즘 2020.12.31

2020년에 마신 커피들

12월 31일이다.  지구 종말 영화의 포스터 같은 풍경이 뉴노멀이라는 괴상한 말과 함께 일상으로 쳐들어왔다. 마스크를 끼지 않은 인간을 째려보기 시작했다. 마스크를 쓰지 않는 것은 범죄가 되었으며 거기에 저항하는 인간들은 뉴스에 나온다. 마스크가 처음엔 답답해 죽을 것 같더니 이제는 그럭저럭 쓰고 다닐만 하다. 나도 이제 뉴노멀에 적응한 뉴제너레이션의 일원이 된 걸까? 올해 가장 끔찍한 일은 역시 만원 지하철에서 사레들린 일이다. 기침할 수도, 하지 않을 수도 없는 상황이었다. 덕분에 침을 매우 조심해서 삼키는 인간이 되었다. 농담은 그만하고.국비 학원 작년 이맘 때는 생활코딩에 푹 빠져있었다. 기억에 남는 문단을 공유하고 싶다."웹페이지를 예쁘게 하기 위해서 HTML을 사용하지 않고 웹페이지 전체를 ..

메모 2020.12.31

선택 정렬(Selection sort)

선택 정렬(Selection sort) 선택 정렬은 자리를 선택한 다음, 거기에 맞는 원소를 찾아서 위치시킨다. 오름차순 정렬을 한다고 해보자. 첫 번째 자리엔 가장 작은 원소가 있어야 한다. 선택 정렬은 첫 번째 자리를 '선택'한 다음 원소 리스트를 순회하며 가장 작은 값을 찾아서 첫 번째 자리에 데려다놓는다. 그 다음 두 번째 자리를 선택하고 두 번째로 작은 원소를 찾는다. 이 작업을 원소 리스트의 크기 만큼 반복하는 것이 선택 정렬이다. 말하자면 선택한 장소에 마땅히 있어야 할 원소를 찾아서 제자리로 돌려보내는 것이다. 최소값을 찾는다. 그 값을 맨 처음 위치한 값과 바꾼다. 제자리를 찾은 원소를 빼고 1, 2번을 반복한다. 선택 정렬은 원소 리스트를 한 번 순회할 때 하나의 원소만 ..

알고리즘 2020.12.29

거품 정렬(Bubble Sort)

Github : https://github.com/cocodori/study/tree/main/java-algorithm/algorithm01/sort-algorithm/src/main/java/sorting 정렬 알고리즘(Sorting algorithm) 컴퓨터 과학에서 정렬 알고리즘이란 원소를 어떤 기준으로 정렬하는 것을 말한다. 기준은 알파벳, 날짜, 숫자 등 무엇이든 될 수 있다. 탐색이나 병합 알고리즘 같은 경우 정렬된 리스트여야만 바르게 동작한다. 정렬 알고리즘은 다른 알고리즘의 전제 조건이 되므로 반드시 알아두어야 한다. 거품 정렬(Bubble Sort) 거품 정렬은 가까운 두 원소를 비교하여 정렬하는 알고리즘이다. 원소가 자리를 찾아가며 이동하는 모습이 거품이 수면으로 올라오는 듯한 모습을..

알고리즘 2020.12.29

다이나믹 디스패치, 더블 디스패치

Static Dispatch public class Dispatch { static class Service { void run() { System.out.println("run().."); } } public static void main(String[] args) { new Service().run(); } } 이런 코드가 있다고 하자. 이 코드는 컴파일 시점에 Service클래스의 run메소드가 실행된다는 것을 이미 알고 있다. 컴파일된 바이트 코드에서도 그 정보를 확인할 수 있다. 이처럼 컴파일 시점에 이미 어느 클래스의 어느 메소드를 사용할지가 결정되는 것을 static dispatch라고 한다. 그럼 run()메소드가 오버로딩 되어 여러 개 존재하는 경우를 보자. public class Dis..

Java 2020.12.26

6주차 - 상속

상속(Inheritance) 상속. 상속에 대해 생각해보자. 먼 미래에 내가 누군가에게 무언가를 상속하게 된다고. 난 무엇을 상속해줄 수 있을까? 돈? 집? 거기까진 모르겠다. 아마 운이 좋다면 키보드 정도를 남기고 떠날 수도 있을 것 같다. 아무튼. 자바에서는 extends키워드를 이용하여 상속을 사용한다. extends라는 단어에서 알 수 있듯이 자바에서 상속은 곧 확장이다. 슈퍼 클래스가 가진 것들을 이용하여 더 큰 클래스를 만들 목적으로 상속을 사용한다. 상속은 클래스와 클래스 간에 이루어진다. 확장(extends)되어질 클래스를 슈퍼클래스, 상위클래스(또는 부모 클래스)라고 하고 확장하는 클래스를 서브클래스, 하위클래스(또는 자식 클래스)라고 한다. 현실세계는 이 사람 저 사람에게 상속 받을 수..

Java 2020.12.25

5주차 - 클래스, 생성자, 객체, this, 메소드

Class class public class { //클래스의 기본 형태 } 클래스에서 사용할 수 있는 접근 제어자 일반적으로 사용하는 클래스의 접근제어자는 public이고 원한다면 default제어자를 사용할 수 있다. 그외 protected나 private은 클래스 앞에 선언할 수 없다. default 는 가능한데 protected는 사용할 수 없게 제한하는 이유가 무엇인지는 잘 모르겠다. 반면에 private을 클래스의 접근제어자로 사용할 수 없는 이유는 분명해 보인다. 객체 지향 세계에서는 "어떤 객체도 섬이 아니다" 객체지향이란 결국 객체들끼리 협업을 하는 것이다. private을 붙여서 클래스를 만든다는 것은 객체를 지향하지 않고 객체를 섬으로 만들겠다는 거나 다름 없다. final class ..

Java 2020.12.19

추상화에 대한 잡생각

"추상화 어떤 양상, 세바 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 복잡성을 다루기 위해 추상하는 두 차원에서 이뤄진다. - 첫 번째 차원은 구체적인 사물들 간 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다. - 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것이다. 모든 경우에 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이라는 점을 기억하라." 객체지향의 사실과 오해 77p "객체를 결정하는 것은 행동이다. 데이터는 단지 행동을 따를 뿐이다. 이것이 객체를 객체답게 만드는 가장 핵심적인 원칙이다." 객체지향의 사실과 오해 95p "..

카테고리 없음 2020.12.16

4주차 - 제어문

https://github.com/whiteship/live-study/issues/4 제어문 제어문이란 말 그대로 코드를 '제어'해야 할 때 쓴다. 이를테면 어떤 조건(if-else/switch)에 따라 다르게 동작해야 할 때라든가, 같은 코드를 반복(loop)해야 할 때 쓰는 문(statement)을 제어문이라고 한다. 조건문(if-else) if-else문의 기본 문법 if(조건식) { //조건에 맞을 때 수행할 문장 } else { //조건에 맞지 않을 경우 수행할 문장(생략 가능) } 조건식의 결과는 반드시 boolean타입(true/false)이어야 한다. if - else if문 if의 조건식이 맞지 않을 때 다른 조건식을 충족하는지 확인할 때 사용하는 것이 else if절이다..

Java 2020.12.11

프로그래머스 - 모의고사

모의고사 문제 설명 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution ..

알고리즘 2020.11.26