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
Binary file removed .DS_Store
Binary file not shown.
26 changes: 26 additions & 0 deletions yeonwoo/1051.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# 1051
# 숫자 정사각형

def find_square(n, m):
number = rectangle[n][m] # 기준이 될 숫자
edge = 1 # 변의 길이
max_edge = 0 # 정사각형의 변 길이 최대값
while n+edge< N and m+edge < M: # 직사각형 안에서 진행
if number == rectangle[n+edge][m] == rectangle[n][m+edge] == rectangle[n+edge][m+edge]: # 꼭짓점에 쓰여 있는 수가 모두 같은 정사각형을 찾는다면
max_edge = edge
edge += 1
return max_edge

N, M = map(int, input().split(' '))
rectangle = []
for _ in range(N):
rectangle.append(list(input()))
# print(rectangle)

result_edge = 0
for n in range(N):
for m in range(M):
# 모든 위치에서 시작하여 정사각형을 찾음
max_edge = find_square(n, m)
if max_edge > result_edge: result_edge = max_edge
print((result_edge+1)**2)
31 changes: 31 additions & 0 deletions yeonwoo/11725.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# 11725
# 트리의 부모 찾기

from collections import deque

def find_parent(graph, start):
parent = [0 for _ in range(len(graph))] # 각 노드의 부모 노드
visited = [] # 탐색한 노드를 체크하기 위해
queue = deque([start])
while queue:
node = queue.popleft()
visited.append(node)
for n in graph[node]:
if not parent[n]: # 아직 탐색하지 않은 노드라면(부모 노드가 설정되지 않은 노드라면)
queue.append(n)
parent[n] = node # 해당 노드의 부모 노드를 설정

# print(node, end=' ')
# print(parent, end=' ')
# print(queue)
return parent

N = int(input())
graph = [ [] for _ in range(N+1) ] # 각 노드와 연결된 노드들
for _ in range(N-1):
n1, n2 = map(int, input().split(' '))
graph[n1].append(n2)
graph[n2].append(n1)

parent = find_parent(graph, 1)
for i in range(2, N+1): print(parent[i])
34 changes: 34 additions & 0 deletions yeonwoo/1260.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# 1260
# DFS와 BFS

from collections import deque

DFS_visited = [] # DFS를 수행한 결과
def dfs(graph, start):
if start in DFS_visited: return # 이미 방문한 노드

DFS_visited.append(start)
for node in graph[start]: dfs(graph, node) # 해당 노드와 연결된 노드로 DFS를 계속함

BFS_visited = [] # BFS를 수행한 결과
def bfs(graph, start):
queue = deque([start])
while queue:
node = queue.popleft()
if node not in BFS_visited: # 아직 방문한 적 없는 노드만 탐색
BFS_visited.append(node)
for n in graph[node]: queue.append(n)


N, M, V = map(int, input().split(' '))
graph = [ [] for _ in range(N+1) ] # 각 정점과 연결된 정점들
for _ in range(M):
n1, n2 = map(int, input().split(' '))
graph[n1].append(n2)
graph[n2].append(n1)
for n in range(1, N+1): graph[n].sort()

dfs(graph, V)
bfs(graph, V)
print(*(DFS_visited))
print(*(BFS_visited))
41 changes: 41 additions & 0 deletions yeonwoo/1283.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# 1283
# 단축키 지정

N = int(input())

shortcut = [] # 각 옵션의 단축키와, 해당 위치
def assign_shortcut(option):
shortcut_key = list(map(lambda x: x[0], shortcut)) # 단축키들
# print(shortcut_key)
option = option.upper() # 대문자로 변환

for i in range(len(option)):
if i == 0 or option[i-1] == ' ': # 단어의 첫 글자
if option[i] not in shortcut_key: # 단어의 첫 글자가 단축키로 지정되어 있지 않다면
shortcut.append([option[i], i]) # 단축키와 해당 위치를 리스트에 저장
return

# 모든 단어의 첫 글자가 이미 단축키로 지정되어 있다면
for i in range(len(option)):
if option[i] != ' ' and option[i] not in shortcut_key: # 왼쪽에서부터 차례대로 알파벳을 보면서 단축키로 지정 안 된 것이 있다면
shortcut.append([option[i], i]) # 단축키로 지정
return

# 어떠한 것도 단축키로 지정할 수 없다면 그냥 놔둠
shortcut.append(['', -1])

options = []
for _ in range(N):
option = input()
assign_shortcut(option)
options.append(option)
# print(shortcut)

for n in range(N): # 각 옵션에 단축키를 표시해서 출력
index = shortcut[n][1] # 단축키가 있는 위치

for i in range(len(options[n])): # 출력
if i == index: # 단축키가 있는 알파벳을 출력할 때
print('['+options[n][i]+']', end='')
else: print(options[n][i], end='')
print()
42 changes: 42 additions & 0 deletions yeonwoo/1325.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# 1325
# 효율적인 해킹

from collections import deque

N, M = map(int, input().split(' ')) # N개의 컴퓨터, M개 줄 입력
trust = [ [] for _ in range(N+1) ] # 각 컴퓨터를 신뢰하는 컴퓨터들. 해당 컴퓨터를 해킹하면 함께 해킹할 수 있는 컴퓨터
for _ in range(M):
A, B = map(int, input().split(' ')) # A가 B를 신뢰
trust[B].append(A) # B를 해킹하면 A도 해킹할 수 있음
# for n in range(1, len(trust)):
# print(n, end=" ")
# print(trust[n])

outputs = []
max_hacking = 0
def bfs(trust, start):
global max_hacking
result = 0 # 해당 컴퓨터를 해킹하면 한 번에 해킹할 수 있는 모든 컴퓨터의 개수
visited = [False] * (N+1)
queue = deque([start])
visited[start] = True
while queue:
# print(hacking[start])
# print(queue)
computer = queue.popleft()
for com in trust[computer]:
if not visited[com]:
visited[com] = True
result += 1
queue.append(com)
if result > max_hacking:
outputs.clear()
outputs.append(start)
max_hacking = result
elif result == max_hacking: outputs.append(start)

for computer in range(1, N+1): bfs(trust, computer)
# print(hacking)

# 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터를 찾음
print(*(outputs))
19 changes: 19 additions & 0 deletions yeonwoo/1449.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# 1449
# 수리공 항승

N, L = map(int, input().split(' ')) # 물이 새는 곳의 개수 N, 테이프의 길이 L
holes = list(map(int, input().split(' ')))
holes.sort() # 오름차순으로 정렬

output = 1 # 필요한 테이프의 수
tape = [holes[0]-0.5, holes[0]-0.5+L] # 가장 최근에 붙인 테이프가 붙여져 있는 위치
for i in range(1, N):
# 해당 물이 새는 곳을 이 테이프로 막을 수 있는지 확인
if holes[i]-0.5 >= tape[0] and holes[i]+0.5 <= tape[1]: # 막을 수 있다면
continue # 패스
else: # 막을 수 없다면
output += 1 # 필요한 테이프를 하나 더 추가
tape[0] = holes[i]-0.5
tape[1] = holes[i]-0.5+L

print(output)
82 changes: 82 additions & 0 deletions yeonwoo/14500.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# 14500
# 테트로미노

N, M = map(int, input().split(' '))
paper = []
for _ in range(N): paper.append(list(map(int, input().split(' '))))
# print(paper)

max_num = 0
for n in range(N):
for m in range(M):

# 1번 테트로미노
if m+3 < M:
num = paper[n][m] + paper[n][m+1] + paper[n][m+2] + paper[n][m+3]
if num > max_num: max_num = num
if n+3 < N:
num = paper[n][m] + paper[n+1][m] + paper[n+2][m] + paper[n+3][m]
if num > max_num: max_num = num

# 2번 테트로미노
if n+1 < N and m+1 < M:
num = paper[n][m] + paper[n][m+1] + paper[n+1][m] + paper[n+1][m+1]
if num > max_num: max_num = num

# 3번 테트로미노
if n+2 < N:
if m+1 < M:
num = paper[n][m] + paper[n+1][m] + paper[n+2][m] + paper[n][m+1]
if num > max_num: max_num = num

num = paper[n][m] + paper[n+1][m] + paper[n+2][m] + paper[n+2][m+1]
if num > max_num: max_num = num
if m-1 > -1:
num = paper[n][m] + paper[n+1][m] + paper[n+2][m] + paper[n][m-1]
if num > max_num: max_num = num

num = paper[n][m] + paper[n+1][m] + paper[n+2][m] + paper[n+2][m-1]
if num > max_num: max_num = num
if m+2 < M:
if n+1 < N:
num = paper[n][m] + paper[n][m+1] + paper[n][m+2] + paper[n+1][m]
if num > max_num: max_num = num

num = paper[n][m] + paper[n][m+1] + paper[n][m+2] + paper[n+1][m+2]
if num > max_num: max_num = num
if n-1 > -1:
num = paper[n][m] + paper[n][m+1] + paper[n][m+2] + paper[n-1][m]
if num > max_num: max_num = num

num = paper[n][m] + paper[n][m+1] + paper[n][m+2] + paper[n-1][m+2]
if num > max_num: max_num = num

# 4번 테트로미노
if n+2 < N and m+1 < M:
num = paper[n][m] + paper[n+1][m] + paper[n+1][m+1] + paper[n+2][m+1]
if num > max_num: max_num = num

num = paper[n][m+1] + paper[n+1][m] + paper[n+1][m+1] + paper[n+2][m]
if num > max_num: max_num = num
if n+1 < N and m+2 < M:
num = paper[n][m+1] + paper[n][m+2] + paper[n+1][m] + paper[n+1][m+1]
if num > max_num: max_num = num

num = paper[n][m] + paper[n][m+1] + paper[n+1][m+1] + paper[n+1][m+2]
if num > max_num: max_num = num

# 5번 테트로미노
if n+1 < N and m+2 < M:
num = paper[n][m] + paper[n][m+1] + paper[n][m+2] + paper[n+1][m+1]
if num > max_num: max_num = num

num = paper[n+1][m] + paper[n+1][m+1] + paper[n+1][m+2] + paper[n][m+1]
if num > max_num: max_num = num
if n+2 < N and m+1 < M:
num = paper[n][m] + paper[n+1][m] + paper[n+2][m] + paper[n+1][m+1]
if num > max_num: max_num = num

num = paper[n][m+1] + paper[n+1][m+1] + paper[n+2][m+1] + paper[n+1][m]
if num > max_num: max_num = num

print(max_num)
66 changes: 66 additions & 0 deletions yeonwoo/17144.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# 17144
# 미세먼지 안녕!

from copy import deepcopy

R, C, T = map(int, input().split(' ')) # 격자판 RxC, T초 후의 상태
next_room = [] # 다음에 변화될 상태
for _ in range(R): next_room.append(list(map(int, input().split(' '))))
dir = [[-1, 0], [0, 1], [1, 0], [0, -1]] # 동서남북 방향

room = []
air_purifier = [] # 공기청정기 위치
for _ in range(T): # T초 동안 진행됨
room = deepcopy(next_room)
# 미세먼지 확산
for r in range(R):
for c in range(C):
if room[r][c] > 0: # 해당 칸에 미세먼지가 있다면
# 각 방향에 위치한 칸이 벽이 아니고, 공기청정기가 없다면 미세먼지 확산
if r > 0 and room[r-1][c] > -1:
next_room[r-1][c] += room[r][c] // 5
next_room[r][c] -= room[r][c] // 5
if c > 0 and room[r][c-1] > -1:
next_room[r][c-1] += room[r][c] // 5
next_room[r][c] -= room[r][c] // 5
if r < R-1 and room[r+1][c] > -1:
next_room[r+1][c] += room[r][c] // 5
next_room[r][c] -= room[r][c] // 5
if c < C-1 and room[r][c+1] > -1:
next_room[r][c+1] += room[r][c] // 5
next_room[r][c] -= room[r][c] // 5
elif room[r][c] == -1: air_purifier.append([r, c])

# 공기청정기 작동, 바람 순환
# 반시계 방향 순환
air_move = []
r, c = air_purifier[0][0], air_purifier[0][1]
for i in range(c+1, C-1): air_move.append([r, i])
for i in range(r, 0, -1): air_move.append([i, C-1])
for i in range(C-1, c, -1): air_move.append([0, i])
for i in range(0, r): air_move.append([i, c])
# print(air_move)
for i in range(len(air_move)-1, 0, -1):
next_room[air_move[i][0]][air_move[i][1]] = next_room[air_move[i-1][0]][air_move[i-1][1]]
next_room[air_move[0][0]][air_move[0][1]] = 0

# 시계 방향 순환
air_move = []
r, c = air_purifier[1][0], air_purifier[1][1]
for i in range(c+1, C-1): air_move.append([r, i])
for i in range(r, R-1): air_move.append([i, C-1])
for i in range(C-1, c, -1): air_move.append([R-1, i])
for i in range(R-1, r, -1): air_move.append([i, c])
# print(air_move)
for i in range(len(air_move)-1, 0, -1):
next_room[air_move[i][0]][air_move[i][1]] = next_room[air_move[i-1][0]][air_move[i-1][1]]
next_room[air_move[0][0]][air_move[0][1]] = 0

# for r in range(R): print(next_room[r])

result = 0
for r in range(R):
for c in range(C):
if next_room[r][c] > 0: # 미세먼지가 있다면
result += next_room[r][c] # 해당 미세먼지 값을 합산
print(result)
31 changes: 31 additions & 0 deletions yeonwoo/17276.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# 17276
# 배열 돌리기

from copy import deepcopy

def rotate_45(array, n): # 배열을 시계 방향으로 45도 돌리는 함수
result_array = deepcopy(array)
for i in range(n):
result_array[i][(n+1)//2-1] = array[i][i] # 주 대각선을 가운데 열로 옮김
result_array[i][n-1-i] = array[i][(n+1)//2-1] # 가운데 열을 부 대각선으로 옮김
result_array[(n+1)//2-1][n-1-i] = array[i][n-1-i] # 부 대각선을 가운데 행으로 옮김
result_array[i][i] = array[(n+1)//2-1][i] # 가운데 행을 주 대각선으로 옮김
return result_array

N = int(input()) # 테스트 케이스의 개수
result = [] # 결과값 리스트
for _ in range(N):
n, d = map(int, input().split(' '))
array = []
for _ in range(n):
array.append(list(map(int, input().split(' '))))

if d < 0: d += 360 # 함수를 사용하기 위해 360도를 더해줌
number = d // 45 # 45도로 몇 번 돌려야 하는지
for _ in range(number):
result_array = rotate_45(array, n)
array = deepcopy(result_array)

for i in range(n): result.append(array[i])

for i in range(len(result)): print(*(result[i]))
Loading