Sad Puppy 3 '코딩테스트/자료 구조 및 알고리즘' 카테고리의 글 목록 (2 Page) :: 개발자 아지트

가중치가 있는 그래프에서는 일반적으로 시작 노드에서 끝 노드까지 이동할 때 거치는 간선의 가중치의 총 합이 최소가 되는 것을 말한다. 

 

최단 경로는 구하는 대표적인 알고리즘에는 다음과 같은 두가지 알고리즘이 있다. 

  • 다익스트라 알고리즘
  • 벨만-포드 알고리즘

 

다익스트라 알고리즘

 

가중치가 있는 그래프의 최단 경로를 구하는 문제는 대부분 다익스트라 알고리즘을 사용한다고 보면 될 정도로 중요한 알고리즘이다. 

 

[다익스트라 알고리즘의 동작 과정]

 

1. 시작 노드를 설정하고 시작 노드로부터 특정 노드 까지의 최소 비용을 저장할 공간과 직전 노드가 뭔지 저장할 공간을 마련한다. 

        1-1. 최소 비용을 저장할 공간은 모두 매우 큰 값으로 초기화 한다.

               (여기서는 무한대(infinite)를 의미하는 약자 INF로 표현할 예정이다. )

        1-2. 시작 노드의 최소 비용은 0이고, 직전 노드는 자기 자신으로 한다. 

2. 해당 노드를 통해 방문할 수 있는 노드 중(아직 방문하지 않은 노드 중), 현재까지 구한 최소 비용이 가장 적은 노드를 선택한다. 

        2-1. 해당 노드를 거쳐서 각 노드까지 가는 최소 비용과 현재까지 구한 최소 비용을 비교하여 작은 값을 각 노드의 최소 비용으로 갱신한다.  

        2-2. 이때 직전 노드로 어떤 노드였는지도 같이 갱신한다. 

3. 노드 개수에서 1을 뺀 만큼 반복한다. 

 

 

 

* 정리된 개념 출처: 코딩 테스트 합격자 되기 - 박경록(파이썬 편)


[관련 의문]

 

Q. 힙큐를써서 현재 구한 최단거리중에 젤 짧은걸 먼저 방문한다 하더라도 결국 모든 노드를 다 방문하는데 힙큐를 왜 쓰는것인가?

A. 힙큐를 쓰는 이유는 효율적으로 최단 경로를 찾기 위해서이다. 필요한 노드만 우선 방문한다. 다익스트라 알고리즘은 가장 짧은 거리의 노드를 우선적으로 방문하고 그 노드의 인접 노드들만 탐색한다. 이렇게 함으로써 필요하지 않은 노드를 최대한 적게 방문할 수 있게 된다.

 

Q. 그럼 예를들어서 힙큐를 사용하지 않으면 결국 모든 노드를 비효율적으로 돌게돼서, 결국 돌아봤자 최단거리가 아닌 경우에는 거리 갱신을 할 필요도 없기 때문에 비효율적으로 돌게 된다는건지?

A. YES

 

힙큐를 사용하지 않는다면, 매번 모든 노드를 확인해서 가장 짧은 거리를 가진 노드를 찾는 과정이 필요하다. O(N)의 시간이 걸리고, 이를 모든 노드에 대해 반복하므로 전체 복잡도가 커진다. 

 

반면, 힙큐를 사용하면 가장 짧은 거리의 노드를 O(log N) 시간에 찾아낼 수 있습다. 이 차이로 인해 노드 수가 많아질수록 힙큐를 사용한 다익스트라 알고리즘이 훨씬 빠르게 동작하게 된다.

 

거리가 확정되지 않은 노드들을 계속 방문하게 됨

 

최단 거리의 노드를 먼저 방문하면 그 주변 노드들의 거리가 효율적으로 갱신되지만, 힙큐 없이 임의의 노드를 방문한다면 거리가 확정되지 않은 상태로 노드를 계속 방문하는 일이 발생한다. 이렇게 되면 사실상 거리 갱신이 필요 없는 노드들도 방문하게 되고, 결국 불필요한 계산과 방문이 계속 일어난다.

 

 

 

컴퓨터가 초당 연산할 수 있는 최대 횟수는 1억번임을 기억하기

 

시간 복잡도 N의 가용 범위
O(N!) 10
O(2^N) 20~25
O(N^3) 200~300
O(N^2) 3,000~5,000
O(NlogN) 100만
O(N) 1,000~2,000만
O(logN) 10억

 

(백준한정-파이썬) 추가시간 없음 이라는 말이란?

=> 파이썬은 기존대로 1초에 2천만번 연산 가능함
(원래는 이런말 없으면 원만하게 정답 처리를 해주기 위해서 1초에 1억번까지 연상 가능하도록 해줌. )

 

 

3장 시간복잡도

시간복잡도는 구현한 알고리즘의 성능을 나타내는 일종의 지표이다. 

입력크기에 대한 연산 횟수의 상한을 의미한다. 

시간복잡도는 낮을 수록 좋다. 

 

  • 입력 크기에 따른 연산 횟수의 추이를 활용해 시간 복잡도를 표현하는 방법을 점근적 표기법이라 한다. 
  • 시간 복잡도를 빅오 표기법으로 나타내려면 데이터 개수 N에 대해 연산 횟수를 일반화한 후 최고차항을 남기고 나머지 차수는 신경쓰지 않는다. 

 

1주차의 공부 주제는 다음과 같다. 

 

  • 코딩 테스트를 준비하기 전에 알아야할 팁
  • 코딩 테스트를 효율적으로 준비하기 위해서 어떻게 해야하는가
  • 코딩 테스트 준비를 위해 프로그래머스를 적극 활용하기

 

코딩 테스트를 준비하기 전에 알아야할 팁

1) 코딩테스트 준비를 위한 사이트 선정 

 

코딩테스트의 문제들을 풀기위한 사이트를 선정해야한다. 

선정 기준은 다음과 같은 기준을 고려하면 좋다. 

  • 타인의 풀이를 볼 수 있는가?
  • 내가 생각한 테스트 케이스를 추가할 수 있는가? 

테스트에 필요한 코드를 작성하기 전에 문제 분석 단계에서 테스트 케이스를 고려할 때, 충분히 생각하여 테스트 케이스를 추가하여 공부하는 것이 좋다. 

 

 

2) 문제 풀다 막힐 경우에 취해야할 태도

 

코딩테스트 준비를 위해 문제를 풀 때, 문제를 다 풀지 못했을 경우가 생길 수 있다. 

이런 경우 상실감에 그냥 다른 문제 풀이로 넘어가거나, 그날 공부를 접지 말고 이것을 생각해봐야한다. 

 

내가 이 문제를 풀기위해서 어디까지 생각을 했는가?

 

이것을 생각하고 어떤 알고리즘을 적용하려고 했는지, 그렇게 생각한 근거는 무엇인지, 어떻게 구현하려고 했는지를 자신만의 공간에 기록해두는 것이 좋다 .

 


3) 나무보단 숲을 보자 = 코딩 테스트 준비를 위해 한정된 시간안에 효율적으로 준비를 마치자 

 

효율적으로 코딩테스트를 준비하기 위해서 문제 풀 때, 문제가 잘 안풀려서 1시간 이상 넘어가는 경우가 있다.

이럴 경우, 시험 보듯 공부하는 것이 좋다. 아무리 잘 안풀리는 문제라도 1시간 이상 고민하게 되면 코딩 테스트라는 시험 준비 자체에 효율이 떨어진다. 1시간이 넘어가면 다른 사람의 코드를 참고하든 하는 것이 좋다. 

 

4) 코딩 테스트 준비에 있어서 요행을 바라는것은 도둑놈 심보

 

짧은 시간 공부해서는 절대로 코딩 테스트에 통과할 수 없다. 

통상적으로 코딩 테스트는 최소 한 달에서 두 달 정도를 매우 집중해서 공부해야한다. 

 

5) 개념이나 원리 공부후 자신만의 언어로 개념 정리 하면 도움이 된다. 

 

코딩 테스트를 효율적으로 준비하기 위해서 어떻게 해야하는가

1)자신이 가장 잘 할 수 있는 프로그래밍 언어를 선택하자. 

2)문제 분석하는 방법을 연습하라 

3)의사 코드로 설계하는 연습을 몸에 익히자

4)문제를 푸는 사이트의 환경이 실제 시험 장소에서 제공하는 환경과 비슷한 프로그래머스 사이트 사용을 추천한다. 

코딩테스트는 Python언어로 준비할 예정이다. 

나는 벼락치기를 막고, 꾸준함을 효과적으로 지속하기 위하여, 스터디에 참가했다. 

이 게시판에서는 장 별로 공부한 내용을  정리한 게시글을 업로드할 예정이다. 


1주차
01. 코딩 테스트 효율적으로 준비하기 

02. 프로그래머스 완벽 활용 가이드

 

2주차

03. 알고리즘의 효율 분석

04. 코딩 테스트 필수 문법

05. 배열

 

3주차 

06. 스택

07. 큐

 

4주차 

08. 해시

09. 트리

 

5주차

10. 집합

11. 그래프

 

6주차

12. 백트래킹

13. 정렬

 

7주차

14. 시뮬레이션 

15. 동적 계획법

 

8주차

16. 그리디

 

+ Recent posts