문제요약
나의 코드 및 설명 (틀림..)
- 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 함수 등 배워가는게 많았던 문제. 다음에는 혼자 힘으로 풀 수 있는지 다시 한 번 확인해 봐야겠다.
'Baekjoon > 구현' 카테고리의 다른 글
🥇[백준] 11559 Puyo Puyo (골드4) / 구현 (0) | 2023.06.23 |
---|---|
🥇[백준] 2638 치즈 (골드3) / 구현, 시간초과 해결, 문제 아이디어 (0) | 2023.06.22 |
🥇[백준] 16234 인구 이동 (골드5) / 구현, 시간초과 해결 (0) | 2023.06.22 |
[백준] 16918 봄버맨 (실버1) / 구현, 시뮬레이션 (0) | 2023.06.15 |
[백준] 1946 신입 사원 (실버1) (0) | 2023.06.13 |