두 개의 정렬된 배열이 주어졌을 때, 각 배열에서 원소를 하나씩 선택해 만든 합이 특정 목표 값(target sum)에 가장 가까운 쌍(closest pair)을 찾는 문제는 알고리즘 학습과 코딩 테스트에서 자주 등장하는 대표적인 유형입니다. 이 문제는 투 포인터(Two Pointer) 기법을 활용하면 모든 조합을 일일이 확인하지 않고도 선형 시간 안에 효율적으로 해결할 수 있습니다. 투 포인터 알고리즘의 동작 원리 정렬된 두 배열에서 가장 가까운 쌍을 찾는 절차는 다음과 같습니다. 첫 번째 배열은 왼쪽 끝(l = 0)에서, 두
개요정수 배열에 여러 숫자가 섞여 있을 때, 대부분의 요소는 짝수 번 반복되지만 단 하나의 요소만 홀수 번 나타나는 경우가 있습니다. 이런 상황에서 해당 요소를 찾아내는 것은 코딩 테스트나 실무에서 자주 마주치는 문제입니다. 이 글에서는 Java로 이 문제를 해결하는 방법을 단계별로 살펴보겠습니다.배열에서 홀수 번 등장하는 숫자를 찾기 위한 Java 코드는 다음과 같습니다.예제 코드public class Demo { static int odd_occurs(int my_arr[], int arr_size){ in
문자 스트림에서 반복되지 않는 첫 번째 문자를 찾는 것은 코딩 인터뷰나 실시간 데이터 처리에서 자주 만나는 대표적인 문제입니다. 아래의 자바 코드를 사용하면 문자열을 한 글자씩 처리하면서, 매 시점 기준 첫 번째 비반복 문자를 손쉽게 확인할 수 있습니다. 예제 import java.util.ArrayList; import java.util.List; public class Demo{ final static int max_chars = 256; s
Java에서 도달 불가능한 코드(unreachable code) 오류는 컴파일러가 판단하기에 특정 문장이 어떤 경우에도 절대 실행될 수 없을 때 발생하는 컴파일 오류입니다. 대표적인 원인으로는 종료 조건이 없는 무한 루프, return 문이나 throw 문보다 뒤에 위치한 코드 등이 있습니다.오류 발생 예제public class Demo{ public static void main(String args[]){ int val = 5; for
Java에서 사용자 정의 객체를 정렬해야 할 때 TreeMap을 활용하면 키 값을 기준으로 자동 오름차순 정렬을 손쉽게 구현할 수 있습니다. 아래 예제에서는 이름 나이 형태로 구성된 문자열 데이터를 파싱하여 나이순으로 정렬하고, 같은 나이일 경우 이름순으로 정렬하는 과정을 단계별로 살펴봅니다.예제 코드import java.io.*; import java.util.*; public class Demo{ static void sort_objects(String my_data){ String[] my_vals = m
사전 정의된 클래스 이름을 클래스 이름으로 사용하기Java에서는 Number, String 등과 같이 JDK 표준 라이브러리에 이미 존재하는 클래스 이름을 사용자가 직접 정의하는 클래스 이름으로 그대로 사용할 수 있습니다. 다음 예제를 통해 확인해 보겠습니다.예제public class Number{ public static void main (String[] args){ System.out.println(Pr
Java에서는 큰 숫자를 다룰 때 밑줄(underscore, _)을 사용하여 자릿수를 구분할 수 있습니다. 이 기능은 Java 7부터 도입되었으며, 긴 숫자 코드의 가독성을 크게 향상시켜 줍니다.사용 예제다음 코드는 Java의 int, long, float, double 타입 숫자 리터럴에서 밑줄을 활용하는 방법을 보여줍니다.public class Demo{ public static void main (String[] args) throws java.lang.Exception{ &nb
Java 9의 JShell에서는 세션 도중에 언제든지 변수를 자유롭게 선언할 수 있습니다. 사용자가 세션에 접속한 뒤 다음과 같이 간단하게 변수를 선언하면 됩니다.jshell> int val = 56위 코드에서 기울임꼴로 표시된 부분은 사용자가 세션에 로그인한 이후의 터미널 화면입니다.위 명령을 실행하면 아래와 같은 결과가 출력됩니다. 참고로 명령문 끝의 세미콜론(;)은 선택 사항이므로, 세미콜론을 붙이지 않아도 정상적으로 실행됩니다.출력 결과val ==> 56JShell에서 변수 이름에 정수 값을 할당한 후 Enter
Java 프로그래밍에서 사용자의 입력을 받아야 하는 경우는 매우 흔합니다. 이번 글에서는 Java 콘솔(표준 입력)에서 데이터를 읽어오는 대표적인 두 가지 방법, Scanner 클래스와 BufferedReader 클래스를 예제와 함께 자세히 살펴보겠습니다.1. Scanner 클래스를 사용한 콘솔 입력Scanner는 다양한 타입(문자열, 정수, 실수 등)의 입력을 손쉽게 읽을 수 있도록 지원하는 가장 널리 사용되는 클래스입니다.예제 코드import java.util.Scanner; public class Demo{ public
Java에서 정적(static) 메서드는 오버로드(overload)가 가능합니다. 다만 한 가지 조건이 있는데, 두 메서드가 오직 static 키워드 유무만으로 구별되는 경우에는 오버로드로 인정되지 않습니다. 즉, 매개변수의 개수나 타입이 달라야 정상적인 오버로드가 됩니다.오버로드 예제public class Demo{ public static void test(){ System.out.println(Demo 클래스의 test 함수가 호출되었습니다); } public static void test(
자바(Java)로 코드를 작성할 때는 반드시 지켜야 할 일정한 규칙과 표준이 있습니다. 예를 들어, 클래스는 변수와 함수(메서드)를 포함하며, 함수는 해당 변수들을 다루는 역할을 합니다. 또한 클래스는 상속을 통해 확장하거나 개선할 수도 있습니다.자바 프로그램의 기본 구조import된 패키지 목록; public class <클래스명> { 생성자 (사용자가 직접 정의하거나 암묵적으로 생성됨) {
Java에서는 Stream API의 filter()와 mapToInt(), sum() 메서드를 조합하면 리스트에서 특정 조건을 만족하는 요소만 골라 그 합계를 손쉽게 계산할 수 있습니다.예제 코드import java.util.*; public class Demo { public static void main(String[] args) { List<Integer> my_list = new ArrayList<Integer>(); my_list.add(11);
Java에서는 interrupt() 메서드를 사용하여 실행 중인 스레드를 중단(인터럽트)할 수 있습니다. 이때 InterruptedException 예외가 핵심 역할을 합니다. 대상 스레드가 sleep(), wait(), join()과 같은 블로킹 상태에 있을 때 interrupt()가 호출되면 해당 스레드는 InterruptedException을 받게 되며, 이를 catch 블록에서 처리하여 원하는 방식으로 실행을 종료하거나 제어할 수 있습니다.아래 예제는 현재 실행 중인 스레드가 인터럽트되면 catch 블록에서 새로운 Runti
Java 프로그래밍을 하다 보면 사용자로부터 여러 개의 값을 한 번에 입력받아야 하는 경우가 자주 발생합니다. 이럴 때 Scanner 클래스를 활용하면 한 줄에 입력된 여러 값을 손쉽게 처리할 수 있습니다.예제 코드다음은 한 줄에 실수형(double) 값과 정수형(int) 값을 함께 입력받는 예제입니다.import java.util.Scanner; public class Demo { public static void main(String[] args) { System.out.print(Enter two floa
Java에서 가변 인수(varargs)를 사용하다 보면 모호성(ambiguity) 문제가 발생할 수 있습니다. 이는 서로 다른 두 개의 오버로딩된 메서드가 모두 전달된 인수 값으로 호출하기에 유효한 경우에 생기며, 이때 컴파일러는 어떤 메서드를 호출해야 할지 판단하지 못해 컴파일 오류를 발생시킵니다. 예제 코드 아래 예제에서는 double 타입과 boolean 타입의 varargs를 각각 받는 두 개의 my_fun 메서드를 오버로딩하여 모호성 상황을 확인해 봅니다. public class Demo { static void m
JShell이란?JShell은 Java 9부터 도입된 대화형(Interactive) 셸 도구로, 코드를 파일로 저장하고 컴파일하는 과정 없이 한 줄씩 입력하여 즉시 실행하고 결과를 확인할 수 있는 REPL(Read-Evaluate-Print Loop) 환경입니다.기본으로 임포트되는 패키지JShell을 실행하면 별도의 설정 없이도 총 10개의 패키지가 자동으로 임포트됩니다. 덕분에 자주 사용되는 표준 라이브러리를 바로 활용할 수 있습니다.현재 세션에 임포트된 패키지 목록은 다음 명령어로 확인할 수 있습니다.jshell> /imp
펄(Perl)과 자바(Java)는 오랫동안 널리 사용되어 온 프로그래밍 언어지만, 설계 목적과 동작 방식에서 큰 차이를 보입니다. 이 글에서는 두 언어의 주요 특징과 핵심 차이점을 정리하여, 프로젝트나 학습 목적에 맞는 언어를 선택하는 데 도움을 드리고자 합니다. 자바(Java)란? 자바는 객체 지향 프로그래밍 언어이자 하나의 컴퓨팅 플랫폼입니다. 안전성, 속도, 신뢰성을 모두 갖춘 것으로 평가받으며, 기업용 애플리케이션부터 안드로이드 앱 개발까지 폭넓게 활용됩니다. 자바의 주요 특징 컴파일 및 실행 방식: 자바 소스 코드는
Java에서 split() 함수를 활용하면 별도의 검색 라이브러리 없이도 매트릭스(문자열 2차원 배열) 안에 특정 문자열이 존재하는지 손쉽게 확인할 수 있습니다. 이번 글에서는 가로(행) 방향과 세로(열) 방향 모두에서 문자열을 검색하는 방법을 예제 코드와 함께 자세히 알아보겠습니다.예제 코드import java.util.*; public class Demo { public static int search_string(String[] my_matrix, String search_string){ &
스칼라와 자바는 모두 JVM 위에서 동작하는 인기 있는 프로그래밍 언어입니다. 두 언어는 문법과 설계 철학에서 뚜렷한 차이를 보이며, 프로젝트의 성격에 따라 적합한 선택이 달라집니다. 이 글에서는 두 언어의 주요 특징과 차이점을 항목별로 정리해 살펴보겠습니다. 스칼라(Scala)의 주요 특징 스칼라는 함수형 프로그래밍과 객체지향 프로그래밍을 하나로 결합한 하이브리드 언어입니다. 간결하면서도 강력한 표현력을 제공하지만, 그만큼 학습 곡선이 가파른 편입니다. 함수형 프로그래밍과 객체지향 프로그래밍이 결합된 언어입니다. 문법이
n번째 항이 n² − (n−1)²로 주어지는 수열의 첫 N항까지의 합을 구하는 것은 코딩 테스트에서 자주 등장하는 대표적인 수학 문제입니다. 이 수열을 전개해 보면 다음과 같습니다.n² − (n−1)² = n² − (n² − 2n + 1) = 2n − 1즉, 이 수열은 1, 3, 5, 7…과 같은 홀수 수열이며, 앞의 항들이 서로 상쇄되는 텔레스코핑(telescoping) 성질에 의해 첫 N항의 합은 간단히 N²이 됩니다.N이 매우 커질 경우 N² 값이 long 범위를 초과할 수 있으므로, 일반적으로 큰 소수인 1000000007(