StringBuilder, StringBuffer 클래스 내부적으로 가변적인 char[ ]를 멤버변수로 가짐 문자열을 여러번텍스트 연결하거나 변경할때 사용함 새로운 인스턴스를 생성하지 않고 char[ ]을 변경함 StringBuilder : 단일 쓰레드에서 사용 StringBuffer : 멀티 쓰레드에서 사용 - 동기화 append()을 이용하여 StringBuilder에 문자열 추가 String, StringBuilder로 문자열을 붙이는 예제이다. StringBuilder sb = new StringBuilder(); String str1 = "Hello"; String str2 = "World!!"; //StringBuilder 이용 sb.append(str1).append(" ").append(s..
벨만-포드(bellman-ford-moore) 알고리즘벨만 - 포드 알고리즘은 그래프에서 음수 가중치를 가진 간선이 있을 때 최단거리를 구하는 알고리즘이다.다익스트라 알고리즘과 같이 특정 노드에서 다른 모든 노드까지의 최단 거리를 탐색한다.다익스트라 알고리즘과 다르게 음수 간선이 포함되어 있어도 최단 경로를 구할 수 있다.음수 사이클이 있을 경우 정상 동작하지 않는다.음수 사이클의 존재 여부를 파악할 수 있다.매번 모든 간선을 확인하기 때문에 다익스트라에 비해 느리다.시간복잡도 : O(VE) => Vertex * Edge벨만 - 포드 알고리즘 동작 원리1. Edge 리스트로 그래프를 구현하고 최단경로 배열 초기화 하기위에서 말했듯이 벨만 - 포드 알고리즘은 매번 모든 간선을 확인한다.따라서 Edge 클래..
Scanner와 BufferdReader의 차이 BufferedReader, BufferedWriter은 버퍼를 사용하여 읽기, 쓰기를 하는 함수이다. 버퍼를 사용하지 않는 입력은 키보드의 키를 누르는 즉시 프로그램에 전달된다. 버퍼를 사용하는 입력은 키보드의 입력 이 있을 때마다 한 문자씩 버퍼로 전송한다. 이 버퍼가 가득차거나 줄 바꿈을 하면 버퍼의 내용을 한 번에 프로그램에 전달한다. Scanner은 1KB의 버퍼를 갖고, BufferedReader는 8KB의 버퍼를 가진다. 즉, Scanner은 더 자주 프로그램에 전달하고, BufferedReader은 조금 더 모아놨다가 프로그램에 전달한다. ( 쓰레기가 생길때마다 나가서 버리는 거랑, 쓰레기통에 모아놨다가 한 번에 버리는 차이 ) 버퍼는 키보드..
백엔드 개발자로 취업하기 위해 필요한 기술들 나는 지금 백엔드 개발자가 되기 위해 공부중이다. Java는 대학교에서, Spring은 인프런 강의를 통해 어느정도 배웠었다. 지금은 제로베이스라는 부트캠프의 커리큘럼에 따라 공부중이다. 내가 생각하기에 백엔드 개발자가 되기위해 알아야 하는 기술은 아래와 같다. Java Spring Framework 데이터 접근 기술 (JDBC, MyBatis, JPA) SQL CS 지식 좋은 코드를 짜기 위한 Java 관련 지식 Spring 개념에 대한 지식 코딩테스트를 뚫을 자료구조, 알고리즘을 다루는 실력 이중에 내가 지금 가장 중요하게 생각해야 할 것은 코딩테스트 준비라고 생각한다. 그 이유은 코딩테스트 준비를 하며 여러 알고리즘 문제들을 풀면서 전체적으로 Java를 ..
다익스트라(dijkstra) 알고리즘 다익스트라 알고리즘은 그래프에서 최단거리를 구하는 알고리즘이다. 가중치 그래프 상에서 출발노드에서 목표노드까지 이동하는 가장 짧은 경로를 찾는 방법을 찾는다. 하나의 출발 노드에서 다른 모든 노드로의 최단 경로를 구할 수 있다. 에지(간선)은 모두 양수여야 한다. 시간 복잡도 : O(ElogV) 그리디와 DP의 특성을 갖고 있다. 다익스트라 알고리즘 동작 원리 1. 인접 리스트로 그래프를 구현한다. [1] ->[ 2, 8 ] 은 1에서 2로 가는 가중치가 8이라는 뜻이다. 실제로는 아래와 같이 Edge 클래스를 만들어서 Edge 형 ArrayList배열을 선언하여 구성하였다. ArrayList[] graph; class Node{ int to; //가리키는 노드 in..
그리디 (greedy) 알고리즘 그리디 알고리즘은 현재 상태에서 보는 선택지 중 최선의 선택지가 전체에서 최선의 선택지라고 가정하는 알고리즘이다. 빠르게 근사치를 계산할 수 있지만, 결과적으로 전체 케이스 중 최적의 값이 아닐 수도 있다. 따라서 이 문제를 그리디 알고리즘으로 해결해도 될지 고민해 보는 것이 필요하다. 그리디 알고리즘 수행 과정 1. 해 선택 현재 상태에서 가장 최선이라고 생각되는 해를 선택한다. 2. 적절성 검사 현재 선택한 해가 전체 문제의 제약 조건에 벗어나지 않는지 검사한다. 3. 해 검사 현재까지 선택한 해 집합이 전체 문제를 해결할 수 있는지 검사한다. 만약 전체 문제를 해결할 수 없다고 판단되면 다시 1번으로 돌아가 과정을 반복한다. 이처럼 그리디 알고리즘을 수행하는 과정은 ..
이 문제는 최소 한의 강의실을 사용해서 주어진 강의를 모두 가능하게 만드는 방법을 찾는 문제이다. 첫째 줄에 1 - 3 강의를 위해 강의실 1이 필요하고, 둘째 줄에 2 - 4 강의를 위해 강의실 2가 필요하고, 셋째 줄에 3 - 5 강의를 시작 할 시점에는 강의실 1에서 강의가 끝난 시점 이므로 강의실 1을 이용할 수 있다. 그래서 총 강의실 2개가 필요하다는 결과가 나온다. 예제 입력은 단 3개 뿐이라 쉽지만, 입력이 많아지면 어떻게 해야 할까? 일단 시작시간이 빠른 순으로 정렬해야 한다. 어차피 빠른 시각에 시작하는 강의를 먼저 처리해야 하기때문이다. 그런데 추가로 종료시간도 빠른 순으로 정렬해야지 편할 것이다. 따라서 시작시간이 같을 경우 종료시간이 빠른 순으로, 이외에는 시작시간이 빠른 순으로 ..
클린코드 요즈음 클린코드 책을 읽고 있어서인지는 몰라도 나는 유지보수가 쉽고 가독성 좋은 코드를 짜는 것에 관심이 많은 것 같다. 이러한 고민은 처음으로 작은 프로젝트(엄청 작은(계산기만들기같은..))를 만들어볼 때부터 있었던 것 같다. (진짜 왕왕초보 때) 이렇게 코드를 짜니까 뭐가 뭔지 하나도 모르겠다. 이게 맞나? ㅋㅋㅋ 이 부분은 메서드로 빼는 게 나은가? 이 부분은 클래스를 만들어서 쓰는 게 나은가? 메서드이름을 어떻게 지어야 할까? if( isTrue == false )가 나은가 if(! isTrue)가 나은가? ... 이런 고민들을 하고, 내가 스스로 생각해서 이게 낫겠다 싶은 방법으로 하기도 하고, chat GPT에 물어보기도 하다가 결국 클린코드 책을 사서 읽는 중이다. 리팩터링 나름 초..