본문 바로가기
728x90

츄Log102

숫자 문자열 비교하기 (JAVA String compareTo) 안녕하세요! 오늘은 헷갈리기 쉬운 숫자로된 문자열을 비교하는 compareTo에 대해 알아보겠습니다. Comparable을 사용하면서 compareTo를 많이 보았을 것입니다. 오늘은 String class에 구현된 compareTo를 살펴보려고 합니다. 먼저 Comparable의 compareTo() 인터페이스의 시그니쳐를 살펴보겠습니다. 원본과 비교대상이 있을 때 compareTo의 리턴값이 음수면 비교대상이 큰 것, 양수면 원본이 큰 것, 0이면 두 객체는 같다고 판단합니다. 그럼 String class는 이 compareTo를 어떻게 구현하고 있는지 보겠습니다. 원본과 비교대상의 길이를 구합니다. 두 길이 중 짧은 길이를 선택하여 반복문을 돕니다. 각 문자열을 첫번째 문자부터 비교합니다. 두 문자.. 2023. 12. 7.
연습#6 H-Index 안녕하세요! 오늘도 알고리즘 연습은 계속됩니다. 프로그래머스 고득점Kit 정렬 마지막 level H-Index 문제를 풀었습니다. 생각보다 금방 풀었는데요, 문제 파트가 정렬이라 정렬이 핵심이라는 힌트는 처음부터 얻어서 빨리 풀었다고 생각합니다. 제 접근 방법은 다음과 같습니다. 10,000회라는 최대 인용 횟수가 있으니 10,000회 안에서 루프를 돕니다. 하나씩 순차적으로 증가하는 이 루프의 인덱스는 추정 인용 횟수입니다. 예를 들어봅시다. [0, 1, 3, 5, 6] 이 있을 때 0회 인용되었다고 가정 -> 인용된 논문 5개 1회 인용되었다고 가정 -> 인용된 논문 5-1 = 4개 2회 인용되었다고 가정 -> 인용된 논문 : 5-2 = 3개 3회 인용되었다고 가정 -> 인용된 논문 : 5-2 = 3.. 2023. 12. 6.
Base64 Encoding 안녕하세요! 오늘은 Base64 인코딩을 알아보겠습니다. Base64인코딩은 문자열 인코딩이 아닌 바이트열을 문자열로 인코딩하는 방법 중 하나입니다. Base64는 원본 바이트열을 6bit씩 잘라서 ASCII 코드로만 이뤄진 문자열로 인코딩하는 방식입니다. ASCII 코드는 8bit로 표현되는데, 6bit로 쪼개서 ASCII 코드로 변환된다면 전체 사이즈는 늘어나게 됩니다. 사이즈가 느는 만큼 장점이 필요한데요, 모든 시스템이 알고 있는 ASCII 코드로 처리되기 때문에 시스템간 규격을 맞추지 않아도 됩니다. 왼쪽 사진이 6bit 값에 대응되는 ASCII 문자이고, 오른쪽 사진은 6bit binary열에 대응되는 ASCII 문자입니다. 이 표를 활용하여 Base64 인코딩을 해보겠습니다. 원본 Hi AS.. 2023. 12. 6.
ASCII Code / Unicode / UTF-8 Encoding / URL Encoding 안녕하세요! 오늘은 헷갈리는 개념인 인코딩에 대해 한번 정리해보겠습니다. 인코딩이란 어떤 데이터를 규칙을 가지고 변환하는 행위입니다. 디코딩은 그 반대겠죠. 그럼 문자 인코딩(Charterset Encoding)은 무엇일까요? 아시다시피 컴퓨터는 모든 데이터를 0과 1인 binary data로 바라봅니다. 그래서 우리는 문자를 컴퓨터가 이해할 수 있는 byte로 변환해야 합니다. 인코딩을 이해하기 전에 먼저 '코드체계'라는 개념을 살펴보겠습니다. 코드체계는 컴퓨터가 이해할 수 있는 2진수로 인코딩 하기 위해 인간의 문자를 숫자에 매핑한 것입니다. ASCII Code와 Unicode가 이에 해당합니다. 1. ASCII Code ASCII Code는 가장 널리 쓰이는 코드체계로 오로지 영문자를 위한 것입니다.. 2023. 12. 6.
연습#5 가장 큰 수 정말 오래 걸렸습니다. 결국 다른 분들의 풀이를 보고, 이렇게 간단하다니.... 대체 어디서 사고가 막혀버린 걸까? 싶었습니다. 프로그래머스 정렬 level2인 가장 큰 수를 풀었습니다. 접근법은 간단합니다. 두 문자열을 더한 것들을 비교하면서 정렬하여 내림차순으로 만든 후, 그 정렬된 문자들을 모두 이으면 됩니다. 핵심은 이 부분입니다. Collections.sort(list, (a, b) -> { String as = a+"", bs = b+""; return -Integer.compare(Integer.parseInt(as + bs), Integer.parseInt(bs + as)); }); 갈 길이 머네요 ^_^.. 2023. 12. 6.
연습#4 폰켓몬 오늘도 알고리즘 문제 연습을 했습니다. 프로그래머스의 정렬 Level2를 풀다가 머리가 깨질 것 같아서 잠시 덮어두고(이따 다시 도전할 예정입니다.) 해시 Level2 문제를 풀었습니다. 어제 해시 Level1을 연습해서 그런지, 이번 문제는 10분만에 풀었습니다. 기분이 좋습니다. 오늘 푼 문제는 해시 > Level2 폰켓몬 입니다. import java.util.*; class Solution { public int solution(int[] nums) { final Map maps = new HashMap(); for (int num: nums) { maps.put(num, maps.getOrDefault(num, 0)+1); } if (nums.length/2 Integer.min(phonekem.. 2023. 12. 5.
연습#3 완주하지 못한 선수 오늘도 알고리즘 유형을 익히기 위해 프로그래머스 고득점Kit에서 레벨1짜리 문제, 해시>완주하지 못한 선수를 풀었습니다. 슥 보고 문제가 굉장히 쉽다고 생각해서 10분만에 풀어냈으나 테스트 케이스에서 틀려버렸고, 패인은 문제를 끝까지 읽지 않은 것이었습니다. 이후 풀이에서는 시간초과로 실패하고, 잠깐 포기할까 했으나 핀이 '중복은 카운트를 생각해볼 수 있다'라는 힌트를 통해 결국 풀어냈습니다. 문제 유형별 접근법을 익히게 되네요! import java.util.*; class Solution { public String solution(String[] participant, String[] completion) { String answer = ""; Map participantMap = new HashM.. 2023. 12. 4.
툼스톤(Tombstone)이란? 툼스톤 사용하는 이유 안녕하세요! 오늘은 분산 데이터 시스템에서 자주 사용되는 툼스톤에 대해 알아보겠습니다. 툼스톤은 묘비죠. 묘비는 무덤 앞에 있는 것으로 죽음을 표현할 때 사용됩니다. 묘비, 즉 툼스톤은 분산 데이터베이스 시스템에서 삭제된 데이터를 표현할 때 씁니다. 데이터를 삭제했을 때 묘비를 두어 데이터가 삭제됨을 표현하는 것이죠. 그럼 이 툼스톤은 왜 사용하는 걸까요? 분산 데이터 시스템은 Eventual Consistency 모델을 차용합니다. Eventual Consistency 특성상 삽입/삭제가 완료되었다고 하더라도 일부 노드에는 정보가 누락될 수 있습니다. 이런 특성은 삭제 명령시 문제를 야기합니다. 아래 멀티 노드 클러스터 예시를 보겠습니다. Node1에 데이터가 삽입되어 Node2에 복제합니다. Node.. 2023. 12. 3.
연습#2 K번째수 안녕하세요. 도저히 기본기가 부족하다는 생각에 핀의 추천으로 프로그래머스 알고리즘Kit을 풀기 시작했습니다. 정렬파트의 K번째수 문제를 풀었습니다. import java.util.*; class Solution { public int[] solution(int[] array, int[][] commands) { int[] res = new int[commands.length]; for (int i=0; i 2023. 12. 3.
싱글톤 안전하게 초기화하기 (thread-safe initialization) 안녕하세요! 지난번 Double Check Locking을 싱글톤 패턴을 통해 알아보면서, 싱글톤 객체 초기화를 개발자가 처리하는 것이 아닌 JVM에게 위임하여 해결할 수는 없을까? 고민하였습니다. JVM에게 위임하여 thread-safe하게 초기화하는 4가지 방법을 소개하겠습니다. 1. static field를 사용한 Early Initalization (Eager Initialization) public class EarlyInitSingleton { private static final EarlyInitSingleton INSTANCE = new EarlyInitSingleton(); public static EarlyInitSingleton getInstance() { return INSTANCE.. 2023. 12. 3.
연습#1 599. Minimum Index Sum of Two Lists 안녕하세요. 저는 알고리즘에 매우 취약하다는 약점을 가지고 있습니다. 이를 개선하기 위해 매일매일 쉬운 것부터 하나씩 풀어보기로 했습니다. 언젠가 저도 알고리즘이 익숙할 날이 오겠죠? LeetCode#599. Minimum Index Sum of Two Lists Minimum Index Sum of Two Lists - LeetCode Can you solve this real interview question? Minimum Index Sum of Two Lists - Given two arrays of strings list1 and list2, find the common strings with the least index sum. A common string is a string that app.. 2023. 12. 3.
Double Check Locking (DCL, 이중잠금) 안녕하세요! 오늘은 스레드간 동기화 작업에서 알고 있으면 유용한 패턴인 Double Check Locking(이중잠금)에 대해서 알아보겠습니다. Double Check Locking은 동기화 블록에서 불필요한 lock 획득을 줄여주는 패턴입니다. (즉, 동기화 구문을 최소화 시켜주는 전략입니다.) 아시다시피 lock획득은 비싼 비용이 들기 때문에 불필요한 lock 획득 작업을 없애면 성능 향상을 기대해볼 수 있습니다. 싱글톤 패턴을 사용하는 코드를 예제로 Double Check Locking을 알아보겠습니다. public class Singleton { private static TestObject instance; public static synchronized TestObject getInstance.. 2023. 12. 1.
728x90