배열, 리스트, 벡터
2024. 4. 30. 16:54 - pingu-s
숫자의 합 구하기
https://www.acmicpc.net/problem/11720
#include <iostream>
using namespace std;
int main() {
int N = 0;
string numbers;
cin >> N;
cin >> numbers;
int sum = 0;
for (int i = 0; i < numbers.length(); i++) {
// numbers[i]를 정수로 계산하여 sum에 누적하기
sum += numbers[i] - '0';
}
cout << sum << "\n";
return 0;
}
// string형 -> 숫자형(int, long, double, float) 형 변환
#inlcude <string> // 헤더 파일 추가
string sNum = "1234";
string sNum_d = "1234.56";
int inum = stoi(sNum);
long lnum = stol(sNum);
double dnum = stod(sNum_d);
float fnum = stof(sNum_d);
// 숫자형(int, long, double, float) -> string형 형 변환
#inlcude <string> // 헤더 파일 추가
int inum = 1234;
long lnum = 1234;
double dnum = 1234.56;
float fnum = 1234.56f;
string intToString = to_string(inum);
string longToString = to_string(lnum);
string doubleToString = to_string(dnum);
string floatToString = to_string(fnum);
평균 구하기
https://www.acmicpc.net/problem/1546
#include <iostream>
using namespace std;
int main() {
int N = 0;
int A[1000];
cin >> N;
for (int i = 0; i < N; i++) {
cin >> A[i];
}
long sum = 0;
long max = 0;
for (int i = 0; i < N; i++) {
if (A[i] > max) {
max = A[i];
}
sum = sum + A[i];
}
// 한 과목과 관련된 수식을 모두 더한 후 관련된 수식으로 변환해 로직이 간단해짐
double result = sum * 100.0 / max / N;
cout << result << "\n";
return 0;
}
구간 합 구하기 1
https://www.acmicpc.net/problem/11659
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int suNo, quizNo;
cin >> suNo >> quizNo;
int S[100001] = {};
for (int i = 1; i <= suNo; i++) {
int temp;
cin >> temp;
S[i] = S[i-1] + temp; // 구간 합 구하기
}
for (int i = 0; i < quizNo; i++) {
int start, end;
cin >> start >> end;
cout << S[end] - S[start-1] << "\n";
}
return 0;
}
구간 합 구하기 2
https://www.acmicpc.net/problem/11660
#include <iostream>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
vector<vector<int>> A(N + 1, vector<int>(N + 1, 0));
vector<vector<int>> D(N + 1, vector<int>(N + 1, 0));
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> A[i][j];
// 구간 합 구하기
D[i][j] = D[i][j-1] + D[i-1][j] - D[i-1][j-1] + A[i][j];
}
}
for (int i = 0; i < M; i++) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
// 구간 합 배열로 질의에 답변하기
int result = D[x2][y2] - D[x1-1][y2] - D[x2][y1-1] + D[x1-1][y1-1];
cout << result << "\n";
}
return 0;
}
나머지 합 구하기
https://www.acmicpc.net/problem/10986
연속된 자연수의 합 구하기
https://www.acmicpc.net/problem/2018
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
int count = 1;
int start_index = 1;
int end_index = 1;
int sum = 1;
while (end_index != N) {
if (sum == N) { // 답을 찾았을 때
count++;
end_index++;
sum = sum + end_index;
}
else if (sum > N) { // 현재 합이 답보다 클 때
sum = sum - start_index;
start_index++;
}
else { // 현재 합이 답보다 작을 때
end_index++;
sum = sum + end_index;
}
}
cout << count << "\n";
return 0;
}
주몽의 명령
https://www.acmicpc.net/problem/1940
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
vector<int> A(N, 0);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
sort(A.begin(), A.end());
int count = 0;
int i = 0;
int j = N - 1;
while (i < j) { // 투 포인터 이동 원칙에 따라 포인터를 이동하여 처리
if (A[i] + A[j] < M) {
i++;
}
else if (A[i] + A[j] > M) {
j--;
}
else {
count++;
i++;
j--;
}
}
cout << count << "\n";
return 0;
}
'좋은 수' 구하기
https://www.acmicpc.net/problem/1253
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<int> A(N, 0);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
sort(A.begin(), A.end());
int Result = 0;
for (int k = 0; k < N; k++) {
long find = A[k];
int i = 0;
int j = N - 1;
while (i < j) { // 투 포인터 알고리즘
if (A[i] + A[j] == find) { // 서로 다른 두 수의 합인지 체크
if (i != k && j != k) {
Result++;
break;
}
else if (i == k) {
i++;
}
else if (j == k) {
j--;
}
}
else if (A[i] + A[j] < find) {
i++;
}
else {
j--;
}
}
}
cout << Result << "\n";
return 0;
}
DNA 비밀번호
https://www.acmicpc.net/problem/12891
#include <iostream>
using namespace std;
int checkArr[4];
int myArr[4];
int checkSecret = 0;
void Add(char c);
void Remove(char c);
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int S, P;
cin >> S >> P;
int Result = 0;
string A;
cin >> A;
for (int i = 0; i < 4; i++) {
cin >> checkArr[i];
if (checkArr[i] == 0) {
checkSecret++;
}
}
for (int i = 0; i < P; i++) { // 초기 P 부분 문자열 처리
Add(A[i]);
}
if (checkSecret == 4) {
Result++;
}
// 슬라이딩 윈도우 처리 부분
for (int i = P; i < S; i++) {
int j = i - P;
Add(A[i]);
Remove(A[j]);
// 4자리 수에 대한 크기가 모두 충족되었을 때는 유효한 비밀번호
if (checkSecret == 4) {
Result++;
}
}
cout << Result << "\n";
return 0;
}
void Add(char c) { // 새로 들어온 문자를 처리하는 함수
switch (c) {
case 'A':
myArr[0]++;
if (myArr[0] == checkArr[0])
checkSecret++;
break;
case 'C':
myArr[1]++;
if (myArr[1] == checkArr[1])
checkSecret++;
break;
case 'G':
myArr[2]++;
if (myArr[2] == checkArr[2])
checkSecret++;
break;
case 'T':
myArr[3]++;
if (myArr[3] == checkArr[3])
checkSecret++;
break;
}
}
void Remove(char c) { // 제거할 문자를 처리하는 함수
switch (c) {
case 'A':
if (myArr[0] == checkArr[0])
checkSecret--;
myArr[0]--;
break;
case 'C':
if (myArr[1] == checkArr[1])
checkSecret--;
myArr[1]--;
break;
case 'G':
if (myArr[2] == checkArr[2])
checkSecret--;
myArr[2]--;
break;
case 'T':
if (myArr[3] == checkArr[3])
checkSecret--;
myArr[3]--;
break;
}
}
최솟값 찾기 1
https://www.acmicpc.net/problem/11003
#include <iostream>
#include <deque>
using namespace std;
typedef pair<int, int> Node;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, L;
cin >> N >> L;
deque<Node> mydeque;
for (int i = 0; i < N; i++) {
int now;
cin >> now;
// 값이 들어올 때마다 정렬하지 않고
// 현재 수보다 큰 값을 덱에서 제거하여 시간 복잡도를 줄임
while (mydeque.size() && mydeque.back().first > now) {
mydeque.pop_back();
}
mydeque.push_back(Node(now, i));
// 범위에서 벗어난 값은 덱에서 제거
if (mydeque.front().second <= i - L) {
mydeque.pop_front();
}
cout << mydeque.front().first << ' ';
}
return 0;
}
스택으로 수열 만들기
https://www.acmicpc.net/problem/1874
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<int> A(N, 0);
vector<char> resultV;
for (int i = 0; i < N; i++) {
cin >> A[i];
}
stack<int> myStack;
int num = 1; //오름차순 수
bool result = true;
for (int i = 0; i < A.size(); i++) {
int su = A[i]; // 현재 수열의 수
// 현재 수열값 >= 오름차순 자연수: 값이 같아질 때까지 push() 수행
if (su >= num) {
while (su >= num) { // push()
myStack.push(num++);
resultV.push_back('+');
}
myStack.pop();
resultV.push_back('-');
}
// 현재 수열값 < 오름차순 자연수: pop()을 수행하여 수열 원소를 꺼냄
else {
int n = myStack.top();
myStack.pop();
// 스택의 가장 위의 수가 만들어야 하는 수열의 수보다 크다면 수열 출력 불가능
if (n > su) {
cout << "NO";
result = false;
break;
}
else {
resultV.push_back('-');
}
}
}
if (result) {
for (int i = 0; i < resultV.size(); i++) {
cout << resultV[i] << "\n";
}
}
return 0;
}
'개발 > C++' 카테고리의 다른 글
STL 컨테이너 (0) | 2024.07.29 |
---|---|
문법 정리 (0) | 2024.07.25 |
C++ 생성자와 정적 멤버3 (0) | 2022.05.16 |
C++ 생성자와 정적 멤버2 (0) | 2022.05.12 |
C++ 생성자와 정적 멤버 (0) | 2022.05.12 |