맞는데 왜 틀릴까..?

전체 글 306

[Effective Java] Item 43. 람다보다는 메서드 참조를 사용하라

람다보다도 더 함수 객체를 간결하게 만드는 방법이 메서드 참조(method reference)다. 어떤 람다에서는 매개변수의 이름 자체가 프로그래머에게 좋은 가이드가 되기도 한다. 이런 람다는 길이는 더 길지만 메서드 참조보다 읽기 쉽고 유지보수도 쉬울 수 있다. 람다로 할 수 없는일이라면 메서드 참조로도 할 수 없다. 메서드 참조의 5가지 유형 1. 정적 메서드를 가리키는 메서드 참조 2. 인스턴스 메서드를 참조하는 수신 객체(참조 대상 인스턴스)를 특정하는 한정적 인스턴스 메서드 참조 Calculator의 인스턴스를 생성하고 해당 인스턴스를 사용하여 한정적 인스턴스 메서드 참조를 생성한다. addFunction은 Calculator의 add 메서드를 참조하고 있으며 subtractFunction은 C..

Java/Effective Java 2023.07.08

[Java] 백트래킹 (N과 M (2))

앞서 푼 문제 N과 M (1)에서 출력 결과가 오름차순인 조건만 추가된 문제다. 풀이가 앞선 문제와 너무 비슷하고 간단해서 올리지 말까 고민하다가 그냥 올린다. https://www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 아래처럼 DFS를 조금만 수정해 주면 오름차순 조건이 추가되어 출력된다. DFS 백트래킹에서는 방문처리가 중요하니까 이에 신경 써서 풀자!

[Java] 백트래킹 (N과 M (1))

백준에서 N과 M 문제를 오랫동안 봐왔는데 이번 기회에 (1)부터 차례대로 풀어봐야겠다. https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net N과 M이 1부터 8사이이긴 하지만 브루트포스로 돌리면 시간복잡도가 말도 안 되게 높아질 것 같아서 다른 방법으로 풀어야 하는데 문제에 비해 생각보다 풀이법이 떠오르지 않았다. 블로그에서 예전에 풀었던 문제중에 비슷한 걸로 찾아봤더니 DFS를 활용한 백트래킹 문제였다. 내가 가장 못 푸는 문제 유형이니까 이..

[Effective Java] Item 42. 익명 클래스보다는 람다를 사용하라

익명 클래스 자바에서 익명 클래스는 이름이 없는 클래스로, 일회성으로 사용되는 클래스를 간편하게 정의할 수 있는 기능이다. 익명 클래스는 클래스 선언과 동시에 인스턴스를 생성하여 사용한다. 주로 인터페이스나 추상 클래스를 구현하거나 확장하는 데 사용되는데, 이를 이용하면 클래스를 별도로 정의하고 이름을 부여하지 않고도 필요한 구현을 작성할 수 있다. 익명 클래스 예 문자열을 길이순으로 정렬하는데, 정렬을 위한 비교 함수로 익명 클래스를 사용하였다. 람다 익명 클래스 방식은 코드가 너무 길기 때문에 람다식을 이용해 어떤 동작을 하는지 명확하게 나타낼 수 있도록 하자. 람다식을 함수 객체로 사용한 예제 위 익명 클래스로 작성한 정렬을 람다식으로 대체한 예제이다. 람다, 매개변수, 반환값의 타입은 각각 Com..

Java/Effective Java 2023.07.02

[Effective Java] Item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라

마커 인터페이스 마커 인터페이스 : 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해 주는 인터페이스 Ex) Serializable은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 직렬화 할 수 있다고 알려준다. 마커 인터페이스는 두 가지면에서 마커 애너테이션 보다 낫다. 1. 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 애너테이션은 그렇지 않다. 마커 인터페이스는 어엿한 타입이기 때문에, 마커 애너테이션을 사용했다면 런타임에야 발견될 오류를 컴파일 타임에 잡을 수 있다. 자바의 직렬화는 Serializable 마커 인터페이스를 보고 그 대상이 직렬화할 수 있는 타입인지 확인한다. 위 예에서..

Java/Effective Java 2023.06.30

[Effective Java] Item 40. @Override 애너테이션을 일관되게 사용하라

@Override 애너테이션의 장점 아래 코드는 어떤 문제가 있을까? 중복을 허용하지 않는 Set에 26개의 소문자를 10번 반복해 추가했으니 집합의 크기는 26이 출력되어야 하지만 260이 출력된다. 해당 equals는 재정의(overriding)한것이 아니라 다중정의(overloading) 한 것이다. Object의 equals를 재정의하려면 매개변수 타입을 Object로 해야 하는데 그렇지 않아서 별개인 equals를 새로 정의한 것이 되었다. Object의 equals는 == 연산자처럼 객체 식별성만을 확인하여 같은 문자를 소유한 바이그램 10개가 각각 서로 다른 객체로 인식되어 260을 출력한 것이다. 여기서 만약 @Override를 달았다면 컴파일러가 해당 오류를 찾아내주었을 것이다. 이렇게 ..

Java/Effective Java 2023.06.30

[Effective Java] Item 39. 명명 패턴보다 애너테이션을 사용하라

명명 패턴의 단점 테스트 메서드 이름을 test로 시작했을 때 단점 (명명 패턴) 오타 - 실수로 tsetSafetyOverride로 지으면 테스트 프레임워크가 무시하고 지나친다 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다. (클래스 이름을 TestSafetyMechanisms로 지었을 때 Junit은 클래스 이름에 관심이 없다.) 프로그램 요소를 매개변수로 전달할 방법이 없다. (특정 예외를 던져야만 성공하는 테스트가 있을 때, 기대하는 예외 타입을 테스트에 전달해야 한다.) Test 애너테이션 메타애너테이션 애너테이션 선언에 다는 애너테이션이다. Ex) @Retention(RetentionPolicy.RUNTIME) : @Test가 런타임에도 유지되어야 한다는 표시 @Target(Elem..

Java/Effective Java 2023.06.30

[Effective Java] Item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라

열거 패턴의 확장 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있지만 열거 패턴은 그럴 수 없다. 열거 타입을 확장하는 것은 좋지 않은 선택이지만 연산 코드 등 최소한의 쓰임새가 있다. 타입 안전 열거 패턴 타입 안전 열거 패턴은 열거 타입을 확장하여 더 많은 기능과 유연성을 제공하는 방식이다. 추가 정보를 가지는 필드와 메서드를 사용하여 상수에 대한 정보를 표현할 수 있고, 상수 집합을 제한하여 원하는 인스턴스만 생성할 수 있다. 이에 반해, 일반적인 열거 타입은 단순한 상수 값의 집합으로 사용되며, 추가 정보나 인스턴스 생성 제한 기능은 제공하지 않는다. 타입 안전 열거 패턴의 경우 ExtendedOperation 클래스를 정의하고 각 상수를 해당 ..

Java/Effective Java 2023.06.29

[Effective Java] Item 37. ordinal 인덱싱 대신 EnumMap을 사용하라

Ordinal ordinal은 Enum 타입의 객체에서 사용되는 메서드로 Enum 상수가 정의된 순서를 반환한다. Enum 상수는 0부터 시작하는 정수값을 가지며, 상수가 정의된 순서대로 0부터 1씩 증가한다. 해당 예제는 Weekday라는 Enum 타입을 정의하였으며, ordinal 메서드를 사용하여 WEDNESDAY 상수의 순서를 반환해 2를 출력한다. ordinal()을 배열 인덱스로 사용 시 문제점 이처럼 배열이나 리스트에서 원소를 꺼낼 때 ordinal 메서드로 인덱스를 얻는 코드가 있다. 해당 코드는 집합들을 배열하나에 넣고 enum의 ordinal 값을 그 배열의 인덱스로 사용하는 경우이다. 배열은 제네릭과 호환되지 않으니 비검사 형변환을 수행해야 한다. 배열은 인덱스의 의미를 모르니 출력 ..

Java/Effective Java 2023.06.29

[Java] 다이나믹 프로그래밍 (동전 1)

일부러 DP만 푸는 게 아니라 풀어보니 DP였다. https://www.acmicpc.net/problem/2293 2293번: 동전 1 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. www.acmicpc.net 해당 문제는 쉽게 점화식을 떠올릴 수 있는데 중복을 허락하지 않는다는 부분에서 고민이 길어졌다. 10원을 만들기 위해서는 dp[10] = dp[9] + dp[8] + dp[5] 처럼 제안된 동전의 값어치만 더하면 10원이 되는 식으로 점화식을 세울 수 있다. 하지만 이 문제는 중복을 허락하지 않는다. 예를 들어 만약 1과 2로 4를 만들어야할 때, ..