리스트(List)
- 연결 리스트와 같이 순서가 있는 자료구조
- C에선 구조체를 이용해 구현 가능
- C++에선 #include <list> 를 통해 사용 가능
- 상황에 따라 배열보다 효율적으로 문제를 풀 수 있음
- std::list<T>
- std::list<T>::iterator
#include <stdio.h>
#include <list>
using namespace std;
int main(){
list<int> lt;
list<int>::iterator iter = lt.begin();
int n, m;
scanf("%d %d", &n, &m);
for(int i=1;i<=n;i++)
lt.push_back(i);
iter++;
printf("<");
while(lt.size() != 1){
if(iter == lt.end()) iter = lt.begin();
for(int i=1;i<m;i++){
iter++;
if(iter == lt.end()) iter = lt.begin();
}
printf("%d, ", *iter);
iter = lt.erase(iter);
}
printf("%d>", *lt.begin());
}
BOJ 1158 조세퍼스 문제
#include <stdio.h>
#include <list>
#include <utility>
#define N 1002
using namespace std;
int main(){
list<int> lt;
list<int>::iterator iter;
pair<int, int> num[N];
int n, tmp;
scanf("%d", &n);
for(int i=1;i<=n;i++){
int a;
scanf("%d", &a);
lt.push_back(a);
}
iter = lt.begin();
for(int i=1;i<=n;i++){
num[i].first = i;
num[i].second = *iter;
iter++;
}
iter = lt.begin();
while(lt.size() != 0){
tmp = *iter;
for(int i=1;i<=n;i++){
if(num[i].second == *iter) {
printf("%d ", num[i].first);
num[i].first = 0;
num[i].second = 0;
break;
}
}
iter = lt.erase(iter);
if(tmp > 0){
if(iter == lt.end()) iter = lt.begin();
for(int i=1;i<tmp;i++) {
iter++;
if(iter == lt.end()) iter = lt.begin();
}
} else {
for(int i=tmp;i<0;i++) {
if(iter == lt.begin()) iter = lt.end();
iter--;
}
}
}
return 0;
}
BOJ 2346 풍선 터뜨리기 (돌아가긴 하지만 해결 못함)
그래프(Graph)
- 정점(Vertex, Node)와 간선(Edge)로 구성
- 방향성 / 비방향성
- 인접 행렬 / 인접 리스트
- 비방향성 그래프를 인접 행렬로 표현할 경우, 대칭으로 나타남.
#include <stdio.h>
#include <queue>
#define N 1001
#define M 10001
using namespace std;
bool visited[N] = {};
int adj[N][M] = {};
int dfs(int x);
int bfs(int x);
int main(){
int n, m, v;
scanf("%d %d %d", &n,&m,&v);
for(int i=0;i<m;i++){
int a, b;
scanf("%d %d", &a, &b);
adj[a][b]++;
adj[b][a]++;
}
dfs(v);
puts("");
fill(visited, visited+N, 0);
bfs(v);
}
int dfs(int x){
visited[x] = true;
printf("%d", x);
for(int j=1;j<M;j++){
if(adj[x][j] != 0){
if(!visited[j]){
printf(" ");
dfs(j);
}
}
}
}
int bfs(int x){
queue<int> q;
visited[x] = true;
q.push(x);
while(!q.empty()){
for(int i=1;i<M;i++){
if(adj[q.front()][i] != 0 && !visited[i]){
q.push(i);
visited[i] = true;
}
}
printf("%d ", q.front());
q.pop();
}
}
BOJ 1260 DFS와 BFS (인접 행렬)
트리(Tree)
- Cycle(순환)이 없는 연결 그래프
- n개의 정점, n-1개의 간선
- 각 정점간의 경로 유일
#include <stdio.h>
#include <vector>
#define N 100002
using namespace std;
vector<int> v[N];
int p[N];
bool visited[N] = {};
int dfs(int x){
visited[x] = true;
for(auto to : v[x]){
if(to != 0){
if(!visited[to]){
p[to] = x;
dfs(to);
}
}
}
}
int main(){
int n;
scanf("%d", &n);
for(int i=1;i<n;i++){
int a,b;
scanf("%d %d", &a, &b);
v[a].push_back(b);
v[b].push_back(a);
}
dfs(1);
for(int i=2;i<=n;i++){
printf("%d\n", p[i]);
}
}
BOJ 11725 트리의 부모 찾기 (인접 리스트)
'Development' 카테고리의 다른 글
CodeUp 기초100제 (바둑알 십자뒤집기) (0) | 2020.10.18 |
---|---|
Win32 API 정리 (0) | 2019.03.06 |
알고리즘 DP 정리 (0) | 2019.01.22 |
알고리즘 정렬 정리 (0) | 2019.01.09 |
다익스트라 알고리즘 (0) | 2018.12.04 |