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()
ps/problems/boj/31220.txt · 마지막으로 수정됨: 2024/01/08 14:42 저자 teferi
토론