Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions presentation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## 발표 자료

https://cheezeasy.notion.site/fc948f29a86e4eee9e24c0573c6cf451
66 changes: 66 additions & 0 deletions week6/chaewon/week6_10026.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# BJ 10026 / GOLD V / 96ms

import sys
from collections import deque

sys.setrecursionlimit(10000) # 런타임 에러 방지 : 기본 재귀 깊이 제한 = 1000으로 매우 얕음, 10000으로 변경함으로써 런타임 오류 해결, 재귀함수 사용할 때는 꼭 적어두는 게 좋음

n = int(input())

graph = [[0] * n for _ in range(n)]
visited = [[0] * n for _ in range(n)]

normal_cnt = 0
rb_cnt = 0

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

for i in range(n):
graph[i] = list(sys.stdin.readline().strip())


def dfs(x, y):
visited[x][y] = 1
current_color = graph[x][y]

for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if (0 <= nx < n) and (0 <= ny < n):
if visited[nx][ny] == 0 and current_color == graph[nx][ny]:
dfs(nx, ny)
return 0


# 정상인이 볼 때
for i in range(n):
for j in range(n):
if visited[i][j] == 0:
dfs(i, j)
normal_cnt += 1


# 적록색약인 사람이 볼 때 -> graph에서 G를 R로 바꾸어 줌
for row in range(n):
for column in range(n):
if graph[row][column] == 'G':
graph[row][column] = 'R'

# visited 초기화
visited = [[0]*n for _ in range(n)]

for i in range(n):
for j in range(n):
if visited[i][j] == 0:
dfs(i, j)
rb_cnt += 1

print(normal_cnt, rb_cnt)


'''
NOTE:
계속 비슷한 문제인 것 같은데 조금만 달라져도 풀기 어려운 주제인 것 같다 흑

'''
68 changes: 68 additions & 0 deletions week6/chaewon/week6_1012.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# BJ 1012 / SILVER II / 72ms

import sys
from collections import deque

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

t = int(sys.stdin.readline().strip())


def bfs(graph, a, b):
queue = deque()
queue.append((a, b))
graph[a][b] = 0

while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i] # 행
ny = y + dy[i] # 열
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
if graph[nx][ny] == 1:
graph[nx][ny] = 0
queue.append((nx, ny))

return 0


for _ in range(t):
cnt = 0
n, m, k = map(int, sys.stdin.readline().strip().split(' '))
graph = [[0] * m for _ in range(n)]

for _ in range(k):
x, y = map(int, sys.stdin.readline().strip().split(' '))
graph[x][y] = 1

# 2차원 리스트를 보기 좋게 출력하는 코드
# for i in graph:
# for j in i:
# print(j, end=" ")
# print()

for a in range(n):
for b in range(m):
if graph[a][b] == 1:
bfs(graph, a, b)
cnt += 1

print(cnt)


'''
NOTE:

핵심 아이디어가 인접한 1을 0으로 모두 바꾸어주는 건데
아예 생각지도 못했다 ...

즉, graph[x][y] = 1일 때, 해당 위치에서 인접한 1을 모두 0으로 바꾸어 주는 bfs를 실행한다.
이때 bfs는, x와 y에서 상하좌우로 인접한 1 뿐만 아니라, x와 y에서 상하좌우로 이동한 좌표 nx, ny에서 인접한 1 까지 0으로 변경해준다.
이 과정을 인접한 1이 없을 때까지 반복한다.

이 아이디어를 떠올리는 것이 핵심이었는데
문제를 많이 안풀어봐서 그런가 생각을 못해냈다 ㅠ

'''
65 changes: 65 additions & 0 deletions week6/chaewon/week6_1260.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# BJ 1260 / SILVER II / 164ms

import sys
from collections import deque

n, m, v = map(int, input().split(' '))


# 인접 행렬 생성 : 5 by 5 이차원 리스트 생성
graph = [[0] * (n + 1) for _ in range(n + 1)] # n + 1인 이유 : n의 범위가 1부터이기 때문에, 노드값이 0인 노드가 존재X = 인덱스가 0인 graph값을 0으로 남겨두어야 함

for _ in range(m):
a, b = map(int, sys.stdin.readline().strip().split(' '))
graph[a][b] = 1 # 두 노드를 연결하는 엣지는 양방향
graph[b][a] = 1

dfs_visited = [0] * (n + 1)
bfs_visited = [0] * (n + 1)


def dfs(v):
dfs_visited[v] = 1 # 시작 노드 v를 방문 -> visited 값을 1로 변경
print(v, end=' ')

for i in range(1, n + 1):
if (not dfs_visited[i]) and graph[v][i]:
dfs(i)


def bfs(v):
queue = deque([v])
bfs_visited[v] = 1

while queue:
v = queue.popleft()
print(v, end=' ')
for j in range(1, n + 1):
if (not bfs_visited[j]) and graph[v][j]:
queue.append(j)
bfs_visited[j] = 1


dfs(v)
print()
bfs(v)


'''
NOTE:
DFS, BFS의 가장 기본 문제인 것 같다
기본 개념과 예제 코드까지 다 익히고 나서 문제를 푼건데도 어려웠다
예제에서는 graph를 처음부터 인접 리스트로 저장해뒀었는데
여기서는 입력 받고 인접 행렬 또는 인접 리스트로 직접 바꿔 저장하는 부분을 구현하는 게 어려웠다 ㅠ

인접 리스트를 구현하는 코드는 아래와 같다

graph = [[] for _ in range(N + 1)]

for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)

파이팅...
'''
53 changes: 53 additions & 0 deletions week6/chaewon/week6_2178.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# BJ 2178 / SILVER I / 76ms

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().strip().split(' '))

graph = [[0] for _ in range(n)]
visited = [[0] * m for _ in range(n)]

for i in range(n):
graph[i] = list(map(int, sys.stdin.readline().strip()))

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]


def bfs():
cnt = 1
queue = deque()
queue.append((0, 0, cnt))
visited[0][0] = 1

while queue:
x, y, cnt = queue.popleft()
if x == n-1 and y == m-1:
break
for i in range(4):
nx = x + dx[i] # 행
ny = y + dy[i] # 열
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
if graph[nx][ny] == 1 and visited[nx][ny] == 0:
visited[nx][ny] = 1
queue.append((nx, ny, cnt + 1))
print(cnt)
return 0


bfs()


'''
NOTE:

배추 문제랑 비슷한 것 같으면서도 최단 거리라는 조건이 하나 더 붙어서 뭔가 헷갈렸던 문제

처음에는 메모리 초과가 났는데, 32번라인에서 visited[nx][ny] == 0 조건을 추가했더니 해결됐다
방문 여부를 queue에 추가하기 전에 체크하지 않아서 그랬던 것 같다

또 처음 cnt 선언을 0으로 해서 헤매기도 했다...^^ 정말 어렵고도 어려운 알고리즘
2학기에 수업 꼭 듣고 만다
'''
70 changes: 70 additions & 0 deletions week6/chaewon/week6_2589.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# BJ 2589 / GOLD V / 752ms

import sys
from collections import deque

sys.setrecursionlimit(10000)

n, m = map(int, input().split(' '))

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

graph = [list(sys.stdin.readline().strip()) for _ in range(n)]
visited = [[0] * m for _ in range(n)]


def bfs(x, y):
queue = deque()
cnt = 0
queue.append((x, y))
visited[x][y] = 1 # 놓친 부분

while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]

if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
elif graph[nx][ny] == 'L' and visited[nx][ny] == 0:
visited[nx][ny] = visited[x][y] + 1
cnt = max(cnt, visited[nx][ny]) # 현재 위치에서 가장 먼 육지까지의 거리+1 값을 구함
queue.append((nx, ny))
return cnt - 1


result = 0

for i in range(n):
for j in range(m):
if i > 0 and i + 1 < n:
if graph[i - 1][j] == "L" and graph[i + 1][j] == "L":
continue
if j > 0 and j + 1 < m:
if graph[i][j - 1] == "L" and graph[i][j + 1] == "L":
continue

if graph[i][j] == 'L':
visited = [[0] * m for _ in range(n)]
result = max(result, bfs(i, j))

print(result)


'''
NOTE:
대부분의 로직은 구현했는데, cnt 구하는 과정에서 막혔다ㅠ

32번 라인 : visited[nx][ny] = visited[x][y] + 1 를 통해, 현재 위치에서 각 육지위치까지의 거리를 구할 수 있게 된다는 것,
51번 라인 : 육지좌표 간 가장 거리가 먼 값을 구하는 과정인데, 여기서는 바로바로 result와 bfs()를 비교하는 데 max()를 써도 되지만
list를 만들고 bfs()값을 append한 뒤 max(list)해도 된다.

42~47번 라인 : 백트래킹 코드. 육지이지만 가장자리가 아닌 부분을 제외하는 과정이다.
육지이지만 가장자리가 아닌 부분을 지나면, 가장 먼 최단거리에 해당할 수 없기 때문에 애초부터 배제해주는 것
이 코드가 없으면 pypy3로 제출해야 시간초과가 안난다
이 부분이 있어야 python3로 제출 가능하다

골드 v라 그런가 확실히 어렵다!!! 그래도 점점 나아지는 중이당
'''
18 changes: 18 additions & 0 deletions week7/bada/backjoon_form.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'''
/* 문제 정보 */
??번 - ??
난이도 - ??

/* 풀이 방법 */


'''



'''
/* 오답노트 */

/* 느낀점 */

'''
Loading