Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- NumPy
- 코테
- 코딩테스트실력진단
- 코드트리
- 차원축소
- 합성곱 신경망
- 넘파이 기초
- java
- Machine Learning
- 기계학습
- numpy 기초
- cpp
- c++
- 머신러닝
- 자바
- 클러스터링
- OOP
- ack
- 파이썬
- cpp class
- 데이터 분석
- 디자인 패턴
- 넘파이
- 데이터 마이닝
- lambda
- 넘파이 배열
- 네트워크 기초
- python
- 코딩테스트
- Design Pattern
Archives
- Today
- Total
준비하는 대학생
[코드트리 챌린지] 2주차 - HashMap / 원소의 합이 0 본문
문제 분석:
이 문제는 네 개의 수열 A, B, C, D에서 각 수열에서 한 원소씩 선택하여 합한 값이 0이 되는 조합의 수를 찾는 문제입니다. 일반적으로 모든 조합을 시도하여 문제를 해결한다면, 시간 복잡도는 O(n^4)이 되어 n=5000의 최대 크기에서는 시간 내에 해결이 어렵습니다.
따라서 효율적인 방법을 찾아야 합니다. 이 문제의 핵심 아이디어는 두 개의 수열을 묶어서 처리하는 것입니다. A와 B의 조합, 그리고 C와 D의 조합으로 나누어 각 조합에서 나올 수 있는 합의 빈도수를 계산합니다. 이후 A와 B의 조합에서 나온 합과 C와 D의 조합에서 나온 합이 서로 반대 부호이고 절대값이 같은 경우를 찾아서 그 경우의 수를 합산하면 됩니다.
풀이 방법:
- 빈도수 계산: 두 수열 A와 B를 돌면서 각 원소의 합의 빈도수를 딕셔너리에 저장합니다. 이를 seq_dicts_A에 저장합니다.
- 빈도수 계산: 마찬가지로 두 수열 C와 D를 돌면서 각 원소의 합의 빈도수를 딕셔너리에 저장합니다. 이를 seq_dicts_B에 저장합니다.
- 서로 반대 부호의 합 찾기: seq_dicts_A에서 나온 합과 seq_dicts_B에서 나온 합 중 서로 반대 부호이고 절대값이 같은 경우를 찾아 그 경우의 수를 합산합니다.
코드
n = int(input())
seq_dicts_A = [{}, {}]
seq_dicts_B = [{}, {}]
cnt = 0
# A와 B의 원소 빈도수 계산
for i in range(2):
for n in list(map(int,input().split())):
if n in seq_dicts_A[i]:
seq_dicts_A[i][n] += 1
else:
seq_dicts_A[i][n] = 1
# C와 D의 원소와 A, B의 원소 합의 빈도수 계산
for i in range(2):
for n in list(map(int,input().split())):
for n2 in seq_dicts_A[i]:
if n + n2 in seq_dicts_B[i]:
seq_dicts_B[i][n+n2] += seq_dicts_A[i][n2]
else:
seq_dicts_B[i][n+n2] = seq_dicts_A[i][n2]
# 합이 0이 되는 경우의 수 계산
for n in seq_dicts_B[0]:
if n*-1 in seq_dicts_B[1]:
cnt += seq_dicts_B[1][n*-1]*seq_dicts_B[0][n]
print(cnt)
코드 설명:
- seq_dicts_A와 seq_dicts_B는 각각 A와 B의 합, C와 D의 합의 빈도수를 저장하는 딕셔너리입니다.
- A와 B의 원소들의 합의 빈도수를 계산하여 seq_dicts_A에 저장합니다.
- C와 D의 원소들의 합의 빈도수를 계산하여 seq_dicts_B에 저장합니다.
- seq_dicts_A의 각 합에 대해 seq_dicts_B에서 그 합의 반대 부호의 빈도수를 찾아 그 빈도수만큼 경우의 수를 합산합니다.
이 풀이의 시간 복잡도는 대략 O(n^2)입니다. 각 수열에서의 조합을 계산하는 데 O(n^2)의 시간이 걸리고, 딕셔너리에서 키를 찾는 데 걸리는 시간은 평균적으로 O(1)입니다. 따라서 전체 시간 복잡도는 O(n^2)으로, n=5000의 최대 크기에서도 충분히 빠른 시간 내에 문제를 해결할 수 있습니다.
위의 문제를 풀어보고 지난 실력 진단에서 나의 부족한 점을 공부하고 다시 시험을 치니 높은 점수를 얻을 수 있었다. 남은 6주동안 더 많은 공부를 해봐야겠다.
'Algorithm > 코드트리 블로그 챌린지' 카테고리의 다른 글
[코드트리 챌린지] 5주차 - Parametric Search / 최소 통과 시간 (1) | 2023.10.07 |
---|---|
[코드트리 챌린지] 4주차 - 이진탐색 / 컴퓨터와 함께하는 숫자 게임 2 (0) | 2023.10.01 |
[코드트리 챌린지] 3주차 - +1-1 Technique / 가장 많이 겹치는 구간 (0) | 2023.09.24 |
[코드트리 챌린지] 1주차 - 자리 수 단위로 완전탐색 / Carry 피하기 2 (0) | 2023.09.06 |
Comments