- 백준2143- python (gold 3)2023년 05월 21일
- 2료일
- 작성자
- 2023.05.21.오후03:27
https://www.acmicpc.net/problem/2143
2143번: 두 배열의 합
첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1 ≤ m ≤ 1,000)이 주어지고, 그
www.acmicpc.net
처음에 n개의 숫자가 나오고 m개의 숫자가 나오는데 거기 있는 것들의 합으로 t를 만드는게 목표이다. 이 문제를 보고 뭔가 동전들로 금액맞추기가 떠올랐다.
처음에 Nlist, Mlist를 받으면 거기서 가능한 모든 조합을 정리하고 값들을 dict으로 만들어 주었다. 왜냐하면 시간복잡도가 O(1)이기에
for문을 두번돌면서 가능한 부배열들의 합 들을 ndict에 넣어주고 key값이 이미있으면 value를 1증가시켜주었다.
마지막 answer를 구해주는 코드는 매우 짧다.
하나씩 ndict의 키값을 돌면서 만약 mkey값과 더한게 t면 answer에 그만큼 더해주는데 해당하는 value들의 곱을 더해준다. 왜냐하면
만약 키값이 4인 value가 3이라면 이 뜻은 여기안에 1,3. 2,2. 4이런식으로 존재한다는 뜻이기에 각각의 조합을 만들수 있기 때문이다.
전체적인 시간복잡도는 ndict를 만들어주는 것에서 O(n2)이 소요된다.
t = int(input()) n = int(input()) nlist = list(map(int,input().split())) m = int(input()) mlist = list(map(int,input().split())) ndict = {} mdict = {} answer = 0 for i in range(n): for j in range(i+1, n+1): tmp = sum(nlist[i:j]) if tmp in ndict: ndict[tmp] += 1 else: ndict[tmp] = 1 for i in range(m): for j in range(i+1, m +1): tmp = sum(mlist[i:j]) if tmp in mdict: mdict[tmp] += 1 else: mdict[tmp] = 1 for nkey in ndict.keys(): if t-nkey in mdict.keys(): answer += ndict[nkey] * mdict[t-nkey] print(answer)
'알고리즘' 카테고리의 다른 글
백준 1644- 소수의 연속합(PYTHON) (1) 2023.05.27 17142-python풀이 (0) 2023.05.22 1043-python (1) 2023.05.11 [프로그래머스]-이모티콘할인행사(swift) (0) 2023.05.04 알고리즘 2023kakaoblind-개인정보 수집 유효기간(python) (0) 2023.04.30 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)