사용자 도구

사이트 도구


ps:problems:boj:31220

연결된 지배 집합

ps
링크acmicpc.net/…
출처BOJ
문제 번호31220
문제명연결된 지배 집합
레벨골드 2
분류

애드혹

시간복잡도O(nm)
인풋사이즈n<=1000, m<=1000
사용한 언어Python 3.11
제출기록31252KB / 44ms
최고기록44ms
해결날짜2024/01/08

풀이

  • 연결된 지배 집합이라는 용어 자체가 복잡해 보이지만, 이해하고 나면 만들어야 할것은 명확하다.
  • 간단하게 출발하는 방법은 홀수행은 모두 0으로, 짝수행은 모두 1로 채우는 것이다. 이렇게 하면 모든 칸들이 인접 4칸 중에 반드시 1로 채운 칸을 갖게 되고, 1의 갯수도 전체의 절반 이하가 되기는 한다.
  • 하지만 이렇게 만들면 1들이 모두 연결되어있지 않으므로, 모두 연결하기 위해서는 한 열을 선택해서 전부 1로 채워줄 필요가 있다. 이렇게 되면 이제 연결은 되지만, 1의 갯수가 절반 이하라는 조건을 충족시키지 못한다.
  • 이것을 해결하는 방법은 여러가지가 있다. 나는 처음에는 2,4,6,.. 번째 행을 1로 채우는 대신에 2,5,8,… 번째 행을 1로 채우는 방식으로 바꿔서 1의 사용 갯수를 줄이려고 시도했다. 하지만 이 방법으로 결국 AC를 받기는 했지만, 이 과정에서 너무 많은 케이스워크와 디버깅이 필요했다.
  • 뒤늦게 발견한 좀더 깔끔하게 짜는 방법은, 홀수번째 행은 00…0010 으로, 짝수번째 행은 11…1110 로 채우는 것이다. 두 행을 합치면 1의 갯수가 정확히 절반이 되므로, 복잡한 케웍 없이도 간단히 증명과 구현을 할수 있다.

코드

"""Solution code for "BOJ 31220. 연결된 지배 집합".

- Problem link: https://www.acmicpc.net/problem/31220
- Solution link: http://www.teferi.net/ps/problems/boj/31220

Tags: [ad hoc]
"""


def main():
    n, m = [int(x) for x in input().split()]

    row = ['0' * (m - 2) + '10', '1' * (m - 1) + '0']

    print('YES')
    for i in range(n):
        print(row[i % 2])


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
P Q B J O
 
ps/problems/boj/31220.txt · 마지막으로 수정됨: 2024/01/08 14:42 저자 teferi