SWEA (SW Expert Academy)/D3

[SWEA/D3] 14413 격자판 칠하기 / for문을 한 번만 사용하는 연습이 필요하다..

hellosonic 2023. 5. 9. 23:55

문제 바로가기

 

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문을 한 번만 사용해서 잘만 문제를 풀었는데, 나만 두 번 사용했다 ㅠ 이렇게 이해가 안될 때는 반복해서 코드를 작성해보는 것이 나한테 도움이 많이 되는 것 같다. 그 점을 잘 알고 있기에, 틈틈이 문제를 보고 코드를 작성해봐야겠다.