알고리즘/자료구조와 알고리즘 17

[JAVA] 배열과 관련된 메소드 살펴보기

자바 배열 출력하기 💫 for문을 돌리지 않고 배열 고대로 출력하기 자바는 print(배열변수) 를 하면 배열 자체의 주소를 출력한다. 이 때 사용하는 메소드가 Arrays.toString(object[] o) 가 된다. public class Array { public static void main(String[] args){ int arr1[] = {1,2,3}; String arr2[] = {"J", "A", "V", "A"}; System.out.println(arr1); System.out.println(arr2); System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); } } 를 실행하면 이 출력..

[Python] 배열, 2차원 배열 만들기, 2차원 배열 입력받기

1. 2차원 배열 만들기 5x5 배열 arr1 = [[0 for j in range(5)] for i in range(5)] arr2 = [[0] * 5] * 5 arr3 = [[0] * 5 for i in range(5)] 2. 2차원 배열 입력받기 n x m 배열 1) # n x m 배열 mylist=[0 for _ in range(n)] for i in range(n): mylist[i]=list(map(int, input().split())) 2) mylist=[] for i in range(n): mylist.append(list(map(int, input().split()))) 3) for _ in range() 를 사용하면 인덱스를 넣지 않고 선언할 수 있다. mylist=[list(map(..

[Python] 내 마음대로 정리하는 파이썬

출력하기 1. 여러줄로 걸쳐서 출력하기 word = """ 안녕하세요 블 로 그 주 인 """ print(word) 안녕하세요 블 로 그 주 인 2. print('1') print('2') 하면 1 2 이렇게 출력되는데 1 2 이렇게 붙여서 출력하기 print('1', end = ' ') print('2') print('3') 1 2 3 print('1','2','3', sep='@') 1@2@3 3. 이스케이프 문자열 사용하기 '김철수' 입니다. 라고 출력하려면? --> \' \' 사용하기 #1 hi = "'김철수' 입니다." print(hi) #2 print("\'김철수\' 입니다.") '김철수' 입니다. '김철수' 입니다. 4. 변수 출력하기 3가지 year = 2022 month = 3 day =..

<문제> 효율적인 화폐 구성 (Dynamic Programming)

문제 3. 효율적인 화폐 구성 문제 풀이 방식 다음과 같이 점화식을 만들 수 있다. 화폐는 10,000 이하인 값이므로 각 인덱스는 10,001 값으로 초기화 해준다. 화폐의 단위가 2일 때를 살펴보면 인덱스 2의 값은 2 하나로, 4는 2 두 개로, 6은 2 세 개로 만들 수 있다. 화폐의 단위가 3일 때를 살펴보면 인덱스 3의 값은 3 하나로, 6은 3 두 개로 표현할 수 있다. 여기서 인덱스 5와 7도 만들 수 있다. 인덱스 5에서 3칸 앞을 살펴보면 2가 있으므로 2의 값에 3을 더하면 5라서 인덱스 2의 값인 1 + 1을 해줘 2가 됨 인덱스 7도 3칸 앞을 살펴보면 인덱스 2를 두 개 활용한 4가 있음. 인덱스 4 값인 2 + 1 해줘서 3이 됨 화폐의 단위가 5일 때를 살펴보면 인덱스 5는 ..

<문제> 1로 만들기 (Dynamic Programming)

문제 2. 1로 만들기 문제만 봤을 때 그리디를 활용해서 풀려고 했다. 그런데 그리디로 풀면 안된다. 왜냐하면 예시를 살펴보면 입력이 26일 때 그리디를 사용하면 우선 순위가 5로 나누기, 3으로 나누기, 2로 나누기, -1 빼기 순서가 될 것이기 때문에 26 -> 13 -> 12 -> 4 -> 2 -> 1 순서로 될 것이기 때문에 최소 연산인 26 -> 25 -> 5 -> 1 이 수행될 수 없다. 그래서 DP를 활용할 방법을 살펴볼 것이다. 함수가 호출되는 과정을 살펴보면 입력으로 6이 들어왔을 때 -1을 한 값인 f(5), ÷3을 한 값인 f(3), ÷2를 한 값인 f(2) 로 나누어 지며 그 밑으로 f(1)이 나올 때까지 뻗어갈 수 있다. 이렇게 작은 문제들을 조합해서 해결될 수 있기 때문에 DP를..

<문제> 개미 전사 (Dynamic Programming)

문제 1. 개미 전사 DP를 활용하여 문제를 풀 수 있다. 문제를 해결하기 위해 i번째 식량창고까지의 최적의 해를 살펴보자 창고 0에서 최적의 해는 1이다. 창고 1에서 최적의 해는 1과 3을 비교했을 때 큰 값인 3이다. 창고 2에서 최적의 해는 1+1인 2와 3을 비교했을 때 큰 값인 3이다. 창고 4에서 최적의 해는 1+1인 2와 3+5인 8을 비교했을 때 큰 값인 8이다. 이런식으로 차례로 DP에 넣어 확인할 수 있다. 왼쪽부터 차례대로 식량창고를 털 때 i 번째를 털지 안털지의 여부는 2가지가 있다. 바로 앞의 창고가 털렸다면 i번째 창고는 털 수 없으며 털리지 않았다면 i번째 창고를 털 수 있다. 두 가지 중에 더 많은 식량을 털 수 있는 경우를 선택하면 된다. 글고 i - 1번째와 i - 2..

[Algorithm] DP(Dynamic Programming) 다이나믹 프로그래밍 알고리즘

다이나믹 프로그래밍(Dynamic Programming) 알고리즘 다이나믹 프로그래밍은 동적 계획법이라고도 불리며, 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법이다. 자료구조에서 동적(Dynamic)이란 '프로그램이 실행되는 도중에 실행에 필요한 메모리를 할당하는 기법'을 의미한다. DP는 이미 계산된 결과는 별도의 메모리 영역에 저장하고 다시 계산하지 않게 하는 방법이며, 탑다운(하향식)과 보텀업(상향식)이라는 두 가지 방식이 있다. 1. 탑다운(하향식) 방법 메모이제이션(Memoization)은 한 번 계산한 결과를 메모리 공간에 메모하는 기법이다. 같은 문제를 다시 호출하면 메모했던 결과를 그대로 가져오며, 값을 기록해 놓는다는 점에서 캐싱(Caching)이라고도 한다. ..

[Algorithm] 순열(permutation) for JAVA

순열 순열이란 n개의 원소 중에 r개를 순서를 고려해 뽑는 방법이다. 예를 들어 [1,2,3] 이 있을 때 2개를 뽑는다면 n = 3, r = 2가 될 것이고 표현은 3P2 라고 한다. [1, 2] [1, 3] [2 ,1] [2, 3] [3, 1] [3, 2] 6개가 나올 것이고 원소의 개수는 n! 개이다. 나는 DFS로 이것을 표현할 것이다~ DFS로 순열을 표현하면 위의 순서를 따르며 진행될 것이다. 코드 static void permutation(int[] arr, int[] output, boolean[] visited, int depth, int n, int r) // arr[] = {1,2,3} // output[] = 만들어진 원소 ex) {2,1,3} 등 // visited[] = 위 그림..

[Algorithm] BFS 알고리즘 (너비 우선 탐색)

BFS 알고리즘은 너비 우선 탐색 방법으로, 가까운 노드부터 우선적으로 탐색하는 알고리즘이다. 주로 Queue 자료구조를 이용하여 모든 노드를 탐색한다. 예시를 살펴보자 예시 그래프~~!! 방문 기준은 번호가 낮은 인접 노드부터, 시작 노드는 1이라고 하자. 큐에 1 넣음 큐에 있던 1을 꺼내주고 인접 노드 2 3 8 을 넣어준다. 2 3 8 에서 2를 꺼내주고 2와 인접한 노드 7을 넣어준다. 큐 : 3 8 7 3 8 7 에서 3을 빼주고 3과 인접한 노드 4, 5를 넣어준다. 큐 : 8 7 4 5 8 7 4 5에서 8을 빼주고 8과 인접한 노드는 모두 방문했으므로 추가x 큐 : 7 4 5 7 4 5에서 7을 빼고 인접 노드 6을 들르면 모든 노드를 탐색하게 된다. 따라서 노드를 탐색하는 순서는 1 -..

[Algorithm] DFS 알고리즘 (깊이 우선 탐색)

DFS(Depth-First Search) 알고리즘은 깊이 우선 탐색 방법으로, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다. DFS는 스택 자료구조 혹은 재귀 함수를 주로 이용하며 모든 노드를 탐색한다. 예시를 살펴보자 위와 같은 그래프가 있다. 시작 노드는 1이며, 방문 기준은 번호가 낮은 인접 노드라고 가정하자. 시작 노드 1에서 인접한 노드는 '2', '3', '8' 이다. 우리는 방문 조건에 따라 번호가 작은 2번 노드에 방문할 것이다. 이 때 스택에 1 - 2 를 차례로 담아준다. 노드 2에서 방문하지 않은 인접 노드 '7'에 방문해준다. 이 때 스택은 1 - 2 - 7 이 된다. 노드 7의 인접 노드 '6', '8' 중 작은 번호인 노드 6에 방문한다. 이 때 스택은 1 - 2 -..