분류 전체보기 484

[자료구조] 스택으로 큐, 큐로 스택 구현하기

스택과 큐의 원리를 이용하면 스택으로 큐를, 큐로 스택을 구현할 수 있다. 그 원리를 알아보고 코드로 구현해보자. 스택으로 큐 구현하기 큐는 선입선출의 구조로 데이터가 들어온 순서대로 나가게된다. 이를 스택 2개를 활용하여 구현할 수 있다. 아래의 그림을 보자. 스택 A와 B가 존재한다. 만약 큐에 PUSH하는 과정이 일어나면 스택 A에 PUSH를 한다. 이후 큐에 POP연산을 하게되면 스택 A의 모든 데이터를 스택 B로 옮긴다. 그렇게되면 스택 A의 역순으로 데이터가 저장될 것이고 스택 B를 POP하면 큐에 저장된 데이터 순서대로 출력될 것이다. 즉 스택 A는 인큐의 역할을 하게되고 스택 B는 디큐의 역할을 하게된다. PUSH를 하면 스택에는 가장 늦게 들어온 데이터가 맨 위에 쌓일 것이며 이를 다시 ..

CS/자료구조 2021.10.28

[백준 1520] 내리막길

https://www.acmicpc.net/problem/1520 1520번: 내리막 길 여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으 www.acmicpc.net 접근 출발지에서 도착지까지 문제에서 주어진 조건에 부합하는 경로의 개수를 구해야한다. 이를 위해 DFS를 활용하였다. 출발지에서부터 상하좌우를 탐색하여 현재 위치보다 낮은 위치로 재귀호출을 진행하였다. 이때 현재 위치가 도착지일 때는 도착지까지 올 수 있는 경우의 수를 증가하였다. 하지만 DFS만을 이용하여 풀 때는 답은 정확하게 출력될 수 있지만 이미 가봤던 경로도 계속해서 탐색을 진행하기 때문에 시..

[자료구조] 해시 테이블

그 동안 알고리즘 문제를 풀 때 dict를 많이 사용하였다. dict는 해시 테이블이라는 자료구조 인데 key-value 쌍으로 데이터를 저장할 수 있다. 원리는 대충 알고있었지만 정확하게 어떠한 원리를 갖고있는지 이해하고 싶어서 정리를 하게 되었다. 해싱 먼저 해싱이라는 개념을 이해할 필요가 있다. 해싱은 랜덤한 길이의 값을 해시 함수를 사용하여 고정된 크기의 값으로 변환하는 것을 의미한다. 아래의 그림과 같이 "apple", "banana", "complete"처럼 문자열의 길이가 다양한 단어가 들어왔을 때 세 자리 정수로 변환하는 작업을 해싱이라 할 수 있다. 해시 테이블과 해시 함수의 필요성 해시 테이블 해시 테이블은 해시 함수를 통해 변환된 값을 Index로 삼아 Key와 Value를 저장하는 ..

CS/자료구조 2021.10.21

[백준 5639] 이진 검색 트리

https://www.acmicpc.net/problem/5639 5639번: 이진 검색 트리 트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다 www.acmicpc.net 접근 이진 검색 트리는 루트 노드를 기준으로 루트 노드보다 작으면 왼쪽 서브트리로 크다면 오른쪽 서브트리에 저장한다. 이때 전위 순회의 결과가 주어진다고할 때 후위 순회의 결과를 출력해야 한다. 전위 순회이기 때문에 루트 노드를 먼저 방문하게 된다. 따라서 맨 처음 나오게 되는 숫자가 루트 노드에 저장된 수이다. 이제 루트 노드를 기준으로 왼쪽 서브트리와 오른쪽 서브트리로 나누면 될 ..

[자료구조] 트리 : 최소 공통 조상(LCA)

트리에서 최소 공통 조상이 무엇이며 이를 구하기 위한 기본적인 방법과 메모리를 사용하여 시간 복잡도를 개선한 알고리즘을 알아보자. 최소 공통 조상(Lowest Common Ancestor) 최소 공통 조상은 두 노드의 공통된 조상 중에서 가장 가까운 조상을 의미한다. 아래의 트리를 통해 9번 노드와 11번 노드의 LCA를 알아보자. 9번 노드의 부모 노드는 4 -> 2 -> 1이며 11번 노드의 부모 노드는 5 -> 2 -> 1이다. 이때 2와 1은 두 노드의 공통 조상이된다. 이처럼 두 개의 노드에서 공통 조상이 될 수 있는 노드는 여러 개일 수 있으며 여기서 레벨이 가장 높은(두 개의 노드에서 가장 가까운)노드가 최소 공통 조상이 된다. LCA 알고리즘 Ⅰ 기본적인 LCA 알고리즘의 개념은 다음과 같..

CS/자료구조 2021.10.19

[알고리즘] 정렬 : 퀵 정렬

퀵 정렬은 합병 정렬과 같이 분할 정복 알고리즘을 적용한 정렬 기법이며 평균적으로 매우 빠른 속도를 갖고있다. 또한 정렬 대상에 동일한 키 값이 존재할 경우 키 값의 순서가 바뀌는 불안정 정렬이다. 개념 퀵 정렬은 피벗(pivot)을 설정하여 피벗을 기준으로 작은 값은 피벗의 왼쪽으로 큰 값은 피벗의 오른쪽으로 이동시킨다. 아래에 정렬할 대상이 있다. 여기서는 가장 앞에 있는 값을 피벗으로 설정해보자. [3, 1, 10, 6, 4, 7, 8, 2, 5, 9] 그렇다면 3이 피벗이되고 3을 기준으로 작은 값은 왼쪽으로 큰 값으 오른쪽으로 이동시키면 아래와 같은 결과를 갖는다. [1, 2] < [3] < [10, 6, 4, 7, 8, 5, 9] 위와 같이 분리가 되었다면 왼쪽은 왼쪽끼리 오른쪽은 오른쪽끼리 ..

CS/알고리즘 2021.10.18

[알고리즘] 역순 정렬에 효율적인 정렬 알고리즘은?

정렬을 위한 알고리즘은 다양하다. 따라서 각각의 상황에 맞는 정렬 알고리즘을 적절히 사용해야 한다. 이번에는 내림차순으로 정렬된 수들을 다시 오름차순으로 정렬하기 위해서는 어떠한 기법이 효율적이며 왜 그런 것인지 알아보려고 한다. 잘못된 내용은 댓글에 적어주시면 감사하겠습니다. 아래처럼 10부터 내림차순으로 정렬되어 있는 것을 오름차순으로 정렬하려고 한다. 어떻게 하는 것이 가장 효율적인 방법일지 생각해보자. [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 빈번한 교환은 비효율적 정렬을 할 때 두 수를 비교하여 두 수의 위치를 변경하는 횟수가 많을수록 비효율적인 알고리즘이 된다. 두 수를 교환하기 위해서는 임시 변수를 생성해야 하고 A를 임시 변수에 저장하고 A에 B를 저장 후에 B에 임시 변수..

CS/알고리즘 2021.10.18

[TIL] 소프트웨어 품질 평가를 위한 ISO25000

국제 표준화 기구(ISO)에서 소프트웨어 품질 평가를 위해 소프트웨어 품질 평가 통합 모델인 ISO25000을 제정하였다. 그렇다면 소프트웨어의 품질이 무엇이고 품질 평가가 왜 필요한지 알아보자. 또한 품질 평가를 하기위한 몇 가지 항목들을 자세히 알아본다. 소프트웨어 품질이란 소프트웨어 품질에 대한 개념은 사람마다 의견이 다르다. 또한 소프트웨어의 품질을 정량적으로 평가하기는 어렵다. 하지만 IEEE(전기 전자 기술자 협회)는 소프트웨어 품질에 대해 다음과 같이 정의하고 있다. 기능명세서의 적절한 구현성 등 주어진 요구사항을 만족시킬 수 있는 SW의 총체적인 특징과 제품의 특성들 SW가 요구하는 특성이나 속성들을 융합할 수 있는 SW 프로세스 정도 SW가 고객의 기대에 만족해야 하며 이를 사용자나 고객..

Today I Learned 2021.10.17

[백준 20057] 마법사 상어와 토네이도

https://www.acmicpc.net/problem/20057 20057번: 마법사 상어와 토네이도 마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을 www.acmicpc.net 접근 다음 칸으로 이동했을 때 해당 칸의 모래의 양은 없어지고 미리 정해진 위치로 비율만큼 흩어지게 된다. 그리고 방향에 따라 특정 위치의 비율도 달라진다. 따라서 미리 방향에 따라 특정 위치로 이동했을 때의 비율을 저장해둔 후에 사용하도록 하였다. 아래와 같이 현재 위치와 방향을 기준으로 흩어지는 모래의 비율을 저장하였다. 행의 번호는 현재 방향을 가리키고 있는 ..

[자료구조] 트리의 지름

가중치가 있는 간선으로 연결된 트리에서 지름을 알아보자. 이를 통해 트리의 특징들을 더 깊게 이해할 수 있을 것이다. 트리의 지름을 알아보기 위해 백준 1967 트리의 지름 문제를 참고하였다. 트리의 지름이란 트리는 N개의 노드로 이루어졌을 때 N-1개의 간선으로 연결되기 때문에 순환되지 않는 구조를 갖고있다. 따라서 노드 A에서 노드 B로 이동하는 경로를 하나밖에 없다. 이때 두 개의 노드를 양쪽으로 잡아당겼을 때 가장 길게 늘어나는 경우가 생기며 특정 원 안에 트리가 들어온다. 여기서 생긴 원의 지름을 트리의 지름이라고 한다. 트리의 지름 구하기 그렇다면 트리의 간선들에 가중치가 있을 때 트리의 지름을 어떻게 구할 수 있을까? 아래의 트리를 보면 트리의 지름을 구성하는 두 개의 노드는 9번 노드와 1..

CS/자료구조 2021.10.14
반응형