import java.util.*;class Solution { public String solution(String number, int k) { StringBuilder sb = new StringBuilder(); int idx = 0; int next = 0; for (int i = 0; i 아이디어주어진 숫자에서 k개의 숫자를 제거하고 남길 수 있는 가장 큰 숫자를 구하려면, 가장 큰 숫자를 앞쪽에 배치하는 방식으로 해결할 수 있습니다. 이를 위해, 숫자를 왼쪽에서부터 탐색하며 남길 자릿수에 맞춰 매번 남은 범위 내에서 가장 큰 숫자를 선택하는 전략을 사용합니다. 처음엔 조합으로 모든 경우의 수를 내고 정렬로 뽑으려했지만 많은 시간이 걸려..
비슷한 추상화 수준으로 작성된 흐름 이란?흐름에 대한 모든 설명이 비슷한 수준을 가져야 한다는 말이다.흐름을 설명하는 중간에 갑자기 너무 구체적인 내용이 있으면, 전체흐름을 이해하기 어렵다. 브라우저에 “www.naver.com”을 입력했을 때의 흐름을 설명해 보자.www.naver.com이라는 도메인이름을 DNS서버에 보내 IP주소를 조회한다.IP 주소를 이용해 HTTP 요청을 보낸다.네이버 서버는 HTTP 요청을 받아서 처리하고, HTML 문서를 포함한 HTTP 응답을 돌려준다.HTTP 응답을 받은 브라우저는 HTML 문서를 파싱해 화면에 보여준다.HTML 문서를 보여주는데 추가로 필요하 CSS, JS, Image 정보가 있다면 다운로드해 모든 정보를 랜더링 한다.2번 설명에서 갑자기 “HTTP 요청..
나중에 쓸 변수를 미리 선언하지 말자.CASE - 불변하지 않은 전역변수 & 인스턴스 변수모든 메서드를 읽을 때 기억해야 할 Context가 된다.해당 변수가 충분히 설명적이지 않을 경우 어떻게 초기화되는지까지 같이 봐야 한다.특정 메서드를 작성하다가 그 변수를 수정할 경우 모든 메서드에 그 변경이 전파될 수 있다.가변변수라면, 해당 변수를 변경하는 모든 메서드를 같이 고려해야 한다.( 놓친 부분이 있다면 내 예상과 다르게 코드가 동작할 확률이 높다.) Action Item가능한 사용하는 곳과 가까운 변수를 생성한다.가능한 변수(Context)의 Scope를 작게 제한하자. 메서드메서드 크기가 커지는 것에서 Bad Smell을 맡아보자메서드 크기가 커진다는 것은 하는 일이 많아지는 거다. (아닌 경우도 ..
캡슐화란 무엇인가?캡슐화는 객체지향 프로그래밍(OOP)에서 구체적인 것을 숨기고, 추상적인 것만을 드러내는 개념입니다. 이를 통해 클라이언트 객체(Client)가 세부적인 구현에 의존하지 않게 하여, 변경에 유연한 코드를 작성할 수 있도록 도와줍니다. +) 구체적인 것&추상적인 것은 낮은 수준&높은 수준이라고 부르기도 함. DIP!! 클라이언트 객체란?클라이언트 객체는 협력 과정에서 요청을 보내는 객체를 의미합니다. 캡슐화를 통해 클라이언트 객체가 구체적인 구현에 의존하지 않게 하여, 변경의 전파를 막는 것이 핵심입니다. 캡슐화의 목적캡슐화의 목적은 구체적인 것을 Client 객체로부터 숨겨 변경이 Client 객체에 전파되지 않도록 하여 시스템을 유연하게 만드는 데 있습니다. 이를 통해 낮은 결합도를 ..
Java의 탄생 배경자바가 등장할 당시, C/C++과 같은 언어들이 주로 사용되었지만, 이 언어들은 특정 플랫폼(OS)이나 하드웨어에 맞춰 컴파일되도록 설계된 언어였다. 각 플랫폼마다 사용하는 CPU에 따라 해당 환경에 맞게 컴파일해야 했다. 이런 한계를 극복하기 위해 Sun Microsystems는 OS나 하드웨어에 상관없이 다양한 환경에서 실행될 수 있는 언어를 만들기로 결심했고, 이것이 자바의 탄생으로 이어졌다. 자바는 “Write Once, Run Anywhere”라는 철학을 기반으로 다양한 플랫폼에서 동일한 코드를 실행할 수 있도록 설계된 언어이다. JAVA의 동작 원리JVM을 설명하기 전에, 자바 프로그램이 어떻게 동작하는지 기본적인 원리를 먼저 살펴보겠다.자바로 작성된 소스 파일은 보통 이름..
지난 계산기 과제에서 Exception을 상속하여 예외 처리를 하던 중 코드가 지저분해지는 문제가 발생했다. 매번 try-catch 문을 사용해야 했고, 그로 인해 코드가 길어지며 가독성도 떨어졌다. 그래서 RuntimeException으로 변경하여 try-catch 문을 생략하게 되었다. 왜 RuntimeException으로 변경하면 try-catch 문을 생략할 수 있었을까?Exception을 상속받으면 해당 예외는 CheckedException이 된다. CheckedException은 컴파일러가 예외 처리를 강제하기 때문에, 메서드 내에서 반드시 try-catch로 처리하거나 메서드 선언부에 throws를 붙여야 한다. 그렇지 않으면 컴파일 오류가 발생한다. 하지만 RuntimeExcepti..
ArrayList는 Java에서 List 인터페이스를 구현한 인기 있는 데이터 구조이다. 이번 글에서는 동적으로 크기가 조절되는 배열을 제공하는 ArrayList의 내부 저장 방식과 성능에 대해 살펴보려고 한다. ArrayList의 초기화 과정ArrayList를 생성할 때, 기본적으로 빈 배열을 사용하여 초기화된다. 기본 용량은 일반적으로 10이며 처음에는 빈 배열이 할당된다. +) 리스트의 size가 10이 아님! add 메서드 작동 방식add(E e) - 끝에 요소 추가위 사진은 ArrayList의 리스트 끝에 요소를 추가하는 add 메서드 내부 코드이다. 코드를 하나하나 살펴보자.modCount++ : 리스트가 수정될 때마다 증가하는 값이다. 이 값은 여러 스레드에서 ArrayList..
GC(Garbage Collection)란?JVM에서 메모리를 관리해 주기 때문에 더 이상 사용하지 않는 객체를 청소해 주는 작업이다. Java의 Heap 메모리 구조Java의 Heap 메모리는 객체가 동적으로 생성되고 관리되는 메모리 영역이다. 이 메모리는 크게 Young 영역과 Old 영역으로 나뉜다. Young 영역은 다시 Eden 영역과 Survivor 영역으로 세분화된다.1. Young 영역Young 영역은 상대적으로 짧은 생애를 가진 객체들이 위치하는 영역이다. 이 영역은 두 부분으로 나뉜다.Eden 영역: 새로운 객체가 생성되는 영역이다. 모든 객체는 처음에 Eden 영역에 생성된다.Survivor 영역: Eden 영역에서 살아남은 객체들이 이동하는 영역이다. Survivor 영역은 두 개로..
Java에서 final 키워드는 불변성을 보장하고 의도하지 않은 변경을 방지하기 위해 사용되는 강력한 기능이다. 이 포스트에서는 메서드 파라미터와 객체 필드에 final을 사용하는 이유에 대해 작성해보려고 한다. final 이란?final은 변수, 메서드, 클래스 등에 사용될 수 있는 키워드로, 변경이 불가능하거나 상속이나 오버라이딩을 금지할 때 사용되며 주로 불변성(immutability)을 보장하기 위해 사용된다. 메서드 파라미터에 final 사용 이유의도하지 않은 수정 방지: 파라미터를 final로 선언하면 메서드 내부에서 해당 파라미터의 값을 재할당할 수 없게 된다. 이로 인해 파라미터를 의도하지 않게 변경하는 것을 방지할 수 있다.public Player(final List playerNumbe..
Garbage Collection이란?Garbage Collection(GC)은 메모리 관리를 자동으로 처리해 주는 기능이다. Java, Kotlin 같은 언어에서는 개발자가 직접 메모리를 해제하지 않아도 되는데, 그 이유가 바로 이 GC 덕분이다. C 언어에서는 free()를 호출해 사용한 메모리를 수동으로 정리해야 하지만, Java는 JVM이 주기적으로 불필요한 객체를 감지하고 제거해 준다. Java에서는 메모리 누수를 막기 위해 System.gc()로 GC를 강제 호출할 수도 있지만, 이 방법은 성능 문제를 일으킬 수 있으니 사용하지 않는 것이 좋다. Minor GC와 Major GCJVM의 힙 메모리는 크게 두 영역으로 나뉜다: Young Generation과 Old Generation이다. 이 ..