For-each vs For 자바에서 For-each 문이 전통적인 For문보다 더 빠르다는 정도만 알고 있엇는데, 특별하게 ArrayList에 경우는 오히려 For문이 더 빠르다는 얘기를 듣게 되었습니다. 실제로 얼마나 차이가 나는지 알아보고자 성능 테스트를 시도해보았습니다. 참고로, 여기서 말하는 For-each문과 For문은 아래와 같은 2가지 경우의 반복문을 말합니다. //For-each문 for (Integer integer : list) { integer++; } //For문 for (int i = 0; i < list.size(); i++) { Integer integer = list.get(i); integer++; } 테스트 코드 사이즈가 100인 List를 순차적으로 탐색해보았습니다. ..
Minimum Path Sum ☞ 문제링크 크기가 m,n인 2차원 배열의 좌측 상단(0,0)부터, 우측 하단(m-1,n-1) 까지 이동하는데, 이동 경로의 배열 값들을 모두 더하게 되는 경우, 이 값의 최소 값을 구하는 문제입니다. 예시로 들어둔 배열은 아래와 같습니다. 괄호안에는 좌표를 표시했습니다. 1 (0,0) 3 (0,1) 1 (0,2) 1 (1,0) 5 (1,1) 1 (1,2) 4 (2,0) 2 (2,1) 1 (2,2) 각 좌표들의 최소 합은 다음과 같이 구할 수 있습니다.좌표가 0,0 인 경우는 항상 그 좌표의 값과 같습니다. (경우의 수가 1개)좌표가 (0,x) 혹은 (x,0) 처럼 0이 들어가는 경우도 경우의 수가 1개 뿐입니다. 바로 이전의 좌표 값만 더해주면 됩니다. 예를들어 0,1의 ..
의존하는 객체가 자주 변하는 경우 Soldier(군인)이라는 클래스와 Gun(총)이라는 클래스가 있고, Soldier클래스는 Gun클래스를 의존하고 있다고 가정해봅시다. 이런 경우를 코드로 간략하게 나타내면 아래와 같습니다. class Soldier{ . . . Gun gun = new Gun(); . . . } 하지만 Soldier입장에서, 사용하는 무기가 Gun이 아닌 다른 경우가 존재 할 수 도 있습니다. 예를 들어, Sword(검)이라던지, Bow(활) 같은 경우입니다. 그럼 매번 의존하는 무기가 변경 될 때 마다 코드를 변경 해주어야 합니다. Soldier의 무기가 Sword로 변경 되어야 하는 경우 class Soldier{ . . . Sword sword = new Sword(); . . ...
참조 투명성 수학과 프로그래밍에서 모두 '함수'라는 말을 사용하고, 유사한 개념으로 사용됩니다. 하지만 둘의 결정적으로 다른 점이 있습니다. 수학에서의 함수는 같은 입력값이면 계산 된 결과는 항상 같습니다. 예를들어 f(x) = x*2 라는 함수가 있을 때, 같은 x 값을 넣게 되면 반환되는 f(x) 값은 항상 같습니다. 하지만 프로그래밍에서는 항상 같지 않습니다. int count = 0; int count(){ return count++; } 위와 같은 함수 count의 경우 매번 반환되는 값이 다르게 됩니다. final int x = 10; int getX(){ return x; } 반면 위와 같은 함수는 항상 같은 x의 값을 반환하게 됩니다. 이러한 경우를 '참조 투명'하다 라고 합니다. 앞서서 ..
Default Method 인터페이스는 기능에 대한 선언만 가능하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없습니다. 하지만 자바8에서 이러한 룰을 깨트리는 기능이 나오게 되었는 데 그것이 Default Method(디펄트 메소드)입니다. 메소드 선언 시에 default를 명시하게 되면 인터페이스 내부에서도 로직이 포함된 메소드를 선언할 수 있습니다. (접근제어자에서 사용하는 default와 같은 키워드이지만, 접근제어자는 아무것도 명시하지 않은 접근 제어자를 default라고 하며 인터페이스의 default method는 'default'라는 키워드를 명시해야 합니다.) interface MyInterface { default void printHello() { System.out.println..
Best Time to Buy and Sell Stock ☞ 문제링크 입력값으로 주식(Stock)의 가격이 나오게 되고, 가장 큰 수익을 내게 되는 경우의 수익값을 반환해주면 됩니다. 예를 들어, 입력값이 7,1,5,3,6,4 인 경우 가격1에 사서 6에 파는 경우 수익이 가장 크게 나오게 됩니다. 7인 경우는 1의 과거이기 때문에 1 이후에 나온 값 중에서만 팔아야합니다. 문제풀이 (java) 순차적으로 읽어가며 가장 작은 값이 나온 경우 minPrice를 대체하고, minPrice와 현재 시장가의 차로 수익을 계산 합니다. 수익이 이전까지 계산된 수익보다 큰 경우 대체합니다. 만약 minPrice를 따로 구하지 않고 모든 경우를 계산 하게 되면 정답을 구할 수는 있으나 효율성이 크게 떨어지게 됩니다...
Forbidden Zero ☞ 문제 링크 입력받은 정수의 다음 숫자를 구하면 됩니다. 다만 숫자 중에 0이 포함되어 있으면 안됩니다. 예를들어 9의 다음 숫자는 0을 포함한 10이 아닌 11이 되어야 하고, 99의 다음 숫자는 100이 아닌 111이 되어야 합니다. 입력 값에 1을 더한 숫자를 구하고, 그 숫자의 0이 있으면 그 0을 1로 바꿔주는 방식으로 0이 없는 다음 숫자를 구할 수 있습니다. 저는 숫자를 char로 바꾸고, char를 하나씩 비교해가며 0인 char를 1로 바꿔주는 방법을 선택 했습니다. 반환할때는 다시 정수로 변환합니다. 풀이코드 (java) public class Main { public static void main(String[] args) { Scanner sc = new..
NullPointException 자바에서 Null이 들어 있는 데이터를 다룰 때, NullPointException을 발생시킬 가능성을 내포 하고 있어서 항상 주의해야 합니다. 아래 코드 처럼 null로 선언된 문자열(String) 값의 길이를 출력할 때 Exception이 발생합니다. public static void main(String[] args) { String str = null;//외부 입력값이 null로 들어 온 경우로 가정합니다. System.out.println(str.length()); } //실행결과 Exception in thread "main" java.lang.NullPointerException 만약 Exception을 발생시키지 않고 싶다면 아래와 같은 방어적 코딩을 필수..