[백준 3273번] 두 수의 합

2021. 10. 6. 22:37·알고리즘 문제풀이/백준
반응형

문제 링크:https://www.acmicpc.net/problem/3273

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net

 

<문제 풀이>

시간제한이 1초이고 N < 10^6 이므로 O(N^2) 풀이는 시간 초과입니다.

 

수열을 하나씩 꺼내보면서, 꺼낸 수와 합이 X가 되도록 하는 수열 내의 다른 어떤 수가 존재하는지 확인할 수 있으면 O(N)의 시간 복잡도로 문제를 해결할 수 있습니다.

 

수열에서 하나씩 꺼내서 X에서 뺀 뒤 그 수가 수열 내에 존재하는지 확인하면 됩니다.

-> a1 + a2 = X

    a2 = X - a1

 

문제 입력을 예로 들면

9

5 12 7 10 9 1 2 3 11

13

 

1) 5 -> 13(X) - 5 = 8 

2) 12 -> 13(X) - 12 = 1

3) 7 -> 13(X) - 7 = 6 

4) 10 -> 13(X) - 10 = 3

5) 9 -> 13(X) - 9  = 4

6) 1 -> 13(X) - 1  = 12

7) 2 -> 13(X) - 2  = 11

8) 3 -> 13(X) - 3  = 10

9) 11 -> 13(X) - 11  = 2

 

꺼낸 수가 등장한 수인지를 체크하는 배열을 만들고 입력받은 데이터를 순회하면서 

1. X - data가 이전에 등장했다면 카운트. 9) 11 -> 13(X) - 11 = 2  : 2는 7)에서 등장한 수로 체크함

2. 꺼낸 수는 등장한 수 배열에 체크해줍니다.  

 

X - data가 음수가 나올 수도 있음(배열 런타임 에러)

 

<C++ 소스 코드>

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
#include <iostream>
#include <vector>
using namespace std;
 
bool flag[2000001];
 
int main(void){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    vector<int> v;
    int n; cin>>n;
    for(int i=0; i<n;i++){
        int data; cin>>data;
        v.push_back(data);
    }
    int x; cin>>x;
    
    int cnt = 0;
 
    for(auto &data : v){
        if(x >= data && flag[x - data]) cnt++;
        flag[data] = true;
    }
    cout<<cnt;
    
    return 0;
}
Colored by Color Scripter
cs
반응형
저작자표시 (새창열림)

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 6198번] 옥상 정원 꾸미기  (0) 2021.10.21
[백준 2493번] 탑  (2) 2021.10.15
[백준 10871번] X보다 작은 수  (0) 2021.10.02
[백준 1197번] 최소 스패닝 트리  (0) 2020.07.26
[백준 4256번] 트리  (0) 2020.07.18
'알고리즘 문제풀이/백준' 카테고리의 다른 글
  • [백준 6198번] 옥상 정원 꾸미기
  • [백준 2493번] 탑
  • [백준 10871번] X보다 작은 수
  • [백준 1197번] 최소 스패닝 트리
슥지니
슥지니
개발 블로그
  • 슥지니
    슥지니의 코딩노트
    슥지니
  • 전체
    오늘
    어제
    • 분류 전체보기 (199)
      • 알고리즘 문제풀이 (158)
        • 백준 (158)
      • 알고리즘 (6)
      • Node.js (2)
        • MongoDB (1)
        • 기타 (1)
      • spring (0)
      • 가상화폐 (1)
        • 바이낸스(Binance) (1)
      • C++ 테트리스 게임 (1)
      • C++ (10)
      • 안드로이드 프로그래밍 (21)
        • 코틀린 (21)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Kotlin
    알고리즘
    자료구조
    콘솔 테트리스 게임
    그리디
    구현
    우선순위 큐
    BFS
    C++
    dfs
    백트랙킹
    코틀린
    dp
    시뮬레이션
    다이나믹 프로그래밍
    백준
    콘솔
    C
    그래프
    코틀린을 활용한 안드로이드 프로그래밍
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
슥지니
[백준 3273번] 두 수의 합
상단으로

티스토리툴바