프로그래머스 알고리즘 - 네트워크 ☞ 네트워크 문제 링크 그래프 탐색을 코드로 구현 할 줄 알아야 풀 수 있는 문제였습니다. ☞ 그래프(Graph) DFS 탐색 구현하기 문제풀이코드의 전체적인 틀은 그래프 탐색을 응용합니다.네트워크망은 그래프로 치환하고, 각각의 컴퓨터를 노드로 치환합니다.class Network { class Computer { . . . } . . . } 탐색한 컴퓨터가 어떤 컴퓨터에도 연결되어 있지 않다면 네트워크의 숫자를 하나 증가시킵니다. class Network{ . . . void isNewNetwork(Computer computer) { if(!computer.connected) network++; } } 모든 컴퓨터를 탐색하기 위해서, 탐색은 모든 컴퓨터를 기점으로 시작..
그래프와 BFS DFS의 개념, 그래프 구현방법은 이전 포스팅을 참고 ☞그래프(Graph)와 BFS, DFS☞그래프(Graph) 인접 리스트(adjacency list)로 구현하기그래프 생성하기 먼저 그래프를 생성하고 아래 그림과 같은 관계를 갖는 노드들을 만들겠습니다. (그래프와 구현은 이전 포스팅에 있습니다 ☞그래프(Graph) 인접 리스트(adjacency list)로 구현하기.) public class DFSBFS { public static void main(String[] args) { Graph graph = new Graph(5); graph.setNode(); graph.addEdge(0, 1); graph.addEdge(0, 4); graph.addEdge(1, 0); graph.add..
그래프와 DFS BFS에 대한 설명은 이전 포스팅을 참고 ☞ 그래프(Graph)와 BFS, DFS 그래프(Graph) 구현하기 그래프를 구현하는 방법은 크게 2가지가 있습니다. 인접 행렬(adjacency matrix)로 구현하는 방법과 인접 리스트(adjacency list)로 구현하는 방법이 있습니다. (간선(edge)이 많은 경우 인접 행렬(adjecency matrix)로 구현하는 것이 좋고, 아닌 경우 인접리스트로 구현하는 것이 유리하다 라고 알고 있습니다만 간선이 '많다'의 기준을 저는 잘 모르겠습니다. 공부해야 할 영역입니다.) 이 포스팅에서는 인접 리스트로 구현해 보도록 하겠습니다. 인접 리스트(adjacency list)로 그래프 구현하기 노드(정점)들의 연결 관계를 어떤 식으로 저장해 ..
그래프(Graph) 그래프란 여러 객체들과 그 객체들 간의 연결된 관계를 표현하는 방법 입니다. 친숙한 예제로 지하철 노선도를 생각해보시면 됩니다. 여러 지하철역들과 그 역들 간의 연결된 관계를 표시 해줍니다. 그래프에서 각 객체ㅁ들을 정점(vertex) 혹은 노드(node)라고 많이 부르고, 이들을 연결하는 선들을 간선(edge-엣지) 라고 부릅니다.이미지 출처 : https://www.geeksforgeeks.org/graph-data-structure-and-algorithms/ BFS(Breadth First Search)그래프의 모든 노드들을 한번 씩 탐색하기 위한 방법 중에 하나입니다. 말그대로 너비(Breadth)를 우선(First)으로 탐색(Search)하는 방법입니다. 시작점이 되는 노드..
The PanlindromeThe Panlindrome (회문) - 문제 링크 (탑코더 로그인 필요함) 한줄요약) 주어진 문자열 뒤에 (0개 이상의) 문자를 추가하여, 가장 짧게 회문이 되는 경우의 문자열 길이를 구하시오. (회문은 앞부터 읽으나 뒤부터 읽으나 같은 문자열을 말합니다. 예를들면 리효리) ex1) 주어진 문자열이 abb이면 가장 짧게 회문이 되는 경우는 abba이고 문자열 길이 4가 정답 ex2) 주어진 문자열이 abcba이면 이미 회문이 되므로 문자열 길이는 5가 정답 문제 풀이먼저 주어진 문자열이 회문인지 확인합니다. 주어진 문자열이 a b c 인 경우 0번째와 n번째 문자가 같은지 확인합니다. a b c 문자가 같은 경우 1번째, 2번째 . . . 의 경우를 계속 확인해보고, 아닌 경..
프로그래머스 알고리즘 - 타겟넘버☞ 타겟 넘버 문제 링크 멱집합(모든 부분집합)을 구하는 방법을 응용하면 해당 문제를 풀기 수월 합니다. ☞ 멱집합(부분집합) 알고리즘 문제 풀이첫번째 주어진 숫자로 덧셈(+)을 계산하거나, 혹은 뺄셈(-)을 진행합니다.→ 두번째 주어진 숫자로 덧셈(+)을 계산하거나, 혹은 뺄셈(-)을 진행합니다.→ . . . → N번째 주어진 숫자로 덧셈(+)을 계산하거나, 혹은 뺄셈(-)을 진행합니다.N번째까지 계산한 결과가 타겟 넘버와 같다면 answer을 하나 증가 시킵니다. public class Solution { private static int answer = 0; public static void main(String[] args) { int[] numbers = {1, ..
멱집합 알고리즘 멱집합은 한 집합의 모든 부분집합을 뜻합니다. 원소 a,b,c를 갖고 있는 집합의 모든 부분 집합은 (a, b, c, ab, ac, bc, abc + 공집합)으로 총 8가지 입니다. 탐색 (재귀, 브루트포스) 알고리즘 문제를 풀때 멱집합을 구하는 방법을 종종 사용하게 됩니다. 모든 부분집합의 경우의 수를 구하는 과정은 다음과 같습니다. 첫번째 원소가 포함이 되는가? 혹은 안되는가?→ 두번째 원소가 포함이 되는가? 혹은 안되는가? → . . . → N번째 원소가 포함이 되는가? 혹은 안되는가? 그래서 원소의 갯수가 N인 집합의 모든 부분집합의 갯수는 2^N개가 됩니다. 아래는 주어진 집합의 모든 부분집합을 출력하는 (java)코드입니다. 핵심부분은 위에서 설명한대로 n번째의 원소가 포함이 ..
재귀란 어떤 사건이 자기 자신을 사용하여 정의 될 때 재귀적(recursive)라고 합니다. 대표적인 예로 팩토리얼이 있습니다. (팩토리얼의 10!는 10x9!로 설명할 수 있다.) 재귀는 스택이다. 재귀 알고리즘이 어렵다고 느껴지는 이유 중 하나는 사람의 머리로 컴퓨터가 실행하는 재귀적 행동을 따라 갈 수 없기 때문입니다. 재귀 알고리즘을 보다 쉽게 상상하려면, 같은 함수가 호출 되는 것이 아니라, 복사된 함수가 호출 된다고 생각합니다.함수의 호출을 상상 할때는 스택(stack)으로 합니다. 함수 호출의 원리는 결국 스택으로 진행됩니다. 함수가 호출되면 기존 함수 스택 위에 호출된 함수가 쌓이게 되고, 더 이상 쌓을 함수(스택)이 없게 되면 위에서부터 차례대로 실행하게 됩니다. 재귀 알고리즘 문제 풀이..