C++ λˆ„μ ν•©

2023. 2. 10. 23:35γ†πŸ“š Algorithm/πŸ‘€ C++ 문제 풀이

λ°˜μ‘ν˜•

μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό 풀닀보면 μ’…μ’… for λ¬Έ λŒ€μ‹  'λˆ„μ ν•©'을 μ‚¬μš©ν•΄μ•Όν•˜λŠ” λ¬Έμ œκ°€ λ‚˜μ˜¨λ‹€

 

λˆ„μ ν•©μ΄λž€?

- μš”μ†Œλ“€μ΄ λˆ„μ λœ ν•©μœΌλ‘œ, μ–΄λ–€ 배열을 기반으둜 μš”μ†Œλ“€μ˜ λˆ„μ λœ 합을 μ €μž₯ν•΄ μƒˆλ‘œ 배열을 λ§Œλ“€μ–΄ 이λ₯Ό ν™œμš©ν•˜λŠ” 방법

- μ•žμ—μ„œ λ”ν•˜λŠ” prefix sum (주둜 μ½”λ”©ν…ŒμŠ€νŠΈμ—μ„œλŠ” prefix sum만 λ‚˜μ˜΄!!)

- λ’€μ—μ„œ λ”ν•˜λŠ” suffix sum

 

 

prefix sum λ§Œλ“€ λ•Œ μ£Όμ˜ν•΄μ•Ό ν•  점

- 0번째 μš”μ†ŒλŠ” λΉ„μ›Œλ‘κ³  1번째 μš”μ†ŒλΆ€ν„° μ‚¬μš©ν•˜μž

psum[1] -> 0, 1

psum[2] -> 0,1,2

psum[3] -> 0, 1,2,3

psum[4] -> 0,1,2,3,4

 

λˆ„μ ν•©μ„ μ½”λ“œλ‘œ κ΅¬ν˜„ν•΄λ³΄μž!

for(int i = 1; i <= n; i++) {
	cin >> a[i];
	psum[i] = psum[i-1] + a[i];
}

for(int i = 0; i < m; i++) {
	cin >> b >> c;
	cout << psum[c] - psum[b-1] << '\n';
}

 

 

λ°±μ€€ λˆ„μ ν•© μ—°μŠ΅ 문제 2559. μˆ˜μ—΄

 

2559번: μˆ˜μ—΄

첫째 μ€„μ—λŠ” 두 개의 μ •μˆ˜ Nκ³Ό Kκ°€ ν•œ 개의 곡백을 사이에 두고 μˆœμ„œλŒ€λ‘œ 주어진닀. 첫 번째 μ •μˆ˜ N은 μ˜¨λ„λ₯Ό μΈ‘μ •ν•œ 전체 λ‚ μ§œμ˜ μˆ˜μ΄λ‹€. N은 2 이상 100,000 μ΄ν•˜μ΄λ‹€. 두 번째 μ •μˆ˜ KλŠ” 합을 κ΅¬ν•˜κΈ°

www.acmicpc.net

λˆ„μ ν•© 문제λ₯Ό for 문을 μ΄μš©ν•΄μ„œ ν’€λ©΄?

#include <bits/stdc++.h>

using namespace std;


int main() {
  int n, k, m;
  cin >> n >> k;
  string s;
  vector<int> numbers;
  for (int l = 0; l < n; l++) {
    cin >> m;
    numbers.push_back(m);
  }
  int max = -9999999;
  for (int i = 0; i <= numbers.size() - k; i++) {
    int sum = 0;
    for (int j = i; j < i + k; j++) {
      sum += numbers[j];
    }
    if (sum >= max) {
      max = sum;
    }
  }
  cout << max;
  return 0;
}

N 이 2 ~ 100,000 μ΄ν•˜ μ΄λ―€λ‘œ, μœ„μ˜ μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜κ²Œλ˜λ©΄ λΉ…μ˜€κ°€ N^2 κ°€ λ˜λŠ”λ° 

10000000000 둜 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•˜κ²Œ λœλ‹€

 

λˆ„μ ν•©μ„ μ΄μš©ν•΄μ„œ ν‘Όλ‹€λ©΄?

#include <bits/stdc++.h>

using namespace std;

int main() {
  int n, k, m;
  cin >> n >> k;
  string s;
  int num[100004];
  int psum[100004];
  for (int i = 1; i <= n; i++) {
    cin >> num[i];
    psum[i] = psum[i-1] + num[i];
  }
  int maximum[100004];
  int largest = -1000000;
  for (int i = k; i <= n; i++) {
      largest = max(largest, psum[i]-psum[i-k]);
  }
  cout << largest << '\n';
  return 0;
}

N 보닀 큰 λ°°μ—΄ maximum을 λ§Œλ“€μ–΄ 놓고,

n 만큼 for 문을 돌며, 미리 μ €μž₯ν•΄λ…Ό λˆ„μ ν•©μ„ 톡해 μ—°μ†λœ 수의 합을 κ΅¬ν•œλ‹€

λΉ…μ˜€ N 으둜 μΆ•μ†Œλ˜μ–΄ μ‹œκ°„ 초과λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€!

 

 

 

λ°±μ€€ 더 λ§Žμ€ λˆ„μ ν•© 문제

 

문제 - 1 νŽ˜μ΄μ§€

 

www.acmicpc.net

 

λ°˜μ‘ν˜•