개발/알고리즘 & 자료구조 10

[C++] 문자열 뒤집기(Reverse String) 알고리즘

이 문제는 규모가 큰 IT회사에서 단골 문제로 나온다. 간단히 풀 수 있는 문제여서 면접 중에 화이트보드로 풀라고 하는 경우가 많다. 이 문제의 핵심은 결과만 나오는 것이 아니라 복잡도를 최소한으로 해서 결과가 나오게 하는 것이다. 1. 문제 char arr[6] = { 'S', 'T', 'R', 'I', 'N', 'G' }; char result[6] = {0,}; 주어진 arr 문자 배열의 내용을 역순으로 result 배열에 담아야 한다. 결과 배열 char result[6]에는 'G', 'N', 'I', 'R', 'T', 'S' 순으로 들어있도록 만들면 된다. 2. 어떻게 풀까? (알고리즘) 직관적인 방법으로는 result 배열의 끝 인덱스부터 하나씩 역순으로 접근해서 result 배열에 차례대로 ..

[C++] 소수 구하기 최적의 알고리즘 (2) - 에라토스테네스의 체

소수 구하기 최적의 알고리즘 1편에서 (http://marobiana.tistory.com/89) 주어진 수보다 작은 수의 소수들로 나누는게 성능이 좋다고 했었는데, 그것보다 더 좋은 알고리즘을 찾아냈다.ㅋㅋ 이것보다 더 좋은 방법은 아마도 없을 것이라 자신함 !! 만약 있다면 댓글 달아주시기 바람. 요번에는 c++로 구현해보았음. 1. 알고리즘 에라토스테네스의 체 (Sieve of Eratosthenes)라는 알고리즘이다. 아래 그림을 보면 무엇인지 알 수 있다. 120까지의 모든 소수를 구한다고 해보자. 2부터 120까지 배열에 모두 넣은 후 소수가 아닌 것들을 모두 체크해버리는 것이다. 2를 제외한 모든 2의 배수를 체크한다. 3을 제외한 모든 3의 배수를 체크한다. 4는 아까 체크당했으므로 소수 ..

[C++] 두 정수 사이의 모든 합 구하기

어제 올린 글에는 최적화를 생활화하자는 글을 썼었는데, 오늘은 반대로 최적화를 잘못하면 화를 부를 수 있다는 것을 정리해보고자 한다ㅋㅋㅋㅋ 1. 문제 두 정수 사이의 모든 합을 구하는 것이다. 3, 5를 입력받으면 3 + 4 + 5 를 한 결과를 출력하면 됨. 작은 수부터 입력 받는다고 가정하자. 2. 알고리즘 가장 먼저 생각할 수 있는 알고리즘은 입력 받은 수부터 두번째 입력 받은 수 까지 반복문 돌리면서 더하는 것이다. 반복문을 좀 줄여본다면??? 1 + 2 + 3 + 4 + 5 + 6 를 보면 규칙을 찾을 수 있다. 1 + 6 = 7 2 + 5 = 7 3 + 4 = 7 이것을 이용하면, 포문을 반으로 줄일 수 있다! 여기서 잠깐, 더할 수의 개수가 홀수이면 이렇게 된다. 1 + 2 + 3 + 4 +..

[JAVA] 소수 구하기 최적의 알고리즘 (1)

한달 전에 면접에서 소수를 손코딩하라는 명을 받았다. (인성면접이라는 훼이크에 당해버렸음 @_@) 소수에 대해서는 깊이 생각해본적이 없었는데..이번일을 계기로 더더욱 최적의 방법을 생각하는 버릇을 들이겠다는 다짐을 하게되었다. 1. 소수(Prime Number)란 무엇인가? 2, 3, 5, 7, 11, 13, 17.... 약수가 1과 자기 자신 뿐인 수이다. 2. 소수를 어떻게 구할까? (알고리즘) 약수가 1과 자신뿐인 것을 확인해야한다. 그러려면??? 즉, 자기 자신보다 작은 수들을 나누어봐서, 하나라도 나누어지면 소수가 아닌 것이다.(어떤 수의 배수이면 안된다는 것) 보통은 여기까지만 생각하고 코딩을 시작할 것이다.그런데 조금만 더 생각해보면 더 좋은 방법이 있다. 일단은 이대로 코딩을 시작해봄 ㄱㄱ..

[JAVA] Insertion Sort (삽입정렬)

1. Insertion Sort 개념 아래와 같은 순서로 카드가 놓여져 있다고 생각해보자. 4 5 3 2 (1)4 5 3 2 2번째부터 기준이 되어 시작한다. (왼쪽과 비교해야 하므로 2번째부터 시작한다)기준인 5와 그 왼쪽인 4를 비교하니 5가 더 크므로 냅둔다. 4 5 3 2 이 알고리즘은 특성상, 기준의 왼쪽 값들은 모두 정렬이 되어있다. (2)4 5 3 2 그 다음 기준은 3번째가 되었다.바로 왼쪽 값과 비교한다. 3이 5보다 작기에, 큰 값인 5를 기준 자리에 밀어 넣는다.(여기서 회색부분은 비어있는 자리라고 생각하면 됨) 4 5 2 3 이번엔 기준과, 그 왼쪽인 4와 비교한다. 기준값이 4보다 작으므로, 위에서처럼 4를 오른쪽으로 밀어 넣는다. 4 5 2 이제 비교대상이 없어졌으므로 비어있는 ..

[JAVA] 재귀 - 이진트리(Binary Tree)의 순회

앞에 글에서 이진탐색트리의 삽입을 구현했었다. 이진탐색트리 삽입 (1) - http://marobiana.tistory.com/81이진탐색트리 삽입 (2) - http://marobiana.tistory.com/82 이번에는 순회에 대해 짜볼 것이다.사실 이걸 정리하고 싶었을 뿐인데, 이진탐색트리 삽입이 더 복잡해서 거기서 시간 다보냄 ㅎㅎ 요번건 소스가 아주 간단함. 1. 이진트리 순회 방법컴공 2학년 때 자료구조에서 배우는 요것.. 순회 방법에는 3가지가 있다.각 순회방법으로 갔을 때 순서를 적어보겠다. - Pre order (전위) : Root부터 왼쪽 모든 노드 탐색 후 오른쪽 24 15 2 19 28 27 30 - In order (중위) : 맨 왼쪽 아래노드부터 Root, 오른쪽 2 15 19..

[JAVA] 재귀 - 이진 탐색 트리(Binary Search Tree)의 삽입 - (2)

앞에 글에 이어서.. 앞 글 - http://marobiana.tistory.com/81 문제 : 트리에 넣을 숫자들을 입력 받아 이진탐색트리를 만들어라. 3. 예제 C++로 하면 포인터 써서 눈에 보기 더 좋을 것을ㅠㅠ Java로 포인터처럼 짜봤음 ㅋㅋ아래와 같이 3개의 클래스로 구성할 수 있음. 트리 삽입참고로, Tree에 넣는 숫자 순서가 트리모양을 결정한다public class BinarySearchTree { public static void main(String[] args) {Tree tree = new Tree();tree.addNode(24);tree.addNode(15);tree.addNode(19);tree.addNode(2);tree.addNode(28);tree.addNode(27..

[JAVA] 재귀 - 이진 탐색 트리(Binary Search Tree)의 삽입 - (1)

1. 이진트리, 이진탐색트리란? 각 노드의 자식노드 수가 최대 2개까지만 존재하는 트리이다.글로만 쓰면 이해가 안가므로, 그림 투척!위의 트리는 맨 밑 노드(리프노드 - Leaf Node)를 제외한 모든 각 노드가 자식노드를 2개씩 갖고있는데, 이런 트리를 완전트리 라고 한다. 완전트리가 아니더라도 자식노드가 2개 이하이면 이진트리이다. 아래 트리처럼!!요런 모양을 편향트리? 왼쪽 경사 트리? 변질 트리? 등으로 부른다.어쨌든, 이진트리에 대한 정의는 이정도이다. 그렇다면, 이진탐색트리(Binary Search Tree)는 무엇인가? 저 위의 그림들이 바로 이진탐색트리이다. 위에 있는 트리를 보면 숫자가 들어있다.루트노드의 왼쪽 아래에는 루트보다 작은 숫자가, 루트노드의 오른쪽 아래에는 루트보다 큰 숫자..

[JAVA] 재귀 기초 - 피보나치 (Fibonacci)

재귀에 대한 이해도가 전혀 없다면 http://marobiana.tistory.com/79 fibo(2-2) + fibo(2-1) else문의 첫번째 메소드인 fibo(2-2)가 호출 된다. 3) fibo(2-2)n은 0이므로 if문에서 0리턴하고 종료 fibo(2-2) + fibo(2-1) => 0 + fibo(2-1) 4) 스택에 있던 fibo(2)로 다시 돌아가서, fibo(2-1)이 실행된다.n이 1이므로 1을 리턴하고 종료된다. 5) 스택에 있던 fibo(2)에서는 fibo(2-2) + fibo(2-1) => 0 + 1 else문에서 각각 리턴된 0과 1을 더한 1을 리턴하고 종료된다. 현재, 아래와 같이 출력된 상황임. 11 6) main 함수에서는 i는 3이 되어, fibo(3)이 호출된다...

[JAVA] 재귀 기초 - 팩토리얼 (Factorial)

오랜만에 재귀 문제를 풀다보니 헷갈려져서 정리한번 해보겠음.재귀 중에 가장 쉬운 팩토리얼부터.. 1. 재귀함수란? 함수 내에서 자기 자신을(함수)를 계속적으로 콜 하면서 풀어가는 방식이다.스택(Stack)이라고 생각할 수 있다.함수가 콜 되면서 최근에 자신을 부른 원래 함수가 스택에 차곡차곡 쌓이게 됨.중요한건 처음 불려진 함수에서(스택 맨 밑에있는 메소드) return 되는 값이 최종 return 값이 된다 2. 팩토리얼이란? 3! = 3*2*1 = 64! = 4*3*2*1 = 245! = 5*4*3*2*1 = 120 3. 재귀 예제 문제 : 특정 숫자의 팩토리얼 구하기 간단하게 소스 투척 public class Factorial {public static void main(String[] args) ..