• TOC {:toc}

이 글은 백준 온라인 저지의 1236번 문제를 파이썬(Python)으로 풀이한 것을 모아놓은 글입니다.

일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.

2021.05.19

| 메모리 | 시간 | 코드 길이 | | ——— | —– | ——— |] | 28776 KB | 80 ms | 217 B |

단계 시작 시각 끝난 시각 걸린 시간
문제 이해 1 19:34:31 19:35:28
풀이 생각 1 19:35:30 19:36:42
코딩 1 19:37:05 19:39:43
문제 이해 2 19:40:01 19:40:46
풀이 생각 2 19:40:48 19:43:12
코딩 2 19:43:13 19:49:02
디버깅 19:49:23 19:52:02
N, M = map(int, input().split())
R, C = set(), set()

count = 0
for i in range(N):
    for j, x in enumerate(input()):
        if x == "X":
            C.add(j)
            R.add(i)

print(max(N - len(R), M - len(C)))

아이디어 & 풀이

X가 존재하는 행과 열 정보를 집합에 저장한 뒤 원소의 개수와 N, M을 비교한다.

행과 열 중에 더 많은 것을 출력한다.

디버그

  • 주어진 .사이에 공백이 있는 줄 알고 split()을 썼더니 틀렸다.

참고 답안 1

# 풀이 1-1
N, M = map(int, input().split(" "))
A, B = N, M

C = [list(input()) for _ in range(N)]

for i in range(N):
    if "X" in C[i]:
        A -= 1

for i in range(M):
    for j in range(N):
        if C[j][i] == "X":
            B -= 1
            break

print(max(A, B))

# 풀이 1-2
N, M = map(int, input().split())
# 입력받은 각 행을 원소로 갖는 리스트를 C를 만든다.
C = [input() for i in [0] * N]
print(
    max(
        # [1 for i in C if "X" in i]: 
            # C의 원소(각 행)에 대해
            # X가 그 안에 존재하면 1을 반환한
            # 리스트의
        # N - sum(...): 원소 합(i.e., X가 존재하는 행의 개수)을 N에서 뺀 값과
        N - sum([1 for i in C if "X" in i]),
        # [1 for i in range(M)]: 0부터 M - 1까지의 인덱스 i에 대해서
            # [1 for j in range(N) if C[j][i] == "X"]:
                # 0부터 N - 1까지의 인덱스 j를 순회했을 때
                # i번째 열, 각 행 j의 값이 X이면
                # 1을 반환한다.
            # if [...]: 주어진 리스트의 원소가 존재하면
            # 1을 반환한 리스트의
        # M - sum(...): 원소 합(i.e., X가 존재하는 열의 개수)을 M에서 뺀 값 중
        M - sum([1 for i in range(M) if [1 for j in range(N) if C[j][i] == "X"]]),
    )
) # 최댓값을 출력한다.

참고 답안 2

# 풀이 2-1
N, M = map(int, input().split())
V, W = [1] * N, [1] * M
for i in range(N):
    for j, v in enumerate(input()):
        if v != ".":
            V[i] = W[j] = 0
print(max(sum(V), sum(W)))

# 풀이 2-2
N, M = map(int, input().split())
A = [0] * N
B = [0] * M

L = [input() for i in range(N)]
for i in range(N):
    for j in range(M):
        if L[i][j] == "X":
            A[i] = 1
            B[j] = 1
print(max(A.count(0), B.count(0)))

참고 답안 3

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
# for _ in range(N): N 번에 걸쳐
# [i == "." for i in input().rstrip()]]:
    # 입력받은 행의 각 문자가
    # .이면 True를 반환한 리스트를
# 원소로 갖는 리스트 C를 만든다.
C = [[i == "." for i in input().rstrip()] for _ in range(N)]

# C의 원소인 리스트 x에 대해
    # 각 원소가 모두 True이면
    # (한 행이 모두 .으로 이루어져 있으면)
    # True를 반환한다.
# C 원소의 합(i.e., True의 개수)을 A에 담는다.
A = sum(all(x) for x in C)
# 동일한 과정을 zip(*C)에 대해 반복해 B에 담는다.
    # *C: C를 언 패킹 하면 각 행 리스트의 나열이 되고
    # zip(): 이를 zip 함수로 넘기면 각 열끼리 묶인 리스트가 된다.
B = sum(all(x) for x in zip(*C))
# A와 B 중 더 큰 값을 출력한다.
print(max(A, B))

아이디어 & 풀이

각 행으로 만든 리스트를 zip()을 이용해 각 열로 이루어진 리스트로 바꿀 수 있다.