다익스트라 알고리즘은 최단경로를 구하는 알고리즘이다. 💡 최단경로 ➡ 정점 i에서 정점 j를 연결하는 경로 중 가중치의 합이 최소인 경로 정의 하나의 시작정점으로부터 모든 다른 정점까지의 최단 경로를 찾는 알고리즘 동적 프로그래밍 활용 ➡ 최단 거리는 여러 개의 최단거리로 이루어져 있다. 간선의 가중치가 음수일 경우 사용 불가 접근 특정 위치에서 특정 위치까지의 최단거리를 구하는 문제에 사용 구현 변수 인접행렬, 인접리스트 ➡ 그래프 정보 표현 distance[] ➡ 시작 정점에서 특정 정점까지의 경로의 최소를 저장하는 배열 visited[] ➡ 배열 방문 체크 알고리즘 distance[]의 값을 무한대로 초기화 시작 정점의 거리 0 ➡ distance[시작 정점] = 0 시작 정점과 인접한 노드에 대해..
이 글은 Travis CI나 GitHub Action에 대해 자세히 설명하지 않습니다. 이동욱 님의 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'라는 책으로 Travis CI를 통해 CI/CD를 구현한 적이 있다. 이 경험을 살려 진행하는 팀 프로젝트에서 Travis CI로 CI 환경을 구축했는데 문제가 발생했다. Travis CI는 무료인 줄 알았는데 아니었다... 처음 가입할 때 1달러도 빼갔었다. 여하튼 프로젝트는 진행해야 해서 대안을 알아보던 중 Jekins와 GitHub Action 두 가지 선택지가 나왔다. Jenkins 어디서 들은 말인데, "퇴사할 때 네가 하던 일을 젠킨스한테 시키고 나가"라는 농담을 할 정도로 주기적인 일을 하는 시종이라고 생각하면 된다. 하지만 진입 장벽이 높다는..
leet코드 문제를 풀다가 신기한 풀이가 있어서 공유합니다. 🎨 문제 이진수 숫자가 주어지면 1의 개수를 세는 문제이다. Number of 1 Bits - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 📘 풀이 풀이 방식은 다양하지만 새롭게 알게된 풀이가 있었다. 바로 비트 연산을 활용하는 것이다. 💡 입력값 n에 n - 1한 값을 AND 연산하면 1이 하나 빠진다. 위의 방법을 이용하면 n이 0이 될 때까지 해당 연산을 반복하고 반복 횟수를 리턴하면 1의 개수..
Spring Boot와 React를 사용하여 프로젝트를 진행하는 도중 배포 환경에서 문제가 생겼다. Spring Security와 JWT를 이용해 회원 서비스를 구현했는데 프론트 엔드의 요청에 token값이 서버로 전달되지 않는 문제가 발생했다. 이유는 Nginx에 있었다. 문제점 Nginx는 HTTP의 헤더에서 언더스코어'_'를 제거한 뒤 Spring Boot 서버로 보낸다. 이유는 언더스코어'_'와 대시'-'가 모두 언더스코어로 매핑되기 때문이다. 우리는 헤더를 'access_token'이라고 지었다. 이 때문에 헤더가 제거된 채 서버에 요청을 보낸 것이 문제였다. 해당 문제는 간단하게 해결할 수 있다. 해결 방법 /etc/nginx/nginx.conf 파일에 http ➡ server 위치에 아래 문..
쉘에서 명령어를 작성하다보면 자주 사용하는 명령어를 반복해서 작성하는게 귀찮을 수 있다. 그런 불편함을 해결하기 위해 우리는 별칭이라는 것을 설정할 수 있다. 별칭 설정하기 예를 들어 kubectl라는 명령어를 자주 사용해 k만 입력해도 kubectl 명령어가 실행되었으면 좋겠다면 # alias 별칭=명령어 echo 'alias k=kubectl' >>~/.bashrc 형태로 명령어를 입력하면 된다. 탭 완성 설정하기 짧은 별칭을 사용하더라도 이어서 오는 명령어가 생각보다 많다. 이 경우 bash shell의 탭 완성 기능을 사용할 수 있다. 'Tab' 버튼만 눌러도 명령어와 오브젝트 이름이 자동 완성이 된다! 자동 완성 기능을 사용하려면 해당 OS의 패키지 매니저로 bash-completion을 설치해..
본 내용은 남궁성님의 Java의 정석 3판의 내용을 요약하고 저의 생각을 정리한 것입니다. Java란? JAVA를 처음 접한다면 자바는 객체지향 언어라는 것만 알아 두는 것이 좋을 것 같다. Java의 역사 Java는 가전제품에 탑재될 소프트웨어의 운영체제를 개발하기 위해 만들어진 언어라고 한다. 당시 C++라는 언어를 사용하려 했으나 C++은 만족스럽지 못했나 보다... 그렇다고 언어를 새로 만드나요? Java의 특징 운영체제에 독립적이다. 기존 언어는 한 운영체제에 맞게 개발된 프로그램을 다른 종류의 운영체제에 적용하기 어려웠다. 하지만 Java는 JVM이라는 것을 통해 이를 해결했다. 자세한 내용은 뒤에서 다루겠다. 객체지향 언어이다. 객체지향 개념의 특징인 상속, 캡슐화, 다형성이 잘 적용된 순수..
sh script.sh sh 명령어로 쉘스크립트를 실행했는데 Syntax error: "(" unexpected가 발생하는 경우가 있다. 이는 script.sh 첫 번째 줄에 #!/bin/bash를 적지 않아서 발생하는 에러이다. 이를 shebang이라고 한다. 하지만 shebang을 명시해도 동일한 에러가 발생하는 경우 아래 명령어를 실행해보자. ls -l /bin/sh /bin/sh가 dash를 바라보는 경우 sh 명령을 실행할 때 bash가 아닌 dash가 실행되서 그렇다. 참고로 Ubuntu는 기본 쉘이 dash라고 한다. chsh 명령어 sudo chsh -s /usr/bin/bash 위 명령어를 통해 기본쉘을 변경할 수 있다. 기본쉘 확인 echo $SHELL
정의 그래프 알고리즘의 일종 상호 배타적 집합, Disjoint-set을 표현하기 위해 사용 서로 중복되지 않는 부분 집합들 포함 관계 여러 노드가 존재할 때 어떤 두 개의 노드를 같은 집합으로 묶어주고, 다시 어떤 두 노드가 같은 집합에 있는지 확인하는 알고리즘 두 가지 연산 Find 노드 X가 속해있는 집합 반환 Union (합집합) 노드 X가 포함된 집합과 노드 Y가 포함된 집합을 합치는 연산 접근 Union → 그래프의 노드연결 연결 정보가 주어질 경우 집합을 합쳐야 하는 경우 Find → 어느 그래프에 속해있는지 연결 정보를 가지고 어떤 집합에 속해있는지 찾을 때(반대로 속해있지 않은 경우도) 구현 트리 형태 사용 “부모 포인터 표현” 사용 각 노드에 대해 그 노드의 부모에 대한 포인터만 저장 ..