본문 바로가기

Java/알고리즘

(47)
[자바 알고리즘 인터뷰] 12장 그래프 (1) 섬의 개수 https://leetcode.com/problems/number-of-islands/description/  - 1을 육지로, 0을 물로 가정한 2차원 그리드 맵이 주어졌을 때, 섬의 개수를 계산하라(연결되어 있는 1의 덩어리 개수를 구하라)  풀이 1) DFS로 그래프 탐색  - 입력값이 정확히 그래프는 아니지만 사실상 동서남북이 모두 연결된 그래프로 가정하고 동일한 형태로 처리할 수 있으며, DFS 재귀를 이용해 네 방향 각각의 탐색을 끝마치면 1이 증가하는 형태로 육지의 개수를 파악할 수 있다.  - 먼저 여기서는 행렬 입력값인 grid의 행, 열 단위로 육지(1)인 곳을 찾아 진행하다가 육지를 발견하면 그때부터 dfs()를 호출해 탐색을 시작한다.  //행렬을 모두 탐색 for(int i=0; ..
[자바 알고리즘 인터뷰] 12장 그래프 그래프 - 객체의 일부 쌍(Pair)들이 '연관되어' 있는 객체 집합 구조  오일러 경로 - 모든 간선을 한 번씩 방문하는 유한 그래프  해밀턴 경로 - 각 정점을 한 번씩 방문하는 무향 또는 유향 그래프 경로 - 최적 알고리즘이 없는 N-P 완전 문제 해밀턴 순환- 해밀턴 경로 중에서 원래의 출발점으로 돌아오는 경로  외판원 문제(Travelling Salesman Problem)- 한 번만 방문하여 출발지로 돌아오는 경로 중 가장 짧은 경로    그래프 순회(Graph Traversal)- 그래프의 각 정점을 방문하는 과정 - 그래프를 인접 리스트로 표현한 예- 인접 리스트는 출발 노드를 키로, 도착 노드를 값으로 표현 Map> graph = new HashMap();graph.put(1,Arrays..
[자바 알고리즘 인터뷰] ch 11 해시 테이블 (5) 완주하지 못한 선수 https://school.programmers.co.kr/learn/courses/30/lessons/42576 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr      풀이 1) 해시 테이블을 이용한 풀이  - 참여한 선수 배열에서 완주한 선수 배열을 제외하면 1명이 남으며, 이 값을 찾아내는 문제다. - 동명이인이 등장할 수 있으므로, 이름을 키로 인원을 값으로 한 해시 테이블로 처리하여 동명이인인 경우에는 해당 키의 값을 +1 해준다.  - 그런 다음 완주한 선수의 이름을 추출해 해시맵에서 하나씩 삭제하면 된다. 값을 -1 하다가 만약 1인 경우 해시맵..
[자바 알고리즘 인터뷰] ch 11. 해시 테이블 (4) 상위 k빈도 엘리먼트 https://leetcode.com/problems/top-k-frequent-elements/description/ - 빈도순으로 k개의 엘리먼트를 추출하라   풀이 1) 빈도수를 저장하고 빈도순으로 엘리먼트 추출  - 각 엘리먼트의 빈도를 추출하고 이를 빈도순으로 저장하거나 정렬한 다음, k번만큼 추출하면 문제를 풀이할 수 있다 . - 각 엘리먼트의 빈도 추출- 입력값 nums를 반복하며 빈도수를 저장할 해시맵 frequencyMap을 선언하고 여기에 빈도를 저장한다. - 처음 빈도를 계산한다면 0으로, 기존에 값이 있다면 그 값을 가져오고 모두 +1을 한다.  //각 엘리먼트의 빈도수를 저장할 해시맵 선언, 엘리먼트=> 빈도수Map frequencyMap = new HashMap();//각 엘리먼..
[자바 알고리즘 인터뷰] ch 11. 해시 테이블 (3) 중복 문자 없는 가장 긴 부분 문자열 https://leetcode.com/problems/longest-substring-without-repeating-characters/description/  - 중복 문자가 없는 가장 긴 부분 문자열(Substirng)의 길이를 리턴하라   풀이 1) 슬라이딩 윈도우와 투 포인터로 크기 조절  - 슬라이딩 윈도우로 한 칸씩 우측으로 이동하면서 윈도우 내에 모든 문자가 중복이 없도록 투 포인터로 윈도우 크기를 조절하면서 풀이해보면 다음과 같다.  - 슬라이딩 윈도우의 각 단계별로 중복 문자가 없는 윈도우의 최대 길이를 순서대로 표시했다.    - 먼저 투 포인터로 문제를 풀이하되, 포인터 2개 모두 왼쪽에서 출발한다. - 각각 왼쪽 시작점에서 출발해 두 번째 포인터(right변수)는 다음과 같이 현재..
[자바 알고리즘 인터뷰] ch 11. 해시 테이블 (2) 보석과 돌 https://leetcode.com/problems/jewels-and-stones/description/  - J는 보석이며, S는 갖고 있는 돌이다. S에는 보석이 몇개나 있을까? 대소문자는 구분한다.   풀이 1) 해시 테이블을 이용한 풀이  - 갖고 있는 돌 stones의 엘리먼트 각각의 개수를 모두 헤아린 다음, jewels의 각 엘리먼트를 키로 하는 각각의 개수를 합산- 먼저 freqs라는 해시 맵을 선언Map freqs = new HashMap(); - 돌의 모음인 stones를 문자 단위로 하나씩 분리해 반복한다. 만약 처음 등장한 문자라면 1을 선언하고, 기존에 있던 문자라면 1을 더한다. //돌(S)의 빈도수 계산for(char s : stones.toCharArray()){ /..
[자바 알고리즘 인터뷰] 11장 해시 테이블 (1) 해시맵 디자인 https://leetcode.com/problems/design-hashmap/description/ - 다음과 같은 기능을 제공하는 해시맵을 디자인하라. put(key, value) : 키, 값을 해시맵에 삽입한다. 만약 이미 존재하는 키라면 업데이트한다. get(key)  : 키에 해당하는 값을 조회한다. 만약 키가 존재하지 않는다면 -1을 업데이트한다. remove(key) : 키에 해당하는 키, 값을 해시맵에서 삭제한다.   풀이 1) 개별 체이닝 방식을 이용한 해시 테이블 구현    - 키, 값을 보관하고 연결 리스트로 처리할 별도의 객체를 구현 //노드 클래스 static class Node { int key,val; Node next; Node(int key, int val..
[자바 알고리즘 인터뷰] ch 10. 데크, 우선순위 큐 (4) - 더 맵게 https://school.programmers.co.kr/learn/courses/30/lessons/42626 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr     풀이 1) 우선순위 큐  - '가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수*2)'로 나온 새로운 음식을 다시 추가하고 반복하면서, 스코빌 지수가 K 이상일 때 반복 횟수를 출력하는 것이다.  - 가장 맵지 않은 음식을 계속해서 추출해야 한다는 점에서 우선순위큐를 활용 import java.util.*;class Solution { public int ..