ps:problems:boj:23116
AND
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 23116 |
문제명 | AND |
레벨 | 골드 1 |
분류 |
애드혹 |
시간복잡도 | O(∑n) |
인풋사이즈 | ∑n<=10^5 |
사용한 언어 | Python 3.11 |
제출기록 | 43244KB / 324ms |
최고기록 | 324ms |
해결날짜 | 2023/08/22 |
풀이
- 비트연산의 특징을 이용하는 애드혹 문제.
- 아이디어를 떠올리는데 예제가 많은 도움을 준다
- 결과 어레이에 있는 숫자들을 모두 포함해서 원래 어레이를 구성한다면, 숫자 한개 한개도 서브어레이가 되므로 결과 어레이의 숫자들을 모두 만들어낼수 있다. 문제는 결과 어레이에 포함되지 않는 숫자들까지 생성이 되는 것인데 이를 피할 방법을 찾아야 한다. 만약 결과 어레이에 0이 포함되어 있다고 하자. [0, b1, b2, …, bn] 이 결과 어레이라면, 원래 어레이를 [b1, 0, b2, 0, b3, …, 0, bn] 처럼 구성한다면, 모든 크기 2이상의 서브어레이는 AND값이 0이 되므로 결과어레이에 없는 숫자를 생성하지 않으므로, 답이 될수 있다.
- 그러면 조금만 더 생각해서, 결과 어레이에 0이 없다면? 대신 모든 숫자를 AND한 값 b1&b2&..&bn = K 을 구해서 그 값을 0처럼 생각해보자. [b1, K, b2, K, b3, …, K, bn] 로 구성하면, 모든 subarray의 AND값으로 나오는 결과는 b1,…,bn, K 밖에 없다. K가 bi 중에 포함되어 있다면 이렇게 구성해서 답을 찾을수 있다.
- 그리고 K값이 bi 중에 포함이 되지 않는다면.? 어떤식으로 원래 어레이를 만들더라도 서브어레이의 AND값들이 모든 bi를 만들수 있다면, 원래 어레이의 모든 원소를 AND한 값은 K가 될수밖에 없다. 이 말은, K값이 bi중에 포함이 되지 않는다면, 이러한 결과 어레이를 만들수 있는 원래 어레이는 존재하지 않는다는 뜻이다. 이 경우에는 그냥 -1을 찍어주면 끝이다
- 시간복잡도는 O(n)에 처리된다.
코드
"""Solution code for "BOJ 23116. AND".
- Problem link: https://www.acmicpc.net/problem/23116
- Solution link: http://www.teferi.net/ps/problems/boj/23116
Tags: [ad hoc]
"""
import sys
import functools
import operator
def main():
t = int(sys.stdin.readline())
for _ in range(t):
n = int(sys.stdin.readline())
b = [int(x) for x in sys.stdin.readline().split()]
andsum = functools.reduce(operator.and_, b)
if andsum not in b:
print('-1')
else:
answer = [andsum] * (n * 2)
answer[::2] = b
print(len(answer))
print(*answer)
if __name__ == '__main__':
main()
ps/problems/boj/23116.txt · 마지막으로 수정됨: 2023/08/22 14:18 저자 teferi
토론