Baekjoon/구현

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

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 함수 등 배워가는게 많았던 문제. 다음에는 혼자 힘으로 풀 수 있는지 다시 한 번 확인해 봐야겠다.

'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
'Baekjoon/구현' 카테고리의 다른 글
  • 🥇[백준] 2638 치즈 (골드3) / 구현, 시간초과 해결, 문제 아이디어
  • 🥇[백준] 16234 인구 이동 (골드5) / 구현, 시간초과 해결
  • [백준] 16918 봄버맨 (실버1) / 구현, 시뮬레이션
  • [백준] 1946 신입 사원 (실버1)
hellosonic
hellosonic
꾸준함hellosonic 님의 블로그입니다.
hellosonic
꾸준함
hellosonic
전체
오늘
어제
  • 분류 전체보기 (285)
    • SSAFY (4)
    • 프로그래머스 데브코스 (26)
    • Diary (1)
    • JavaScript (20)
    • ToyPJ (13)
      • Python-Django (13)
    • CS지식 (11)
      • 자료구조 (5)
      • 개발 상식 (2)
      • 네트워크 (4)
    • Baekjoon (141)
      • IM Level (57)
      • DFS와 BFS (21)
      • 백트래킹 (21)
      • DP (3)
      • 이분탐색 (4)
      • 구현 (14)
    • Programmers (13)
      • Lv1 (4)
      • Lv2 (9)
    • SWEA (SW Expert Academy) (52)
      • D1 (5)
      • D2 (7)
      • D3 (40)
    • 이코테 (4)
    • Grammar (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기
  • 관리자

공지사항

인기 글

태그

  • javascript ux
  • 백준 14891
  • 파이썬 1946
  • 구현
  • 파이썬
  • 파이썬 2529
  • SWEA D3
  • 백준
  • SWEA D2
  • JS
  • SWEA/D3
  • 리액트 todolist
  • 그리디
  • 백준 2999
  • 프로그래머스
  • 코딩부트캠프
  • 백준 5212
  • 백준 18870
  • 파이썬 1269
  • 이코테
  • 프론트엔드 데브코스
  • SWEA
  • 자바스크립트 기본기
  • 자바스크립트
  • 백준 1157
  • SWEA 파이썬
  • 파이썬 1436
  • 국비지원교육
  • 프로그래머스 데브코스
  • 파이썬 11478

최근 댓글

최근 글

hELLO · Designed By 정상우.
hellosonic
[백준] 5212 지구 온난화 (실버2) / import copy, list2 = copy.deepcopy(list1), 다시한번 풀어보자
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.