본문 바로가기
728x90

전체 글103

숫자 문자열 비교하기 (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.
[데이터 중심 애플리케이션 설계] 8. 분산 시스템의 골칫거리 결함과 부분 장애  단일 환경의 프로그래밍은 보통 예측 가능하고 결정적인 방식으로 동작한다. 예측 가능함과 결정적의 의미는 하드웨어가 올바르게 동작하면 같은 연산은 항상 같은 결과를 만든다. 또한 하드웨어에 문제가 있더라도 보통 시스템이 완전히 실패하는 결과를 만들기 때문에 중간 상태가 없다. 현실 세계의 불분명한 물리적 문제를 감추고 수학적 완벽함을 갖고 동작하는 이상화된 시스템 모델을 보여준다.   네트워크로 연결된 분산 환경 프로그래밍은 단일 환경과는 근본적으로 상황이 다르다. 물리 세계의 지저분한 현실을 마주해야 한다. 예측할 수 없는 방식으로 고장 나는 시스템의 일부분들은 비결정적인 부분 장애를 만든다. 심지어 성공 했는지 아닌지 알지 못하는 경우도 많다.비결정성과 부분 장애 가능성이 분산 시스.. 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.
728x90