Algorithm

[1일 3알고리즘] Day7

  • -
728x90

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
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.