Baekjoon/구현

[백준] 5212 지구 온난화 (실버2) / import copy, list2 = copy.deepcopy(list1), 다시한번 풀어보자

hellosonic 2023. 6. 16. 15:58

문제요약

나의 코드 및 설명 (틀림..)

  • 50년 후의 지도를 초기화 해두고, 현재 지도의 부분 중 섬인 부분을 방문하여 주변을 둘러싼 바다의 개수를 카운트한 후 50년 후의 지도에 저장하는 식으로 문제를 풀었다. 하지만 풀리지 않았다. 
  • 지도의 크기를 줄이는 과정에서 잘못되었나, 섬이 아무것도 없는 경우는 없어서 그런가 하고 여러가지 방법을 5~6번 정도 시도했지만  결국 혼자 힘으로는 풀지 못했다.. ㅠ
r, c = map(int, input().split()) #r*c
board = [list(input()) for _ in range(r)]

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

after = [["."] * c for _ in range(r)] #50년 후의 지도를 정보

for y in range(r):
    for x in range(c):
        if board[y][x] == "X": #현재 지도의 부분 중 섬인 부분
            cnt = 0 #섬을 둘러싼 바다의 개수 카운트
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                if 0<=nx<c and 0<=ny<r:
                    if board[ny][nx] == ".": #만약 "."이라면 바다개수 +1
                        cnt += 1
                else: #범위를 벗어나는 곳이라면 바다개수 +1
                    cnt += 1

            if cnt <= 2: #바다의 개수가 2이하이면 50년 후에도 그곳은 섬이 있다.
                after[y][x] = "X"

#지도의 크기 줄이기
result = []

for y in range(r):
    if after[y].count(".") == c:
        continue
    else:
        result.append(after[y])

start_idx = c-1 
end_idx = 0

for x in range(c):
    for y in range(len(result)):
        if result[y][x] == "X":
            if start_idx > x:
                start_idx = x
            if end_idx < x:
                end_idx = x

for i in range(len(result)):
    print("".join(map(str,result[i][start_idx:end_idx+1])))

다른 코드 및 설명

  • copy 라이브러리의 deepcopy 함수를 통해서 현재 지도를 50년 후의 지도에 그대로 복사한 후, 3면 이상이 바다로 둘러쌓인 섬을 찾아서 50년 후의 지도에 바다로 갱신해준다.
import copy

r, c = map(int, input().split()) #r*c
board = [list(input()) for _ in range(r)]

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

after = copy.deepcopy(board) #현재 지도를 50년 후의 지도에 그대로 복사
land_cnt = 0 #섬의 개수 카운트
for y in range(r):
    for x in range(c):
        if board[y][x] == "X":
            cnt = 0
            land_cnt += 1 
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                if 0<=nx<c and 0<=ny<r:
                    if board[ny][nx] == ".":
                        cnt += 1
                else:
                    cnt += 1

            if cnt >= 3: #삼면 이상이 바다로 둘러쌓여 있다면,
                after[y][x] = "." #50년 후의 지도를 바다로 갱신
                land_cnt -= 1 #섬의 개수 - 1


#줄이기

if land_cnt == 0: #섬이 하나도 없다면, 
    print("X") #그냥 X 출력

else:
    #위에서부터 체크
    r_start = 0
    r_end = 0
    for i in range(r):
        if "X" in after[i]:
            r_start = i
            break

    #아래에서부터 체크
    for i in range(r-1, -1, -1):
        if "X" in after[i]:
            r_end = i
            break

    #가로 체크
    idx = []
    for x in range(c):
        for y in range(r_start, r_end+1):
            if after[y][x] == "X": #열에 하나라도 섬이 있으면
                idx.append(x) #x좌표를 저장하고
                break #반복문 탈출

    for i in after[r_start:r_end+1]:
        print("".join(i[idx[0]:idx[-1]+1]))

피드백

간단하게 풀 수 있을 줄 알았는데, 어디서 잘못된 건지 몰라서 많이 헤맸다. 현재 지도 정보를 기반으로 50년 후의 지도를 표시해야되기 때문에 copy 라이브러리의 deepcopy 함수를 통해 복사해서 사용을 했고, 정답 판정을 받을 수 있었다. 분명 테스트케이스들은 다 맞는데 왜 틀리는지 몰라서 많이 고생했지만, deepcopy 함수 등 배워가는게 많았던 문제. 다음에는 혼자 힘으로 풀 수 있는지 다시 한 번 확인해 봐야겠다.