[SWEA/D3] 14413 격자판 칠하기 / for문을 한 번만 사용하는 연습이 필요하다..
문제 바로가기
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
👨🏻💻 내가 풀고 포스팅 했던 백준 1018 체스판 다시 칠하기 문제와 흡사하다.
[백준] 1018 체스판 다시 칠하기 (실버4)
문제요약 나의 코드 및 설명 n, m = map(int,input().split()) #n:세로 m:가로 board = [list(input()) for _ in range(n)] min_cnt = 64 for i in range(n-8+1): #그리드를 이동하면서 체스판 분석 (세로) for j in range(m-8+1): #그리드
hellosonic.tistory.com
나의 코드 및 설명
- "?"에 있는 칸은 "#", "." 중 어떤 것이 와도 상관 없으므로, 고려하지 않아도 된다.
t = int(input())
for test_case in range(1, t+1):
n, m = map(int, input().split()) #n:세로 m:가로
board = [list(input()) for _ in range(n)]
b_cnt = 0 #첫 번째 칸이 "#" 일 때
w_cnt = 0 #첫 번째 칸이 "." 일 때
#먼저 첫 번째 칸이 "#" 일 때,
for i in range(n):
for j in range(m):
if (i+j)%2 == 0: #짝수 인덱스 칸
if board[i][j] == "#":
continue
elif board[i][j] == ".": #"."이 온다면 잘못된 것임.
b_cnt = -1 #-1 저장
break
else: #홀수 인덱스 칸
if board[i][j] == ".":
continue
elif board[i][j] == "#":
b_cnt = -1
break
if b_cnt == -1:
break
#첫 번째 칸이 "#"이 아닐수도 있으니 "."일때도 살펴보자
for i in range(n):
for j in range(m):
if (i+j)%2 == 0: #짝수 인덱스 칸
if board[i][j] == ".":
continue
elif board[i][j] == "#": #"#"이 온다면 잘못된 것임.
w_cnt = -1
break
else: #홀수 인덱스 칸
if board[i][j] == "#":
continue
elif board[i][j] == ".":
w_cnt = -1
break
if w_cnt == -1:
break
if w_cnt == -1 and b_cnt == -1: #만약 두 경우 다 -1 이라면
print("#{} {}".format(test_case, "impossible"))
else:
print("#{} {}".format(test_case, "possible"))
피드백
"#"이 첫 번째 칸으로 오는 경우에 해당하는 for문과 "."이 첫 번째 칸으로 오는 경우에 해당하는 for문. 이렇게 두 개 경우를 따져보고 만약 두 개의 for문에서 break가 걸린다면, 어떠한 경우에도 possible일 수 없다는 점을 활용해서 문제를 해결했다.
즉, 이중 for문을 두 번 사용했는데, 한 번만 사용해서 문제를 해결하는 풀이를 보고도 이해를 잘 하지 못하였다.. 백준의 비슷한 문제인 1018 체스판 다시 칠하기 문제도 다른 사람은 이중 for문을 한 번만 사용해서 잘만 문제를 풀었는데, 나만 두 번 사용했다 ㅠ 이렇게 이해가 안될 때는 반복해서 코드를 작성해보는 것이 나한테 도움이 많이 되는 것 같다. 그 점을 잘 알고 있기에, 틈틈이 문제를 보고 코드를 작성해봐야겠다.