본문 바로가기
Class 클래스 자신이 속한 클래스의 정보를 담은 클래스 접근 방법 Student student = new Student(); 1. 생성된 객체로부터 접근 -> student.getClass(); 2. 클래스 리터럴로 접근 -> Student.class 3. 클래스 이름으로 접근 -> Class.forName("Student") Java Reflection API를 통해 클래스 정보에 접근할 수 있다. * Java Reflection API란? -> 힙 영역에 로드된 Class 타입의 객체를 통해, 원하는 클래스의 인스턴스를 생성할 수 있게 지원하고, 인스턴스의 필드와 메서드를 접근 제어자와 상관없이 사용할 수 있도록 지원하는 자바 API https://papimon.tistory.com/82 2022. 4. 1.
그래프 구현 방식 그래프 구현 방식에는 2가지가 있다. 1. 인접 행렬 2. 인접 리스트 최단 거리 알고리즘 1. BFS - 간선 가중치가 없을 때 2. 다익스트라 - 간선 가중치가 있을 때 3. 벨만-포드 - 음의 가중치가 있을 때 4. 플로이트 워셜 - 모든 정점에서 모든 정점까지의 최단거리를 구할 때 https://velog.io/@ehdrms2034/알고리즘-최단-경로-알고리즘-다익스트라-벨만-포드-플로이드-알고리즘 2022. 3. 31.
String Constant Pool String s1 = "hello"; String s2 = new String("hello"); String s3 = new String("hello").intern(); // s1, s2 비교 System.out.println(s1 == s2); // false System.out.println(s1.equals(s2)); // true // s2, s3 비교 System.out.println(s2 == s3); // false System.out.println(s2.equals(s3)); // true // s1, s3 비교 System.out.println(s1 == s3); // true System.out.println(s1.equals(s3)); // true s1처럼 리터럴로 String 객.. 2022. 3. 25.
[3차] 압축 - 2018 KAKAO (Java, Level 2) 처음 풀이 1. 사전 생성 후 알파벳 등록 - Map에 기본 알파벳을 값과 함께 저장 - 뒤로 새로운 문자열 나오면 계속 추가 //사전 Map dictionary = new HashMap(); for (int i = 65; i < 91; i++) { dictionary.put((char)(i)+"", i-64); }//for end 2. 문자열 탐색 - 색인값을 추출하지 않은 인덱스서부터 탐색 - 간격을 하나씩 벌리면서 주어진 문자열을 자른 후 사전에 있는지 확인 - 자른 문자열이 사전에 없으면, 직전 간격으로 자른 문자열의 색인 번호를 출력, 현재 자른 문자열을 사전에 등록, 현재 자른 문자열에 포함되지 않은 문자로 인덱스를 이동 - 간격을 벌리다가 만일 문자열 인덱스를 넘어가면, (try~catch).. 2022. 3. 25.
후보키 - 2019 KAKAO BLIND RECRUITMENT (Java, Level 2) 처음 생각 - 컬럼들을 조합하여 한 조합 당 각 컬럼의 문자열을 합친 다음 이를 Set에 삽입한다. Set의 사이즈가 전체 튜플의 수와 같다면 튜플을 유일하게 식별할 수 있다는 의미이므로 후보키가 되는 컬럼 조합이다. - 모든 컬럼 조합에 대한 유일성 조사를 어떻게 할 것인가? 컬럼이 4개라 하면 0 1 2 3 01 02 03 12 13 23 012 013 023 123 1234처럼 컬럼 갯수가 다른 조합까지 어떻게 식으로 표현해야 하나? - 만일, 유일성을 만족하는 컬럼 조합이 0 01 12 123일 때 어떤 식으로 저장해야 최소성을 검사할 수 있을까? int[]? 새로운 객체? 등등 해결되지 않거나 지나치게 복잡해보이는 흐름이 많았다. 참고 풀이 위에서 하던 고민을 해결해주는 개념이 있었다. 바로 비.. 2022. 3. 22.
AVL 트리 vs Red-Black 트리 BST(Binary Search Tree, 이진탐색트리)는 key 삽입 순서에 따라서 트리의 모양 및 균형이 많이 달라진다. BST에서 검색 시간복잡도는 보통 O(logN), 즉 트리의 높이 값이다. 하지만 트리의 모양이 한 쪽으로 치우친 최악의 상황이라면 BST의 이점을 하나도 살리지 못하고 시간 복잡도가 O(N)이 된다. AVL 트리, Red-Black 트리 모두 BST(Binary Search Tree, 이진탐색트리)의 단점을 보완하기 위한 자료구조이다. AVL 트리는 트리 높이를 이용한 BF(Balance Factor, 균형도)를 노드마다 계산하여 삽입/삭제 시에 균형을 맞춘다. Red-Black 트리는 각 노드에 Red 혹은 Black을 배치해 다양한 규칙을 이용해 트리의 균형을 맞춘다. 두 트.. 2022. 3. 19.
프렌즈4 블록 - 2018 KAKAO BLIND RECRUITMENT (Java, Level 2) 처음 풀이 1. 삭제할 블록 체크 2. 블록 삭제 3. 블록 이동 이 세 과정을 더 이상 삭제할 블록이 없을 때까지 반복하면 된다. //각 글자를 요소로 할 2차원 배열 char[][] gameBoard; //사이클마다, 삭제할 2x2 블록의 첫 번째 원소의 좌표 담을 set Set set = new HashSet(); //삭제되는 블록의 갯수 int count; public int solution(int m, int n, String[] board) { //m x n 사이즈의 2차원 배열 생성 gameBoard = new char[m][n]; //게임 보드 알파벳 채우기 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { gameBoard[i][j.. 2022. 3. 19.
튜플 - 프로그래머스 (Java, level 2) 처음 풀이 "{{1,2,3},{2,1},{1,2,4,3},{2}}" 에서 각 { } 묶음을 요소로 하는 String[]을 split(regex) 사용해서 만든다. (첫번째 요소 : "1,2,3" 두번째 요소 : "2,1" 세번째 요소 : "1,2,4,3") split()에 파라미터로 들어갈 정규 표현식은 "{{" "},{" "}}" 을 포함하면 된다. 이를 일반화하면, 1. { or } 둘 중에 하나 2. , 가 들어가거나 안들어가거나 3. { or } 둘 중에 하나 이 1, 2, 3이 하나의 그룹이면 된다. "( [ { } ] , ? [ { } ] )" 이를 정규표현식으로 나타내면 다음으로 나타낼 수 있다. (문자 사이사이 띄어쓰기는 무시) 주어진 문자열을 보면 항상 시작이 {{ 이므로 split()으.. 2022. 3. 16.
오픈채팅방 - 프로그래머스 (Java, Level 2) 처음 풀이 닉네임이 변경될 때마다 이전 로그기록을 수정해야한다. 따라서 어떤 유저인지에 대한 메시지인지 1차로 기록하고, 기록이 다 끝난 후 최종 닉네임으로 바꿔준다. 1차 기록은 {유저 아이디, 입장/퇴장 메시지} 형태로 List에 저장 닉네임 기록은 변경될 때마다 기존 값을 덮어써야 하니까 Map (key : 유저아이디, value : 닉네임)에 저장 import java.util.*; class Solution { final String ENTER_MSG = "님이 들어왔습니다."; final String LEAVE_MSG = "님이 나갔습니다."; //중간 결과물 담을 List ({유저아이디, ENTER_MSG or LEAVE_MSG}) //순서대로 결과 출력해야하니까 Queue 자료구조 List.. 2022. 3. 15.
단체 사진찍기 - 프로그래머스 (Java, Level 2) 전체적인 흐름 프렌즈들이 설 수 있는 전체 경우의 수는 8!이다. 이 모든 경우에 대해서 모든 조건이 맞는지 각각 따져본다. 즉, DFS로 프렌즈를 쭉 배치한 뒤, 8명이 다 섰을 때 해당 배치가 조건과 맞는지 체크한다. 프렌즈를 모든 경우의 수로 배치하는 메소드 (arrange()) 배치를 파라미터로 받고, 해당 배치가 조건들과 맞는지 확인하는 메소드 (check()) final char[] FRIENDS = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'}; boolean[] isUsed = new boolean[FRIENDS.length]; int answer = 0; //매번 data를 파라미터로 넘기지 말고 전역변수로 String[] conditions; public in.. 2022. 3. 14.