ProCopier

ProCopier

ProCopier

  • 분류 전체보기 (198)
    • Baekjoon CodingTest (2)
    • Spring RoadMap (69)
      • Spring 핵심 원리 (9)
      • HTTP (8)
      • Spring MVC (16)
      • Spring DB (16)
      • Spring JPA 활용 (9)
      • Spring JPA 기본 (11)
    • Let's Kotlin (5)
    • How to become a real progra.. (42)
      • Front-End (5)
      • Back-End (20)
      • DataBase (0)
      • Network (0)
      • Projects (5)
      • DevOps (4)
    • 수업 · 스터디 (17)
      • 운영체제 (6)
      • 데이터베이스 (5)
      • 오픈소스 프로그래밍 (0)
      • 네트워크 (1)
      • 우테코 테코톡 정리 (5)
    • 코딩테스트 준비 (10)
    • 일상 (50)
      • 1일 1커밋 (4)
      • 잡담 (13)
      • 여행 (18)
      • 하루 한 줄 정리 (10)
      • 음악소개 (4)
  • 홈
  • 태그
  • 방명록
RSS 피드
로그인
로그아웃 글쓰기 관리

ProCopier

컨텐츠 검색

태그

최근글

댓글

공지사항

아카이브

[Spring Boot] 프로필 하나 조회하는데 쿼리가 5방? (JPA N+1 문제 해결과 성능 최적화)

안녕하십니까. 또 밤이네요. 이거 해결하고 자려다가, 기분이 너무 상쾌해서 블로그 글까지 쓰고 자려고 합니다.실은 3일 전에 머지한 코드인건 비밀입니다. 현재 진행 중인 '경찰과 도둑' 프로젝트에서 회원 프로필 조회 API를 개발하고 있었습니다. 내 정보 보"는 서비스에서 가장 빈번하게 호출되는 API 중 하나죠. 기능 구현은 끝났고, 뿌듯한 마음으로 스웨거로 http 요청을 날려봤습니다.응답은 잘 옵니다. JSON도 예쁘고요. 그런데... 하이버네이트 로그를 본 순간, 등골이 서늘해졌습니다. 1. 상황 발생 : DB가 비명을 지르다 (쿼리 폭격) 사용자 한 명의 프로필을 조회했습니다. 제가 기대한 건 SELECT * FROM Member WHERE id = ? 같은 깔끔한 쿼리 한 줄이었습니다.하지만 ..

자세히보기
[열심히 삽질] 대시보드 조회 15초 걸리던 거 0.1초로 줄임 (feat. DTO와 비즈니스 로직)

안녕하십니까. 밤이네요. 네 이제 곧 자려고요 이글만 쓰고. 금연 앱 'NoSmoke' 프로젝트를 진행하면서 대시보드 기능을 만들었습니다. 사용자가 금연에 성공한 날짜와 연속 기록(Streak)을 보여주는 아주 핵심적인 기능이죠. 처음 개발할 때는 데이터가 몇 개 없으니 "어? 잘 뜨네?" 하고 넘어갔습니다. 그런데 문득 한 생각이 스쳤습니다. "만약 10년 동안 담배를 참은 사람이 우리 앱에 들어오면 어떻게 될까?"호기심 반, 걱정 반으로 더미 데이터 10만 개(약 273년 치 기록)를 DB에 들이붓고 테스트를 돌려봤습니다.1. 상황 발생 : 서버가 비명을 지르다 (OOM 위기)사용자가 대시보드에 진입하는 순간을 가정하고 K6로 부하 테스트를 때려봤습니다. ...네, 망했습니다. 응답 속도가 15.0..

자세히보기
[열심히 삽질] 채팅 데이터 10만 건을 조회했더니 서버가 기절했다 : Pagination(Slice)과 무한 스크롤

안녕하십니까. 네 좋은 주말입니다. 껄껄. 금연 앱 'NoSmoke'의 AI 채팅 기능을 만들고 신나게 테스트를 하던 중이었습니다. 처음엔 채팅 메시지가 10개, 20개뿐이라 아무 문제가 없었죠. 그런데 문득 "사용자가 금연을 1년 동안 해서 채팅 데이터가 10만 개가 쌓이면 어떻게 되지?"라는 호기심이 발동했습니다. 그래서 더미 데이터 10만 건을 DB에 들이붓고 채팅방에 입장해 봤습니다. 결과는? 앱이 멈췄습니다. 서버 로그를 보니 메모리가 출렁거리고 난리가 났더군요. 오늘은 무식하게 다 가져오던(FindAll) 습관을 버리고, 필요한 만큼만 가져오는(Slice) 다이어트 과정을 기록해 봅니다.1. 상황 분석 : 코끼리를 냉장고에 넣으려고 했다기존 로직은 아주 단순했습니다. 사용자가 채팅방에 들어오..

자세히보기
[열심히 삽질] DB Connection Pool 고갈과 Thread Blocking 문제를 해결해보자 (후편) : RabbitMQ 도입과 비동기 처리를 통한 트래픽 제어

지난 이야기 : 가상 스레드는 은탄환(Silver Bullet)이 아니었다. [열심히 삽질] DB Connection Pool 고갈과 Thread Blocking 문제를 해결해보자 (전편) : Facade 패턴 도입, 메안녕하십니까. 싸피를 다니며 개인 프로젝트를 하고 있는데요, 이전에 만들어 둔 flutter 프로젝트의 백엔드를 Springboot로 개발해보자! 싶어 기능 개발을 하고 연결을 하던 중. 문제가 생긴 경험을minddokddok.tistory.com 저번 글에서 저는 "Gemini API 응답을 기다리는 3초 동안 스레드가 차단(Blocking)되는 문제"를 해결하기 위해 Java 21의 Virtual Thread를 도입했습니다. 결과는 어땠냐고요? 화려하게 망했습니다. 가상 스레드는 T..

자세히보기
[열심히 삽질] DB Connection Pool 고갈과 Thread Blocking 문제를 해결해보자 (전편) : Facade 패턴 도입, 메서드 분리와 Java 21 Virtual Thread 도입

안녕하십니까. 싸피를 다니며 개인 프로젝트를 하고 있는데요, 이전에 만들어 둔 flutter 프로젝트의 백엔드를 Springboot로 개발해보자! 싶어 기능 개발을 하고 연결을 하던 중. 문제가 생긴 경험을 낋여왔습니다. 이 프로젝트에는 금연 관련 상담을 할 수 있는 챗봇 기능을 지원하는데요. Gemini 2.0 flash 모델에 챗봇 설정을 해서 값을 요청하고 받아오는 방식입니다. 이렇게, 귀여운 스털링과 상담하는 과정에서 호출하는 MonkeyDialogueService 내 chatWithSterling 함수를 확인해보면 Gemini API에서 값을 가져오는 1 ~ 2초 동안 계속 트랜잭션이 걸려있는 것을 확인할 수 있습니다. 코드를 보니 아차 싶네요,, chatWithSterling 하나의 메서드..

자세히보기
[Docker] 도커 컴포즈(Docker Compose)

이번 포스트에서는 도커 컨테이너를 효율적으로 관리하기 위한 필수 도구인 도커 컴포즈(Docker Compose)에 대해 꼼꼼하게 정리해 본다.단일 컨테이너가 아닌, 여러 개의 컨테이너가 유기적으로 연결된 애플리케이션을 구축할 때 도커 컴포즈는 선택이 아닌 필수다.1. 도커 컴포즈란?도커 컴포즈(Docker Compose)는 단일 서버에서 여러 개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구다.2. 도커 컴포즈를 사용하는 이유여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때 도커 컴포즈를 사용하지 않는다면, 이를 테스트하거나 실행하기 위해 각 컨테이너를 하나씩 생성해야 한다. 예를 들어, 워드프레스(WordPress) 웹 애플리케이션을 구동하..

자세히보기
[Docker] 도커 이미지 : 개념, 명령어, Dockerfile 작성 및 배포까지

이전 글에서 도커 컨테이너의 라이프 사이클과 운영에 대해 다루었다면, 이번에는 그 컨테이너의 근간이 되는 '도커 이미지(Docker Image)'를 집중적으로 파헤쳐 본다.이미지를 어떻게 만들고, 관리하고, 공유하는지를 아는 것은 도커 활용의 핵심이다. 이번 포스팅에서는 이미지의 기본 개념과 명령어부터, Dockerfile을 이용한 빌드, 그리고 도커 허브(Docker Hub) 배포까지 완벽하게 정리한다.도커 컨테이너는 이미지를 기반으로 생성된다. 즉, 이미지는 컨테이너를 찍어내는 '거푸집'과 같다. 이 거푸집을 잘 관리하고 효율적으로 만드는 것이 도커 운영의 시작이자 끝이다.1. 도커 이미지(Docker Image) 개념 및 관리1-1. 도커 이미지란?도커 이미지는 컨테이너 실행에 필요한 파일과 설정값..

자세히보기
[Docker] 도커 컨테이너 : 라이프 사이클부터 네트워크, 볼륨, 로깅까지

이전 글에서 도커의 핵심 개념인 이미지와 컨테이너, 그리고 가상머신과의 차이점에 대해 알아보았다. 이번에는 도커를 실무에서 다룰 때 필수적으로 알아야 할 컨테이너의 생명주기(Lifecycle)부터 네트워크, 데이터 관리(볼륨), 그리고 로깅까지, 도커 엔진의 핵심 기능을 깊이 있게 정리해 본다.도커를 사용한다는 것은 단순히 컨테이너를 띄우는 것 이상의 의미를 가진다. 컨테이너가 어떻게 생성되고 죽는지(라이프 사이클), 컨테이너끼리 통신은 어떻게 하는지(네트워크), 데이터를 어떻게 영구적으로 보존할지(볼륨), 그리고 문제 발생 시 기록을 어떻게 남길지(로깅)를 이해해야 진정한 의미의 도커 활용이 가능하다.1. 도커 컨테이너 라이프 사이클 (Lifecycle) 및 명령어도커 이미지가 컨테이너로 생성되고 실행..

자세히보기
[Docker] 도커란 무엇인가? 가상머신과의 차이부터 아키텍처, 이미지/컨테이너 개념 총정리

현대 개발 환경에서 필수적인 도구로 자리 잡은 도커(Docker). 도대체 도커가 무엇이며, 기존의 가상화 기술과는 무엇이 다르길래 이렇게 널리 쓰이는 걸까? 이번 포스팅에서는 도커의 정의부터 핵심 아키텍처, 그리고 가장 중요한 이미지와 컨테이너의 개념까지 자세하게 파헤쳐 본다.1. 도커(Docker)란?도커(Docker)는 리눅스 컨테이너 기술을 기반으로 하는 오픈소스 프로젝트다. 리눅스 애플리케이션을 프로세스 격리 기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수 있게 도와준다. 흔히 '도커'라고 말할 때는 도커 엔진(Docker Engine) 혹은 도커와 관련된 생태계 전반을 지칭하기도 하지만, 그 핵심은 바로 '도커 엔진(Docker Engine)'이다.도커 엔진(Docker Engine)..

자세히보기
Flutter 금연 앱 'NoSmoke' 백엔드 확장 - 간단한 ERD 설계와 로그인 구현하기

이전 게시물에서 NoSmoke에 들어가는 기능들을 간단하게나마 소개하였다.이에 추가기능은 생각하지 않고 현재 구현된 부분들만 간단하게 ERD로 작성해보았다. 위 ERD를 참고해서 우선 로그인부터 구현하기로 했다. 로그인은 처음부터 SpringSecurity의 Filterchain을 쓰지 않고 간단하게 작성해봤다. 로그인 플로우를 먼저 이해하는게 중요할 것 같아서이다. 그리고 중요한건, 본인은 스프링부트 초보쟝이기 때문이다. 우선 Layered Architecture 중 가장 먼저 개발해야 할 Entity 부터 정의했다.보통 entity -> dto -> repo -> service -> controller 순으로 개발한다(카더라)package org.example.nosmoke.entity;import..

자세히보기
[하루 10분 테코톡 정리] 4. Why Spring? & Spring MVC

Why Spring?우리는 왜 스프링 + 자바를 사용하는 걸까? 기업에서 많이 사용해서? 그것도 맞다 그럼 왜 기업이 많이 사용할까? 트래픽과 규모가 큰 곳에서 성능 + 안정성을 모두 잡아야 하는데 있어 자바와 스프링 프레임워크가 매우 탁월하다는 것이다.그럼 그 이유가 무엇이기에 트래픽이 있고 규모가 있는 기업 시스템에서 성능과 안정성이 잡히는지에 대해 살펴보자. Spring MVC vs Node JS 전통적인 Spring Web 애플리케이션의 모델인 Spring MVC와 Node.js를 비교해보자, 우선 성능과 안정성 모두를 잡아야 하기 위해 Spring을 사용하는 거라고 했으니 성능 측면을 한번 살펴보자 Spring MVC는 요청을 멀티 스레드 + 동기처리 중심이다즉 요청마다 독립적인 스레드를 할..

자세히보기
[하루 10분 테코톡 정리] 3. Spring Boot 핵심 구조 이해

Spring Boot?스프링 기반 애플리케이션을 편하고 빠르고 개발할 수 있도록 도와주는 도구개발자가 최소한의 설정으로 스프링 애플리케이션을 개발할 수 있도록 하는 것이 모토이다. 스프링 부트의 특징 3가지(https://spring.io/projects/spring-boot) 1. stand-alone 독립 실행형 스프링 어플리케이션을 개발할 수 있다는 특징이다. 스프링 부트 이전의 배포 과정은 다음과 같았다.1) WAS를 설치 및 설정 - 2) 개발한 애플리케이션을 WAR 형식으로 패키징 - 3) WAS에 배포 이러한 배포 과정에서 개발자는 WAS 관련 설정, WAR 형식의 디렉토리 구조 등에 대한 이해가 필요했다. 즉 개발 외적인 러닝커브와 번거로운 측면이 존재했었다. 심지어 이렇게 WAR 형식으로..

자세히보기
[하루 10분 테코톡 정리] 2. IoC / DI / Bean / 생명주기

스프링을 이해하기 위해 알아야 하는 기본적인 컨셉인 IOC, DI, Bean, 생명주기 등 에 대한 우테코의 테코톡 영상을 정리하는 글이다. 우선 우테코 영상을 정리하기 전에 영상 외에 IOC, DI, AOP, PSA에 대해 간단히 알아본 내용도 이 페이지에 추가하였으니 영상 외적인 콘텐츠가 있더라도 양해해야한다. 스프링의 대삼각형IOC? Inversion of Control, 제어의 역전 이라는 뜻이다. 자바 코드를 작성해 객체를 생성할 때, 객체가 필요한 곳에서 직접 생성해 사용할 수 있다.public class A { b = new B(); // 클래스 A에서 new 키워드로 클래스 B의 객체 생성} 제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사..

자세히보기
Web Server와 Web Application Server의 차이점

Server?클라이언트에게 네트워크를 통해 정보나 시스템을 제공하는 컴퓨터 시스템을 말한다.공부를 하다가 웹 서버와 웹 어플리케이션 서버의 차이점이 궁금해 찾아보다가 정리하면 좋을 것 같아 공유해본다. Ws vs WAS 둘의 차이는 정적 콘텐츠를 serving하냐, 동적 콘텐츠를 serving 하냐의 차이이다.웹 서버는 정적 콘텐츠(static)를, 웹 어플리케이션 서버는 동적 콘텐츠(dynamic)를 제공한다. 정적 콘텐츠 : 만들어 놓은 그대로를 제공하는 것, ex. image, html, css 동적 콘텐츠 : 요청에 따라 추가적인 데이터 처리가 이루어진 컨텐츠를 제공하는 것. 일반적으로 DB가 필요하면 동적이라고 이해하면 되는데 사용자 요청에 따라 서버 로직 내부에서 데이터 가공이 처리된 후 반환..

자세히보기
[하루 10분 테코톡 정리] 1. Spring 기본 철학 & 기반 개념

Spring 기본 철학 & 기반 개념에서 고른 10분 테코톡은 총 4가지 이다(출처는 아래에 정리)다만 4가지 강의가 다 다른 해에 제작된 영상이기에, 겹치는 부분이 있어 겹치는 부분은 정리 과정에서 더 추가하는 방식으로 한번에 정리했다. 1. 서블릿 이전의 웹 어플리케이션? 초창기 웹 어플리케이션은 클라이언트에서 요청하면, html과 같은 정적인 파일만 제공가능할 수 있었다. 다만 정적콘텐츠만 제공하는 웹 서버는 사용자에게 다양한 화면을 전달하기 힘들다. 이를 해결하기 위해 CGI(Common Gate Interface)가 나오게 된다.CGI는 동적인 데이터를 제공하기 위한 규약을 말한다.클라이언트로 부터 요청이 오면, 서버는 CGI 구현체에게 동적 데이터를 요청한다, CGI 구현체는 이를 수행해 결..

자세히보기
자바 ORM 표준 JPA 프로그래밍(11 - 마지막), 객체지향 쿼리 언어1 - 중급 문법

자바 ORM 표준 JPA 프로그래밍 강의의 마지막 포스트인 이 글에서는 JPA 실무에서 가장 빈번하게 마주치는 성능 문제인 N+1 문제의 해결책(페치 조인)과, 실수하면 데이터 정합성이 깨질 수 있는 벌크 연산 등 매우 중요한 내용들이 포함되어 있다.자바 ORM 표준 JPA 프로그래밍 - 기본편 - 11. 객체지향 쿼리 언어2 - 중급 문법지난 글에서는 JPQL의 기본적인 문법과 사용법에 대해 알아보았다. 이번 글에서는 실무에서 반드시 알아야 하는 JPQL의 중급 문법을 다룬다. 특히 JPA 성능 최적화의 핵심인 페치 조인(Fetch Join)은 면접에서도 자주 등장하는 중요 개념이니 반드시 숙지해야 한다.이번 글에서는 경로 표현식, 페치 조인, 다형성 쿼리, 엔티티 직접 사용, Named 쿼리, 그리고..

자세히보기
자바 ORM 표준 JPA 프로그래밍(10), 객체지향 쿼리 언어1 - 기본 문법

지난 글에서는 JPA의 데이터 타입 분류인 값 타입(Value Type)에 대해 알아보았다. 엔티티 매핑도 배웠고, 연관관계도 맺었고, 데이터 타입도 이해했다. 이제 남은 것은 하나다. 바로 "원하는 데이터를 DB에서 어떻게 조회할 것인가?"이다. JPA를 사용하면 엔티티 객체를 중심으로 개발하게 된다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 하는데, 모든 DB 데이터를 객체로 변환해서 메모리에 올려두고 검색하는 것은 불가능하다. 결국 애플리케이션이 필요한 데이터만 DB에서 불러오려면 검색 조건이 포함된 SQL이 필요하다. 이번 글에서는 JPA가 제공하는 강력한 객체지향 쿼리 언어인 JPQL(Java Persistence Query Language)의 기본 문법에 대해 상세히 다..

자세히보기
자바 ORM 표준 JPA 프로그래밍(9), 값 타입

지난 글에서는 JPA의 성능 최적화 핵심인 프록시와 연관관계 관리에 대해 다루었다. 무조건 지연 로딩을 사용하라는 원칙은 이제 머릿속에 확실히 박혔을 것이다. 이번 글에서는 JPA에서 데이터를 분류하는 또 다른 기준인 값 타입(Value Type)에 대해 알아본다. "그냥 변수 선언해서 쓰면 되는 거 아냐?"라고 생각할 수 있지만, JPA에서 엔티티와 값 타입을 명확히 구분하지 않으면 나중에 데이터를 추적할 수 없는 심각한 부작용(Side Effect)에 시달릴 수 있다.자바 ORM 표준 JPA 프로그래밍 - 기본편 - 9. 값 타입1. JPA의 데이터 타입 분류JPA는 데이터 타입을 크게 두 가지로 분류한다.1.1 엔티티 타입 (Entity Type)@Entity로 정의하는 객체다.데이터가 변해도 식별..

자세히보기
자바 ORM 표준 JPA 프로그래밍(8), 프록시와 연관관계 관리

지난 글에서는 JPA의 고급 매핑인 상속 관계 매핑과 @MappedSuperclass에 대해 알아보았다. 이번 글에서는 JPA를 실무에서 사용할 때 성능 최적화와 직결되는 매우 중요한 개념들을 다룬다. 바로 프록시(Proxy)와 지연 로딩(Lazy Loading)이다. 또한 엔티티를 관리할 때 편리함을 제공하는 영속성 전이(CASCADE)와 고아 객체에 대해서도 깊이 있게 살펴본다. 이 부분은 JPA를 쓰면서 마주치는 쿼리 문제(N+1 문제 등)의 핵심 원인이 되는 곳이므로 반드시 완벽하게 이해하고 넘어가야 한다.자바 ORM 표준 JPA 프로그래밍 - 기본편 - 8. 프록시와 연관관계 관리1. 프록시 (Proxy)1.1 프록시가 왜 필요할까? 회원(Member)과 팀(Team)이 연관관계를 맺고 있다고..

자세히보기
자바 ORM 표준 JPA 프로그래밍(7), 고급 매핑

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 7. 고급 매핑1. 상속관계 매핑객체는 '상속'이라는 개념이 있지만, 관계형 데이터베이스에는 상속이라는 개념이 없다. 그나마 가장 유사한 것이 슈퍼타입-서브타입 관계라는 모델링 기법이다. JPA의 상속관계 매핑은 바로 이 객체의 상속 구조와 DB의 슈퍼타입-서브타입 관계를 매핑하는 것이다. 슈퍼타입-서브타입 논리 모델을 실제 물리 테이블로 구현하는 방법은 크게 3가지가 있다.조인 전략 (Joined Strategy): 각각 테이블로 변환단일 테이블 전략 (Single Table Strategy): 통합 테이블로 변환구현 클래스마다 테이블 전략 (Table-per-class Strategy): 서브타입 테이블로 변환JPA는 이 3가지 방식을 어노테이션 설정..

자세히보기
코딩테스트 알고리즘 - Floyd-Warshall(백준 11404 플로이드, 최단경로)

그래프 알고리즘 중 플로이드 워셜에 대해 알아보자. 그 전에 다익스트라 알고리즘을 다시 상기해보자면 다익스트라 알고리즘 : 하나의 정점에서 출발, 다른 정점까지의 최단 거리를 구하는 알고리즘이다. 즉 다익스트라는 매번 가장 작은 비용을 갖는 노드를 꺼내서 순회하는 방식이다.플로이드 워셜은 다익스트라와는 다르게, 모든 정점에서 모든 정점으로의 최단경로를 구하는 알고리즘이다. 다익스트라는 가장 적은 비용을 하나 씩 선택한다면, 플로이드 워셜은 기본적으로 거쳐가는 정점을 기준으로 알고리즘을 수행하는 것이다. 만약 위와 같은 그래프가 있을때를 가정해보자.이때 각 정점이 다른 정점으로 가는 비용을 이차원 배열 형태로 출력하면, 위와 같은 비용맵이 나온다. 이 테이블이 의미하는 바는 현재까지 계산된 최소비용이다...

자세히보기
코딩테스트 알고리즘 - Kruskal(백준 1647 도시분할계획, 최단경로)

최소 비용 신장 트리(MST)의 대표 알고리즘인 Kruskal을 소개하겠다 최소 비용 신장 트리(Minimum Spanning Tree)? 무방향 가중치 그래프에서 신장 트리를 구성하는 간선들의 가중치 합이 최소인 신장트리를 뜻한다.즉, 그래프에서 최소비용으로 순회하는 문제를 풀때 알아내야 하는 트리이다. 이전에 작성한 글이 Prim 알고리즘이였는데. Prim 알고리즘과 Kruskal 알고리즘의 차이는 뭘까?우선 Prim 알고리즘은, 하나의 정점에서 연결된 간선들 중 하나씩 선택하면서 MST를 만들어가는 방식이다그에 반해 Kruskal 알고리즘은 모든 간선들 중 간선을 하나씩 선택해서 MST를 찾는 알고리즘이다. 즉, 순서를 보면 1. 최초, 모든 간선을 가중치에 따라 오름차순으로 정렬 2. 가중치가 가..

자세히보기
코딩테스트 알고리즘 - Dijkstra(백준 1753, 최단경로)

그래프 알고리즘에서 가장 많이 활용되는 알고리즘인 다익스트라 알고리즘을 가져왔다 다익스트라 알고리즘?한 노드에서 다른 노드까지 가는데 최소 비용 이전에 작성한 글이 프림 알고리즘이였는데. 프림 알고리즘과 다익스트라 알고리즘의 공통점은 최소비용을 찾는다는 것이다.차이점은 프림 알고리즘은 최소신장트리(MST) 로써, 모든 정점의 수를 N개라고 볼 때 N-1개의 간선으로 모든 정점을 잇는 것이다. 다만 여기간선 가중치의 합은 최소여야 한다. 다익스트라 알고리즘은 프림 알고리즘과는 다르게 모든 정점을 가포함한 최소비용 경로를 구하는게 아니라, 특정 시작점에서 특정 도착점 까지의 최소 가중치 경로를 구하는 것이다.그렇기에 차이점을 정리하자면 1. 다익스트라는 시작점 -> 도착점으로의 경로 찾기이기에 합 누적, 누..

자세히보기
코딩테스트 알고리즘 - Prim MST(백준 1197, 최소 스패닝 트리)

MST(Minimum Spanning Tree)?스패닝 트리란? 모든 노드가 연결된 트리를 말한다 즉 MST는 최소의 비용으로 모든 노드가 연결된 트리 스패닝 트리란? 모든 노드가 연결된 트리를 말한다 즉 MST는 최소의 비용으로 모든 노드가 연결된 트리 MST를 푸는 방식은 대표적으로 두 가지 방법이 있는데 1. Kruskal 알고리즘: 전체 간선 중 작은비용 부터 연결(Greedy) 2. Prim 알고리즘: 현재 연결된 트리에 이어진 간선 중 가장 작은것을 추가 자료구조?Heap 활용,Heap : - 최대값, 최소값을 빠르게 계산하기 위한 자료구조 - 이진트리 구조 - 처음에 저장할 때 부터 최대값 or 최소값 결정하도록 핵심 코드heap = [[0, 1]]while heap: w, next_..

자세히보기
코딩테스트 알고리즘 - 이진탐색(백준 1920, 수 찾기)

이진탐색? 어떤 값을 찾을 때 정렬의 특징을 이용해 빨리 찾을 수 있다.정렬되어 있는 경우엔, 어떤 값 찾을 때 O(N) 이었던 시간복잡도가 이진트리인 경우 O(logN) 까지 줄어든다 아이디어?만일 1 ~ 8 숫자 중 특정 숫자를 찾아야 한다면,만일 그 수가 7이라면, 높낮이 가지치기를 해가면서 1 ~ 8 -> 4 ~ 8 -> 6 ~ 8 -> 7 로 기존에 1, 2, 3, 4, 5, 6, 7 을 순회해야하는 탐색과 달리 4번으로 줄어들 수 있다. 이진탐색에서의 핵심코드 def search(st, en, target) : if st == en : return ~~~ mid = ( st + en ) // 2 if nums[mid] target : se..

자세히보기
코딩테스트 알고리즘 - 투포인터(백준 2559, 수열)

투포인터?알고리즘 문제를 풀다보면 종종 마주치는 투포인터 문제, 투포인터는 리스트에 순차적으로 접근해야할 때 두 개의 점 위치를 기록하며 처리하는 방식이다. 즉 각 원소마다 모든 값을 순회해야할 때, O(N^2)의 시간복잡도가 들지만, 투포인터를 활용해 연속하다는 특성을 이용해 처리하면 O(N)의 시간복잡도로 끝낼 수 있다.두 개의 포인터가 움직이면서 계산하는 방식이 처음부터 생각하긴 어렵지만 예시를 통해 학습해보자. 백준 2559, 수열 : https://www.acmicpc.net/problem/2559 처음 생각나는 방식으로 하면, K번 돌면서 2개씩 잡은 값을 List에 넣어 값을 비교해 가장 큰값을 도출하는 방식이 있을텐데 이러한 경우 O(N^2)의 시간복잡도이다.다만 투포인트 형식의 알고리즘..

자세히보기
코딩테스트 알고리즘 - 시뮬레이션(백준 14503, 로봇청소기)

시뮬레이션?각 조건에 맞는 상황을 구현하는 문제지도 상에서 이동하면서 탐험하는 문제를 시뮬레이션이라고 생각하면 될 것 같다. 그래프 탐색과는 다르게 배열 안에서 이동하면서 탐험해 결과를 도출해내는 문제이다. 추가적인 알고리즘 학습 없이 풀 수 있으나 구현력이 중요하다. 매 시험마다 자주 출제되는 항목이니 연습해야 할 필요가 있다.대표적인 문제로 백준 14503 로봇청소기 문제를 들고 왔다. 시뮬레이션 문제를 볼 때 생각해야 할 것은, 반복적으로 일을 수행해야 한다는 점이다.그렇기에 while 문으로 모든 과정을 반복하고 특정 조건을 만나서 종료될 때 까지 수행하도록 한다. 이후 방향을 설정하고, 정해진 조건에 맞게 수행하면 된다. 개인적으로 문제해결을 하면서 두 가지 에러로 인해 정답도출이 어려웠는데1...

자세히보기
코딩테스트 알고리즘 - DFS(백준 2667, 단지번호 붙이기)

DFS? 그래프 탐색의 방법그래프 탐색은 어떤 것들이 연속해서 이어질 때, 모두 확인하는 방법--> 즉 Vertex와 Edge. 정점과 간선들이 있을 때 모두 확인하는 문제를 그래프 탐색이라고 한다. 그래프 탐색에는 크게 두 가지BFS : Breadth - first search(너비 우선 탐색)DFS : Depth - first search(깊이 우선 탐색) BFS는 자기 형제들을 먼저 확인한다. 무슨 말이냐? 위와 같이 자기 형제들을 다 거친후 그 자식들을 가는게 BFS,한 자식의 끝까지 갔다가 다음으로 계속 넘어가는게 DFS.그래서 아래 그림을 보면 BFS 같은 경우는 A B C D E F 순으로 탐색하고,DFS는 A D F C E B 순으로 탐색한다 연결된 노드를 탐색하는건 BFS로도 충분하다 ..

자세히보기
코딩테스트 알고리즘 - BFS(백준 1926, 그림)

BFS? 그래프 탐색의 방법그래프 탐색은 어떤 것들이 연속해서 이어질 때, 모두 확인하는 방법--> 즉 Vertex와 Edge. 정점과 간선들이 있을 때 모두 확인하는 문제를 그래프 탐색이라고 한다. 그래프 탐색에는 크게 두 가지BFS : Breadth - first search(너비 우선 탐색)DFS : Depth - first search(깊이 우선 탐색) BFS는 자기 자식들을 먼저 확인한다. 무슨 말이냐? 위와 같이 자기 자식을 다 커진후 그 자식들을 가는게 BFS,한 자식의 끝까지 갔다가 다음으로 계속 넘어가는게 DFS.그래서 아래 그림을 보면 BFS 같은 경우는 A B C D E F 순으로 탐색하고,DFS는 A D F C E B 순으로 탐색한다 BFS 아이디어?시작점에 연결된 Vertex를 찾..

자세히보기
코딩테스트 준비 - (1) 코딩테스트 준비 순서

백준, 프로그래머스로 끄적이며 코딩테스트 준비하다가 블로그로 작성하면 가독성도 높고, 자주 찾아볼 것 같아서 이렇게 정리하려고 한다. 우선 코딩테스트 준비 순서? 공부 순서에 대해서 먼저 이야기해보고 싶다. 코딩테스트란 - 시간 안에 주어진 문제를 푸는 시험 - 적절한 알고리즘을 선택해서 문제를 해결 - 여러 입력값을 넣고, 모두 통과해야 하는 시험이다.우선 개념을 이해한 후, 하루 몇과목씩 돌아가면서 풀어줘야 한다. 한 문제에 30분 정도를 잡고 틀린 문제라면 복습하면서 반복한다. 코딩테스트 필수 알고리즘을 적어 보자면BFS, DFS, 백트래킹, 시뮬레이션, 이진탐색, Greedy, DP, MST, 다익스트라, 플로이드가 대표적이다. 이 순서대로 난이도가 주어진다고 생각하고 글을 작성 할 생각이다. ..

자세히보기
티스토리 My_Github
© 2018 TISTORY. All rights reserved.

티스토리툴바