1. 덧칠하기
https://school.programmers.co.kr/learn/courses/30/lessons/161989
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
# [Lv.1] 덧칠하기
def solution(n, m, section):
paint = 0
ans = 0
# wall = [i for i in range(n)]
for n in section:
if n > paint:
paint = n + m - 1
ans += 1
return ans
위와 같이 풀이하였다. 처음에는 배열을 만들고 DP를 활용하는 문제인줄 았았는데, 쉬운 풀이가 있었다.
2. 미로 탈출
https://www.acmicpc.net/problem/14923
14923번: 미로 탈출
홍익이는 사악한 마법사의 꾐에 속아 N x M 미로 (Hx, Hy) 위치에 떨어졌다. 다행히도 홍익이는 마법사가 만든 미로의 탈출 위치(Ex, Ey)를 알고 있다. 하지만 미로에는 곳곳에 마법사가 설치한 벽이
www.acmicpc.net
(대체 무슨 자신감으로 이 문제를 도전한건지 모르겠다)
from collections import deque
n, m = map(int, input().split())
hx, hy = map(int, input().split())
ex, ey = map(int, input().split())
maze = [list(map(int, input().split())) for _ in range(n)]
visited = [[[False] * 2 for _ in range(m)] for _ in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(x, y):
queue = deque([(x, y, 0, 0)]) # 시작 위치와 거리는 0, 마법 사용은 안함으로 시작
visited[x][y][0] = True
while queue:
x, y, dist, magic = queue.popleft()
if x == ex - 1 and y == ey - 1:
return dist
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if maze[nx][ny] == 0 and not visited[nx][ny][magic]:
visited[nx][ny][magic] = True
queue.append((nx, ny, dist + 1, magic))
elif maze[nx][ny] == 1 and not magic and not visited[nx][ny][1]:
visited[nx][ny][1] = True
queue.append((nx, ny, dist + 1, 1))
return -1
print(bfs(hx - 1, hy - 1))
처음에 마법 부분을 global 변수로 선언하여 if 문을 통해 마법을 사용하려고 했지만, 아예 틀렸었다. 다른 분들의 풀이를 보고 아예 뜯어 고치게 되었는데, 우선 [x][y][magic] 형태로 배열을 선언하여 마법 사용 여부를 확인하였다. 이 문제는 추후 다시 풀어야겠다.
3. 단지번호붙이기
https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
위 문제에서 호되게 반성하고 쉬워보이는 문제로 넘어왔는데,
n = int(input())
graph = []
for i in range(n):
graph.append(list(map(int, input())))
num = 2
def dfs(x, y):
global num
if x < 0 or x >= n or y < 0 or y >= n:
return False
# 1 부분인 집을 이을때 해당 배열에 1 2 3으로 변수 추가.
if graph[x][y] == 1:
graph[x][y] = num
dfs(x - 1, y)
dfs(x + 1, y)
dfs(x, y + 1)
dfs(x, y - 1)
return True
return False
total = 0
house_cnt = []
for i in range(n):
for j in range(n):
if dfs(i, j) == True:
house_cnt.append(sum(row.count(num) for row in graph))
num += 1
print(len(house_cnt)) # 집 집합의 총 개수
house_cnt.sort() # 집 집합별 집의 수를 정렬하여 출력
for count in house_cnt:
print(count)
이 풀이에서도 단지를 계산하는 간단한 방법을 제대로 생각해내지 못해서 지피티의 도움을 받았다. DFS 와 BFS 를 제대로 풀기 위해 많은 노력이 필요할 것 같다.
'Algorithm' 카테고리의 다른 글
[1일 3알고리즘] Day6 (0) | 2024.04.18 |
---|---|
[1일 3알고리즘] Day5 (0) | 2024.04.17 |
[1일 3알고리즘] Day4 (0) | 2024.04.16 |
[1일 3알고리즘] Day3 (0) | 2024.04.15 |
[1일 3알고리즘] Day2 (0) | 2024.04.12 |
댓글