본문 바로가기

컴퓨터/BOJ

[BOJ](Python) 1236번 : 성 지키기

처음에 이 문제를 봤을 때 성을 구현하고 'X'를 추가시킬 때 count += 1하여 count를 출력하는 방법을 이용하고자 했다.

먼저 리스트를 '.'로 초기화 시켰다.

그 뒤, 이중 for loop를 이용하여 X가 있다면 패스, X가 아니라고 할 때 j행과 i열을 함수를 이용해 체크한다.

만약 i열에도, j행에도 'X'가 존재하지 않다면 'X'를 추가시키고 count += 1를 하여 count를 출력하여 추가된 X의 개수를 출력하는 방법을 이용했다. 

 

하지만 주어진 방법은 틀렸는데 그 이유는 다음과 같다.

2행 3열의 성

먼저 2행 3열의 성을 만들고 (0,2)에 'X'를 넣었다 가정해보자.

(0,1)에서 1열에 X가 없으므로 (0,1)에 'X'를 추가,

(0,2)에서 2열에 X가 없으므로 (0,2)에 'X'를 추가,

(0,3)은 'X' 이므로 패스하면 결과는 다음과 같다.

하지만 (1,0)에서 1열에 X가 있어서 열을 체크했을 땐 'X'가 있고, 2행에선 'X'가 없다고 된다.

'X'가 있으면 True, 없으면 False일 때,

check_h = solve_h(i,j); check_y = solve_y(i,j)
    if check_h and check_y:
        pass
    else:
        castle[i][j] = 'X'
        count += 1

(1,0)에 'X'추가 추가되어, 틀리게 된다.

틀린 답(왼쪽)과 정답(오른쪽)

 

def solve_h(n, k): #행 체크
    global a; global b
    soldier = False
    for i in range(b):
        if i == k:
            continue
        elif castle[n][i] == '.':
            pass
        else:
            soldier = True

    return soldier

def solve_y(n, k):
    global a; global b
    soldier = False
    for j in range(a):
        if j == n:
            continue
        elif castle[j][k] == '.':
            pass
        else:
            soldier = True

    return soldier 

a,b = map(int, input().split())
castle = []; count = 0
for _ in range(a):
    castle.append(list(input()))
for i in range(a):
    for j in range(b):
        if castle[i][j] == 'X':
            continue
        check_h = solve_h(i,j); check_y = solve_y(i,j)
        if check_h and check_y:
            pass
        else:
            castle[i][j] = 'X'
            count += 1
print(count)

이 문제의 경우 굳이 구현을 할 필요가 없었고,

영식이는 모든 행과 모든 열에 한 명 이상의 경비원이 있으면 좋겠다고 생각했다.

이므로, 행만 봤을 때 'X'를 추가해야 하는 개수, 열을 봤을 때 'X'를 추가해야 하는 개수를 비교하고 그 큰값을 출력하면 된다.

 

만약 3행 5열의 성이 있고 배치된 경비원이 없을 때, 3개의 행에 경비원을 추가시키면 2개의 열에 경비원이 배치되지 않는다. 하지만, 반대로 5개의 열에 경비원을 추가시킨다면 모든 행에도 경비원을 추가시킬 수 있으므로 답은 5가 된다.

 

따라서, 주어진 행의 개수에서 경비원이 배치된 행의 수를 뺀 값과, 주어진 열의 개수에서 경비원이 배치된 열의 수를 비교하여 그 큰값을 출력하면 된다.

 

a,b = map(int, input().split())
castle = []; count = 0
for _ in range(a):
    castle.append(list(input()))
row = 0; column = 0
for i in range(a):
    temp = castle[i]
    if temp.count('.') == len(temp):
        row += 1
    else: pass
for i in range(b):
    temp = []
    for j in range(a):
        temp.append(castle[j][i])
    if temp.count('.') == len(temp):
        column += 1
    else:
        pass
print(max(row, column))

행에서 '.'의 개수가 그 행의 리스트의 개수와 같다면 주어진 행에서 경비원은 배치되어 있지 않기 때문에 row += 1로 행 기준 경비원을 배치하면 되고, 열도 마

찬가지로 계산하면 된다.