Krafton_Jungle/Study

Krafton_jungle 5기 11일차 TIL - 알고리즘 시험, 그래프 자료구조, CS:APP

전낙타 2024. 3. 28. 23:16

알고리즘 시험

 

1. 1110 더하기 사이클

저번에 풀이한 방법은 while문을 사용해서 풀었길레 이번엔 재귀를 사용해서 풀이했음.

 

 

2. 1182 부분수열의 합

파이썬 내장 모듈 사용 안하고 풀려다가 시간 엄청 까먹었다...

그냥 모듈 사용하고 3번으로 갈걸

 

3. 1992 쿼드트리

import sys
input = sys.stdin.readline


def solve(x, y, total_length):
	global res
	if total_length <= 0:
		return
	flag = search(x,y,total_length)
	if flag == 2:
		res += "("
		solve(x, y, total_length//2)
		solve(x+total_length//2, y, total_length//2)
		solve(x, y+total_length//2, total_length//2)
		solve(x+total_length//2, y+total_length//2, total_length//2)
		res += ")"
	else:
		res += str(flag)

	

def search(x, y, total_length):
	flag = plate[y][x]
	for i in range(y, y + total_length):
		for j in range(x, x + total_length):
			if plate[i][j] != flag:
				return 2
	return flag


n = int(input())

plate = []
res = ""
for i in range(n):
	string = input().rstrip()
	row = []
	for i in string:
		row.append(int(i))
	plate.append(row)
	
solve(0,0,len(plate))
print(res)

저번에 풀었던 색종이 문제와 크게 다르지 않아 어렵지 않게 풀었다.

 

생각보다 쉬웠지만 결과는 1/3솔... 시간이 조금만 더 있었더라면 하는 아쉬움이 있다.

 

 

그래프

그래프란? 연결되어 있는 원소간의 관계를 표현한 자료구조로, 정점(Vertex)과 각 정점을 연결하는 간선(Edge), 그리고 한 방향으로만 이동할 수 있는 간선인 arc의 집합으로 구성되어 있다.
Dgree(차수) 정점에 부속되어있는 간선의 개수
그래프의 종류 무방향 그래프(Undirected graph)
정점을 연결하고 있는 간선의 방향이 없어, 어디로든 이동할 수 있다.
방향 그래프(Directed graph)
arc로 구성되어 있어 단방향으로만 탐색이 가능한 그래프
완전 그래프(Complate graph)
모든 정점이 간선으로 연결되어 있는 그래프
가중 그래프(Weight greph)
간선에 가중치를 할당해, 가중치만큼의 이동만 가능한 그래프

 

그래프의 표현 방식

인접행렬

인접 행렬 그래프를 2차원 배열에 저장한다.
부속된 간선을 찾는것은 빠르지만 메모리를 많이 사용한다.
노드 수보다 간선 수가 많은 dense graph이거나 빠르게 부속된 간선을 찾을 때 주로 사용한다.
dense graph 란 간선의 수가 최대 간선의 수에 가까운 그래프이다.

 

무방향, 방향 그래프

 

다음과 같은 방향 그래프는 파이썬 코드로 이렇게 구현할 수 있다.

코드를 보면 2차원 배열로 연결된 간선을 직접적으로 선언해줘, 탐색에 용의한 모습을 볼 수 있다.

하지만 N*N 만큼의 메모리를 할당해줘야 함을 알 수 있다.

무방향도 이 형식과 크게 다르지 않다.

 

가중 그래프

위에 있는 그래프에 가중치가 더해진다고 생각해보자.

이는 어떤 방법으로 표현할 수 있을까?

가중 그래프는 다음과 같이 표현할 수 있다. 

표현 방식에 있어 그리 크게 다른점을 볼 수 없다.

 

시간 복잡도 어느 두 정점에 부속된 간선이 있는지 탐색할 경우 - O(n)
인접한 정점찾기 O(n)
공간복잡도 - v*v

 

 

인접 리스트

인접리스트 인접한 정점을 연결 리스트로 표현
연결된 간선에 대한 값만 저장. 메모리 적게씀
간선 수보다 노드 수가 많은 spare graph에 주로 사용
정점은 배열에 저장하고 각 정점에 인접한 정점은 연결리스트로 관리 (해시의 체이닝이 생각난다)

 

방향, 무방향 그래프

우선은 파이썬의 배열을 사용해 링크드 리스트를 대체했지만 이런식으로 구현한다고 보면 된다.

 

가중 리스트

가중 그래프는 가중치를 저장하는 필드값을 따로 추가해주는 모습을 확인할 수 있다.

 

시간 복잡도 특정 간선을 탐색한다 - O(n)
인접한 정점을 탐색한다 - O(n)
공간 복잡도 - O(노드 + 간선)

 

Walk

walk란? walk는 노드를 탐색하며 거치는 엣지의 수를 뜻한다.
탐색하며 거치는 경로라고 생각하면 편하다.
walk의 종류 walk의 종류는 Trail, Path, Cycle, Circuit이 있다.
Trail 단순히 엣지가 반복되지 않는 walk라고 생각하면 된다.
Path Trail의 특징을 가져가면서 노드가 반복되지 않는 구조.
시작점과 끝점이 같으면 Trail이지만 Path는 끝점 또한 겹치면 안된다.
Cycle 이름에서 짐작할 수 있듯 Trail의 시작과 끝점이 동일한 walk이다.
Circuit Trail이지만 노드는 많이 반복되는 walk이다.

 

그래프 탐색

DFS (깊이 우선 탐색) 탐색을 진행할 때 주로 stack 자료구조를 사용하며, 재귀를 통해 구현된다.
말 그대로 하나의 온전한 경우의 수를 찾고 return하는 방식으로 구현
BFS (넓이 우선 탐색) 탐색을 진행할 때 queue를 사용하며, while문을 주로 사용한다.
모든 step을 하나씩 진행하며 완전탐색 함
특징 그래프의 모든 정점을 탐색하거나, 최단거리를 찾고싶으면 BFS
경로의 특징을 저장해야 하면 DFS를 사용하면 된다.

 

CSAPP

 

1.7.1 프로세스

프로세스란? 주 메모리에 적재된 컴파일 된 실행중인 인스트럭션의 집합
OS의 역할 프로그램이 키보드나 디스플레이, 디스크나 메인 메모리를 직접 제어하지 않는다.
이런 역할은 OS가 담당하게 되는데, 소프트웨어와 하드웨어 사이에 추상화를 담당해 I/O devices를 제어한다.
OS가 수행해야 할 가장 기본적인 기능은 프로세스를 관리하는 것.
OS의 동작 OS는 프로세서를 제어하기 위한 커널을 제공.
쉘에 명령어를 입력하면 시스템콜이 이뤄지며, OS에 제어권을 위임한다.
데이터는 커널로 이동하게 된다.
커널에서는 이미 PC에 특정 메모리 주소를 전달하는 함수가 실행되고 있는데, 이 프로세서의 컨텍스트를 PCB에 임시로 저장한다.
그 후 context switching을 이용해 입력받은 프로세서의 명령을 수행
PC에 수행될 processes의 주소를 넣고 작업이 완료되면 결과값을 return하고 (여기서 processes를 처리하는 역할은 processor가), PCB에 저장되있던 프로세스를 다시 실행
그렇게 return된 작업은 I/O devices로

 

프로세스의 동작 단계를 모두 이해하는데만 3시간을 꼬박 썼다.

이제야 살짝 구조가 잡히는것같아 너무 재밌어용