본문 바로가기

분류 전체보기292

연결된 그룹 개수 찾기(DFS) 1. 각 노드의 방문 여부를 체크할 배열 생성 2. 각 노드에 연결된 노드를 추가할 배열 리스트를 추가 3. 각 노드에 연결된 노드들을 찾아 각 노드의 배열 리스트에 추가 4. 방문하지 않은 노드일 경우, dfs 진행 및 count 1 증가 dfs - 1. 방문할 노드인 경우 즉시 탈출, - 2. 해당 노드를 방문한 걸로 바꾸기 - 3. 연결된 노드들을 순회하면서 방문하지 않은 노드가 있다면, dfs 진행 class Solution { static List graph = new ArrayList(); static boolean[] visited; public int solution(int n, int[][] computers) { // 1 visited = new boolean[n]; // 2 for (.. 2023. 4. 25.
너비 우선 탐색(BFS) vs 깊이 우선 탐색(DFS) 일단, 둘을 다음 그림을 통해 이해해보자. 너비 우선 탐색(BFS) 특징 depth는 0이 아닌 1부터 시작 노드 수가 적고 깊이가 얕은, 검색 대상의 규모가 작은 경우, 유리하다. 큐 이용 장점 답이 되는 경로가 여러 개인 경우에, 최단 경로를 보장한다. 최단 경로가 존재하면, 어느 한 경로가 무한히 깊어진다 하더라도, 최단 경로를 반드시 찾을 수 있다. 단점 DFS에 비해 저장 공간의 필요성이 크다. DFS와는 달리 큐를 이용해서 다음에 탐색할 노드를 저장하므로, 노드의 수가 많을수록 필요 없는 노드들까지 저장해야 하기 때문이다. 최악의 경우에는 모든 경로를 다 살펴봐야 한다. 깊이 우선 탐색(DFS) 특징 depth는 0이 아닌 1부터 시작 검색 대상의 규모가 클 경우, 유리하다. 재귀, 스택 이용.. 2023. 4. 25.
서버에서 내려주는 에러 메시지를 직접 정의해야만 하는 이유 1차원적으로 개발자가 에러 메시지를 마음대로 컨트롤할 수 없음이 제일 큰 문제이다. 이유를 좀 더 상세하게 풀어보자. 스프링 프레임워크에서 기본으로 제공되는 형식화된 StatusCode, ErrorMessage로 응답을 내려주기 때문에, 소통하는 상대 서버나 클라이언트가 이해할 수 없다. 또, 상호 간에 정해놓은 에러 메시지에 대한 규칙이 깨질 수 있다. 에러 메시지를 서버에서 커스텀하게 정의해주지 않게 되면, 스프링 프레임워크에 종속적인 에러 메시지를 가져다 쓰게 되는 것이고 자연스레 개발자는 스프링 프레임워크에 의존적이게 되는 것이다. 어느 날 갑자기 스프링 프레임워크가 특정 에러에 대한 업데이트를 한다면, 갑자기 클라이언트에서 예상치 못한 장애가 발생할 수 있게 된다. 또 다른 이유로는 의도치 않게.. 2023. 4. 22.
Java 에러 - Exception in thread "main" java.util.regex.PatternSyntaxException 다음과 같이, "+"를 구분자로 split() 메서드를 이용해서 문자열을 분리하려 했다. 에러 메시지는 다음과 같았다. 구글링을 통해 확인해보니, ?, *, +, (, ), [, ], {, } 와 같은 일부 특수 문자를 replace(), replaceAll(), split() 메서드의 구분자나 기준으로 사용할 때 발생하는 에러라고 한다. 해결방안은 위 특수문자 앞에 역슬래쉬 2개(\\)를 같이 넣어주면 가볍게 해결할 수 있다. // example String str = "123+456"; String[] strArr = str.split("\\+"); // 역슬래쉬 = 원화 표시 // strArr = ["123", "456"] ++ 위 특수문자 양 옆에 대괄호([])로 감싸줘도 가능하다. // exam.. 2023. 3. 20.
우선순위 큐(Priority Queue)를 공부하면서 Queue는 먼저 선입선출(FIFO)이라는 특징을 가지는 구조이다. (Stack은 후입선출 - LIFO) 그럼 우선순위 큐는? 우선순위 큐는 말 그대로 우선순위가 높은 데이터를 먼저 뽑아내는 구조를 말한다. 그럼 여기서 의아할 게 어떤 기준을 가지고 우선순위를 정하는 걸까 싶은데, 단순히 요소의 크기를 우선순위를 잡고 오름차순, 내림차순 정렬을 할 수 있고, 우선순위 큐의 타입을 배열로 지정한다면, 특정 요소의 크기순으로 우선순위 기준을 잡을 수도 있다. Queue pq = new PriorityQueue(Comparator.comparingInt(o -> o[1])); (pq라는 우선순위 큐에는 int타입의 1차원 배열이 들어가게 되고, 배열의 1번째 인덱스의 값을 기준으로 정렬이 된다) Java에서 .. 2023. 3. 6.
2023년 2월 27일 - SI 탈출용 백엔드 학습 공략집 웨비나 회고 부트캠프 수료를 하고, 백엔드 개발과 관련된 세미나는 원 없이 듣고 싶었다. 부트캠프에서 프로젝트를 하면서 AWS 서비스를 사용해보지 못해서 관련된 지식을 좀 쌓고 싶었기 때문에, 첫 번째로 AWS에 관련된 웨비나를 들었다. 여러 AWS 서비스와 EC2, S3, RDS 등등 직접 과정을 진행하는 웨비나였는데, 큰 도움은 되지 못했다. 그 후에 들었던 것이 이 SI 탈출용 백엔드 학습 공략집 웨비나였다. 현재 취준생인 나는, 이직을 주제로 하는 이 웨비나와는 살짝 거리가 있었지만, 꽤나 도움은 됐다. 이 웨비나를 통해, 현재의 나에게 도움이 되었던 말 5가지는 다음과 같다. 인생은 선택이 전부다. 한정된 선택의 기회 중에서 좋은 선택은 인생을 좌우한다. 이직에 관련된 웨비나였기에, 이직에 대한 좋은 기회는.. 2023. 3. 5.
작성중) 클린 코드(Clean Code) - Uncle Bob; Robert Cecil Martin 책의 제목 그대로 깨끗한 코드 작성법을 알기 위해 읽게 되었다. 이 책에서 워드 커닝햄(Ward Cunningham)의 말을 인용한 부분이 인상깊었다. 코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면, 깨끗한 코드라 불러도 되겠다. 코드가 그 문제를 풀기 위한 언어처럼 보인다면, 아름다운 코드라 불러도 되겠다. 깨끗한 코드는 읽으면서 놀랄 필요가 없어야 한다고 워드는 말한다. 즉, 코드를 독해하느라 머리를 쥐어짤 필요가 없어야 한다고 말한다. 프로그래밍 공부를 시작한지 별로 안되었지만, 이 인용문을 보면서 저절로 고개를 끄덕이게 되었다. 반드시 알아야 하는 객체 지향 설계의 다섯 가지 원칙은 다음과 같다. SRP(The Single Responsibilty Principle) : 클래스에는 .. 2023. 3. 3.
Java 진수 변환 10진수 → n진수 public class Test { public static void main(String[] args) { int k = 15; System.out.println("10진수 → 2진수"); System.out.println(Integer.toString(k,2)); System.out.println(Integer.toBinaryString(k)); System.out.println(); System.out.println("10진수 → 3진수"); System.out.println(Integer.toString(k,3)); System.out.println(); System.out.println("10진수 → 4진수"); System.out.println(Integer.toString.. 2023. 2. 18.
2개 리스트의 교집합, 합집합, 차집합 구하기 교집합 retainAll() 메서드로 두 리스트의 교집합 구하기 import java.util.Set; import java.util.HashSet; import java.util.Arrays; import java.util.List; import java.util.ArrayList; public class Test { public static void main(String[] args) { Set str1Set = new HashSet(Arrays.asList("ab", "bc", "cd", "ef", "fg")); Set str2Set = new HashSet(Arrays.asList("cd", "ef", "fg", "gh", "hi")); Set intersection = new HashSet(st.. 2023. 2. 17.