[문제 링크]

https://school.programmers.co.kr/learn/courses/30/lessons/42884

[난이도]

- Level 3

 

[알고리즘]

- 그리디

 

[코드]

import java.util.*;

class Solution {
    public int solution(int[][] routes) {
        // 차량의 진출 지점을 기준으로 오름차순 정렬
        Arrays.sort(routes, Comparator.comparingInt(o -> o[1]));
        
        int count = 1; // 첫 번째 카메라 설치
        int camera = routes[0][1]; // 첫 번째 차량의 진출 지점에 카메라 설치
        
        for (int i = 1; i < routes.length; i++) {
            // 현재 차량의 진입 지점이 마지막 설치된 카메라보다 크면 새로운 카메라 필요
            if (routes[i][0] > camera) {
                count++; // 새로운 카메라 설치
                camera = routes[i][1]; // 카메라 위치 갱신
            }
        }
        
        return count;
    }
}

 

[풀이]

이 문제를 해결하기 위해 그리디 알고리즘을 사용합니다. 핵심 아이디어는 차량의 진출 지점을 기준으로 정렬한 후, 가장 많은 차량이 겹치는 곳에 카메라를 설치하는 것입니다.

  1. 차량의 진출 지점을 기준으로 정렬합니다.
  2. 첫 번째 차량의 진출 지점에 첫 번째 카메라를 설치합니다.
  3. 이후 차량을 순차적으로 확인하면서:
    • 현재 차량의 진입 지점이 마지막 카메라 위치보다 크면, 새로운 카메라가 필요합니다.
    • 새로운 카메라는 해당 차량의 진출 지점에 설치합니다.

설치한 카메라의 개수를 반환합니다.

RabbitMQ와 Kafka 모두 메시지 브로커이다. 하지만 목적과 동작 방식이 꽤 다르다.

쉽게 말하자면

  • Kafka : 대규모 데이터를 실시간 스트리밍
    • 실시간 로그 수집, 모니터링, 이벤트 스트리밍
    • 대규모 트래픽 처리
    • 인스타그램 피드, 넷플릭스 추천 시스템 등에 적합
    • 장기 저장을 목표
  • RabbitMQ : 큐에 담아 하나씩 처리
    • 이메일 인증, 결제 처리, 알림 전송 같은 소규모 작업에 적합
    • 트랜잭션 보장(한 번만 전달)
    • MSA간 데이터 전달
    • 단기 저장을 목표

 

'TIL' 카테고리의 다른 글

캐싱을 통한 성능 개선  (0) 2025.04.01
QueryDSL을 활용한 동적 쿼리 최적화  (0) 2025.03.31
DB인덱싱  (0) 2025.03.06
Cache  (0) 2025.03.05
Redis  (0) 2025.03.04

DB인덱싱은 데이터베이스에서 검색 속도를 높이기 위해 특정 컬럼에 대한 데이터를 따로 저장해주는 방식이다.

쉽게 말하면 책의 목차 같은것이다.

 

인덱스 동작 방식

  1. 특정 컬럼에 대해 정렬된 자료 구조(B-Tree, Hash 등)을 생성
  2. 컬럼 값과 해당 값이 저장된 레코드의 위치(주소)를 저장
  3. 검색 시 전체 테이블을 뒤지는 게 아니라, 인덱스만 조회해서 더 빠르게 원하는 데이터를 찾을 수 있다.

 

예를 들어 피자 가게에 1000명의 고객 명단이 있다. 컬럼으로는 손님 이름, 전화번호, 주소, 성별 등이 있다.

이 때 홍길동의 전화번호를 찾는다고 가정하면

 

인덱스가 없는 경우 : 손님 명단 처음부터 끝까지 하나씩 다 뒤져서 홍길동을 찾는다. -> 시간이 엄청 오래 걸림

 

인덱스가 있는 경우 : 가게 사장이 고객이름 순서대로 정리된 전화번호부(목차) 를 따로 만든다.

 

  • 강감찬 → 010-1111-2222
  • 김영희 → 010-3333-4444
  • 홍길동 → 010-1234-5678

바로 인덱스에서 홍길동을 찾아 전화번호만 딱 가져오면 된다. -> 시간이 매우 빠름

 

생각해보면 인덱스도 결국 모든 고객이름을 조회해야한다고 생각할 수 있다. 하지만 인덱스는 특별한 구조로 되어있다.

예를 들어 B-Tree라는 구조로 되어있다면. B-Tree는 루트를 먼저 찾고, 찾는 값이 크면 오른쪽 노드, 작으면 왼쪽 노드 이런식으로 가지를 타며 찾아가는 구조이다.

이런식으로 정렬되어있다면 홍길동을 그냥 찾으려면 5번만에 찾고, B-Tree로 되어있다면 3번만에 찾는다.

지금은 데이터가 5개라서 효율적이지 않지만 만약 데이터가 100만개라면 차원이 달라진다.

'TIL' 카테고리의 다른 글

QueryDSL을 활용한 동적 쿼리 최적화  (0) 2025.03.31
RabbitMQ 와 Kafka  (0) 2025.03.07
Cache  (0) 2025.03.05
Redis  (0) 2025.03.04
Spring Security의 @AuthenticationPrincipal 이해하기  (0) 2025.02.25

Cache는 본래 CPU 내부의 작은 영역으로 정말 빈번히 접근하게 되는 데이터를 저장해두는 임시기억 장치이다. 기본적으로 영속성을 위해 파일시스템(디스크)에 저장하고, 빠른 활용을 위해 메모리(RAM)에 저장한다면, 정말 많이 사용되는 휘발성 데이터가 캐시에 저장된다. 

 

이러한 캐시의 목적과 방식을 적용해 빈번하게 접근하게 되는 데이터베이스의 데이터를 Redis 등의 인메모리 데이터베이스에 저장함으로서 데이터를 조회하는데 걸리는 시간과 자원을 감소시키는 기술을 캐싱이라고 한다.

 

웹 브라우저에서는 자주 바뀌지 않는 이미지 등을 브라우저 캐시에 저장해 페이지 로드를 줄이는 것도 캐싱의 일종이다. 이는 RESTful 설계 원칙 중에서 응답이 캐싱이 가능한지 명시해야 한다는 제약사항으로도 나타난다.

 

'TIL' 카테고리의 다른 글

RabbitMQ 와 Kafka  (0) 2025.03.07
DB인덱싱  (0) 2025.03.06
Redis  (0) 2025.03.04
Spring Security의 @AuthenticationPrincipal 이해하기  (0) 2025.02.25
restdocs  (0) 2025.02.20

Redis : In-memory DB

 

RDS DB는 영속성을 제공하는데 목적을 두고있다. 이는 데이터가 사라지지 않게 하기 위해 파일시스템(SSD, HDD 등)에 저장한다는 의미이다. 컴퓨터가 저장되어도 데이터가 사라지지 않지만 기본적으로 데이터를 읽고 쓰는데 오래걸린다.

 

하지만 Redsi는 메모리, 즉 RAM에 데이터를 저장하기 때문에 복작한 입출력 과정이 필요하지 않다. RDS보다 빠르지만 언제든 사라질 수 있는 데이터를 다룬다. 특정 게시글의 조회수와 같이 빠르게 업데이트 되는 데이터, 또는 사용자 세션, 장바구니와 같은 시간이 지나면 삭제되는 데이터 등을 저장하기 위해 가장 많이 사용되어온 DB이다.

 

Redis는 NoSQL DB이다.

일반적인 RDS DB는 SQL을 사용한다.

SELECT * FROM users;

 

Redis를 비롯한 NoSQL DB는 (일반적으로) SQL을 사용하지 않는다.

SET greeting "Hello, Redis!"
GET greeting

 

NoSQL은 현재는 Not only SQL을 의미한다. 

기술이 발전함에 따라 데이터가 증가하고, 비정형데이터가 많아지고, 확장성과 유연성이 떨어져서 NoSQL이 생겨난것이다.

NoSQL DB의 종류 몇가지

  • Key-Value: 가장 단순한 형태의 데이터베이스로, Key에 Value를 저장하는 형태입니다. JSON, Python의 Dictionary, Java의 Map의 형태로 데이터를 관리한다고 생각할 수 있습니다.
  • Document: 객체를 표현하는 Document라는 단위로 데이터를 저장하는 형태입니다. Key - Value에서 발전했다고 볼 수 있으며, JSON, XML 등 복잡한 데이터를 저장하고 관리합니다.
  • Column-Family: 각 Row의 Column이 고정되어있지 않고, 필요한 데이터 Column을 이름, 데이터, Timestamp와 함께 저장하는 형태의 데이터베이스 입니다.

 

'TIL' 카테고리의 다른 글

DB인덱싱  (0) 2025.03.06
Cache  (0) 2025.03.05
Spring Security의 @AuthenticationPrincipal 이해하기  (0) 2025.02.25
restdocs  (0) 2025.02.20
n+1을 해결하는 여러가지 방식의 장단점  (0) 2025.02.19

+ Recent posts