포스트

2020-11-27-TIL

컴퓨터 구조와 운영체제 추천 도서

  • 만화로 쉽게 배우는 CPU: 비전공인데 컴구조를 배운 적이 없다면 꼭 읽어 봅시다. 추천!
  • 실습과 그림으로 배우는 리눅스 구조: 리눅스와 OS에 대해 알 수 있는 좋은 책 추천!
  • 리눅스 커널 내부구조 (백승제, 최종무 공저): 리눅스 커널을 맛 볼 수 있는 좋은 책. 나름 쉬운 편입니다. C언어에 대한 기초적 이해가 필요합니다.

Long to Int in Java

long(64비트)을 int(32비트)로 바꾸는 방법은 크게 두 가지다. 하나는 (int) value처럼 캐스팅하는 것이다. JLS 5.1.3에 따르면 이런 축소 변환은 하위 32비트만 남기고 나머지를 버린다. 그래서 값이 int 범위를 넘으면 크기뿐 아니라 부호까지 바뀔 수 있고, 아무 예외도 나지 않는다.

다른 하나는 Java 8에 추가된 Math.toIntExact(value)다. 값이 int 범위 안이면 그대로 돌려주고, 넘치면 ArithmeticException을 던진다. 문제 풀이에서 오버플로가 조용히 지나가면 틀린 답의 원인을 찾기 어려우므로, 범위가 확실하지 않을 때는 이쪽이 안전하다.

1
2
3
long big = 3_000_000_000L;
int a = (int) big;              // -1294967296, 예외 없음
int b = Math.toIntExact(big);   // ArithmeticException

String compare by length

String.compareTo()는 사전순으로 비교하므로 길이순 정렬에는 맞지 않는다. 길이로 정렬하려면 Comparator를 따로 준다. Comparator Javadoc에 바로 이 예시가 있다. 길이로 먼저 비교하고, 길이가 같으면 대소문자를 무시한 사전순으로 비교한다.

1
2
3
Comparator<String> cmp = Comparator.comparingInt(String::length)
        .thenComparing(String.CASE_INSENSITIVE_ORDER);
list.sort(cmp);

LeetCode - Merge Two Sorted Lists

정렬된 연결 리스트 두 개를 받아 정렬된 리스트 하나로 합치는 문제다. 두 리스트의 머리를 가리키는 포인터를 하나씩 두고, 더 작은 쪽 노드를 결과 리스트 뒤에 붙인 다음 그 포인터만 앞으로 옮긴다. 한쪽이 끝나면 남은 쪽을 통째로 이어 붙인다. 결과 리스트 맨 앞에 값이 없는 더미 노드를 하나 두면 “첫 노드를 무엇으로 할지” 분기를 따로 쓰지 않아도 된다. 각 노드를 한 번씩만 보므로 시간 복잡도는 O(n + m)이고, 새 노드를 만들지 않고 기존 노드를 다시 연결하므로 추가 공간은 O(1)이다.

Runtime Error

1
2
3
java.lang.NoSuchMethodError: 'ListNode ListNode.deserialize(java.lang.String)'
	at __Deserializer__.toListNode(Unknown Source)
	at line 80, __Driver__.main

ListNode는 LeetCode 사이트의 채점 프로그램에서 내장하고 있으므로 주석을 풀면 안된다. 내부적으로 ListNode.deserialize() 메서드를 구현하고 있는데, ListNode를 덮어써버림으로써 원래의 메서드를 불러오지 못해서 발생하는 에러이다.

NoSuchMethodError Javadoc은 이 에러를 클래스에 있어야 할 메서드 정의가 없을 때 던져진다고 설명한다. 보통은 컴파일러가 먼저 잡아 주고, 클래스 정의가 호환되지 않게 바뀐 경우에만 실행 시점에 나타난다고 덧붙인다. 위 상황이 바로 그 경우다. 채점 코드는 deserialize()가 있는 ListNode를 기준으로 컴파일되어 있는데, 실행할 때는 내가 정의한 deserialize() 없는 ListNode가 대신 올라왔다.


자유 프로젝트 후보

  • 패스트 푸드점 주문시스템
  • 연도별, 월별 가계부
참고한 자료외부 출처 5

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다