본문 바로가기

개인 공부89

[알고리즘] 재귀 & 그리디 알고리즘 🎯 목표 재귀 알고리즘의 구조를 이해한다. 그리디 알고리즘을 이해하고 자주 나오는 유형을 익힌다. 🔄️ 재귀 알고리즘 자기 자신을 다시 호출하는 구조를 가진 알고리즘이다. 보통 더 작은 구조를 다시 호출해서 해결한다. 이는 분할-정보 알고리즘과 유사하다. public void recursion(int n) { if (n == MIN_SIZE) { // 가장 작은 단위의 일을 한다. } // 가장 작은 단위가 될 때까지 쪼갠다. return recursion(n - 1); } ✌ 특징 코드가 이뻐보일 순 있다. 하지만 스택 오버플로우가 발생할 수 있고 정확한 호출 회수를 예측하기 어렵다. 따라서, 재귀로 풀 수 있는 문제는 다른 방법으로 먼저 접근해본다. 그래도 재귀로 풀겠다면, 가장 작은 단위의 일에 대.. 2023. 5. 3.
[알고리즘] 정렬 & 탐색 알고리즘 😋 들어가기 앞서 이번에 알고리즘 스터디를 새롭게 시작했다. 내 입맛대로 그러면서 이전에 공부했던 것을 복습하는 시간을 가지기 위해서 한번 싹 정리해볼까 한다. 내가 가장 기본이라 생각하는 정렬, 탐색 알고리즘부터 시작해볼까 한다. 🎯 목표 정렬 알고리즘의 종류를 익히고, 각각의 시간복잡도와 구현법을 익힌다. 이분탐색 알고리즘을 이해한다. 🪜 정렬 알고리즘 이름 그대로 주어진 데이터를 정렬하는 알고리즘이다. 7가지 알고리즘이 기본이고, 응용에 따라서 추가적인 알고리즘이 존재한다. 1️⃣ 선택 정렬 선택한 값을 모두 비교해서 알맞은 자리를 찾는 정렬 알고리즘이다. 즉, 선택한 값 다음에 오는 모든 값을 비교해서 가장 작은 값과 위치를 바꾼다. 시간복잡도 : O(n^2) public void selectio.. 2023. 4. 28.
[객체지향의 사실과 오해] 1장 : 협력하는 객체들의 공동체 🧐 객체지향? 책을 읽기 전에 먼저 내가 아는 객체지향이란 어떤 것일지 생각해 봤다. 내가 생각하는 객체지향은 "나중에 추가될 요구사항에 유연하게 프로그래밍을 할 수 있게 하는 것"이라고 생각했다. 글을 적어 내려가면서 떠오르는 생각은 단순히 다형성에만 초점이 잡혀있는 것 같다. 책에서 가장 먼저 객체지향이 가지는 오해에 대해서 언급한다. 객체지향의 목표는 무엇일까? 일반적으로 실세계를 모방하는 것이라고 많이 알고 있다. 하지만, 요구사항을 만족하는 새로운 세계를 만드는 것이 객체지향의 목표이다. 그렇다면 왜 실세계를 모방하는 것으로 우리는 많이 알고 있을까? 우리는 객체지향을 이해하는 데 있어서 실세계를 예로 드는 것이 이해하기 쉽기 때문이다. 단순히 이해하는데 쉬울 뿐 구현하고 설계하는 기엔 부적합하.. 2023. 4. 1.
TIL : 위상정렬 알고리즘 (21) 💻 알고리즘 📌 위상정렬 알고리즘 Cycle이 없는 방향 그래프에서 작업 순서를 구하는 알고리즘이다. 이전에 공부한 적 있으나 기록을 남겨두지 않아서 남겨두려고 한다. 💡 특징 순환하지 않는 방향 그래프에서만 가능하다. 진입 차수 (in-degree) 또는 진출 차수 (out-degree)를 이용한다. 여러 개의 답이 존재할 수 있다 O(V+E)의 시간 복잡도를 가진다. 💡 동작 원리 (진입차수 ver) 진입 차수가 0인 정점을 큐에 넣는다. 큐에서 원소를 꺼내 연결된 간선을 제거한다. 진입 차수가 0이라면 해당 정점을 큐에 삽입한다. 마지막에 Cycle의 존재 유무를 확인한다. 결과의 크기가 정점의 개수보다 작다면 Cycle이 존재하는 것이다. from collections import deque de.. 2023. 3. 3.
[이펙티브 자바] 아이템 18 : 상속보다 컴포지션을 사용하라 🎯 학습 목표 상속과 캡슐화 컴포지션이란? (feat. DI) 📌 상속보단 컴포지션 이번 아이템에서 상속의 문제점과 왜 컴포지션을 사용해야 하는지 이야기하고 있다. 우선 상속을 지양해야하는 이유를 알아보자. 🧐 상속과 캡슐화 책에서는 상속이 캡슐화를 깨뜨린다고 말한다. 하지만 나는 '상속이 캡슐화를 깰 수도 있다'라는 말이 맞다고 생각한다. 상속의 문제점은 다음과 같다. 상속은 결합도를 크게 높여 유연성을 떨어트린다. Java에서는 모호성 때문에 다중상속을 지원하지 않는다. (다이아몬드 문제) 이런 문제들이 존재함에도 코드의 중복을 줄이는 강력한 수단임은 틀림없다. 따라서, 정말로 'is - a" 관계일 때만 상속을 사용해야 한다. 👀 컴포지션이란? (feat. DI) 한 객체에서 다른 객체를 포함하는 .. 2023. 2. 14.
[이펙티브 자바] 아이템 15 : 클래스와 멤버의 접근 권한을 최소화하라 🎯 학습 목표 접근 권한을 최소화 (feat. 캡슐화) package-private @NoArgsConstructor와 접근 범위 📌 접근 권한을 최소화? Java를 공부한 사람이라면 접근 권한을 보자마자 접근 지정자를 떠올렸을 것이다. 그냥 읽으면 다 흡수하지 못할 내용들이다. 이번 아이템을 통해서 캡슐화를 다시 공부해 보자. 😎 캡슐화? 그거 알긴 알지 우리가 공부하는 Java가 OOP란 사실은 누구나 안다. 또한, 캡슐화가 무엇인지도 알고 있다. 잘 공부한 사람이라면 이번 내용을 읽고 한 번에 이해가 되거나 와닿았을 것이다. 근데 나는 아니니까 다시 공부했다. 🥲🥲 💊 캡슐화 캡슐화란? 연관된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 말한다. 객체지향에선 "묻지 말고 시.. 2023. 2. 8.