```
백준 14648번 쿼리 맛보기 C++로 구현해보기
```

이번 글을 통해 배워갈 내용
- 백준 14648번 풀이
- 간단한 쿼리 연습 연습
https://www.acmicpc.net/problem/14648
14648번: 쿼리 맛보기
첫째 줄에 수열의 길이를 뜻하는 n(1 ≤ n ≤ 1,000)과 쿼리의 개수를 뜻하는 q(1 ≤ q ≤ 10,000)가 주어진다. 둘째 줄에 길이 n의 수열이 하나의 공백을 사이에 두고 주어진다. 수열의 각 수는 -2,147,483,
www.acmicpc.net
백준 14648번호번 쿼리 맛보기는
난이도 쉬움 등급의 문제로서
수열의 길이와 쿼리 길이를 입력하고
수열의 길이만큼 수열을 입력해서 채워준 다음
query(질의)의 길이만큼 쿼리를 날려서
진행을 해주면 됩니다.
쿼리의 종류는 두종류이고
쿼리가 1이면 두 수를 입력 받고
각 수를 인덱스로 해서 수열에서 구간 합을 출력한다음
(다시 설명하면 a 부터 b 까지 수열 구간 합)
다음 두수의 위치에 수열 배열을 바꿔주고
쿼리가 2이면
수 a b c d를 입력 받고
a 부터 b 까지 수열 구간 합을 구하고
c 부터 d 까지 수열 구간 합을 구한다음
첫 구간 합에서 두번째 구간 합을 뺸다음 출력하면 됩니다.
30분 정도 위에 링크를 방문하셔서 풀어보시고
안풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
일단 유저에게 숫자를 입력 받습니다.
이때 주의할점은 수의 범위가 크고
각 숫자의 최대값이 int 자료형의 최대값이기 떄문에
숫자를 합한 값이 int를 넘어서 자료형을 주의해서 써주어야 합니다.
void getInputFromUser()
{
getSequenceAndQuerySizeInput();
getSequenceArrayInput();
}
void getSequenceAndQuerySizeInput()
{
std::string inputStr;
std::getline(std::cin, inputStr);
std::stringstream ss(inputStr);
ss >> sequenceSize;
ss >> querySize;
}
void getSequenceArrayInput()
{
numberSequenceArray = new long [sequenceSize];
std::string inputStr;
std::getline(std::cin, inputStr);
std::stringstream ss(inputStr);
for (int i = 0; i < sequenceSize; i++)
{
long tempVal;
ss >> tempVal;
numberSequenceArray[i] = tempVal;
}
}
그다음 질의를 입력받고
케이스문을 돌려서 질의에 따라서 다른 종류의 함수를 실행해줍니다.
void getQueries()
{
for (int i = 0; i < querySize; i++)
{
std::string inputStr;
std::getline(std::cin, inputStr);
std::stringstream ss(inputStr);
long tempVal;
ss >> tempVal;
switch (tempVal)
{
case 1:
{
int a;
int b;
ss >> a;
ss >> b;
queryProcess1(a, b);
break;
}
case 2:
{
int a;
int b;
int c;
int d;
ss >> a;
ss >> b;
ss >> c;
ss >> d;
queryProcess2(a, b, c, d);
break;
}
default:
std::cout << "hello";
break;
}
}
}
질의 1 일때는 구간 합을 구해서 출력해주고
위치를 교환해줍니다.
void queryProcess1(const long a, const long b)
{
long sum = 0;
/* 합을 출력한다.*/
for (int i = a-1; i < b; i++)
{
sum = sum + numberSequenceArray[i];
}
std::cout << sum << "\n";
/* index a 값과 index b 의 값을 교환한다.*/
std::swap(numberSequenceArray[a - 1], numberSequenceArray[b - 1]);
};
질의 2번일때는 구간합을 두개 구해서 첫 구간합에서 두번째 구간합을 빼 준 다음 출력합니다.
void queryProcess2(const long a, const long b, const long c, const long d)
{
/* 구간합1*/
long sum1 = 0;
for (int i = a - 1; i < b; i++)
{
sum1 = sum1 + numberSequenceArray[i];
}
/* 구간합2*/
long sum2 = 0;
for (int i = c - 1; i < d; i++)
{
sum2 = sum2 + numberSequenceArray[i];
}
/* 결과 */
std::cout << (sum1 - sum2) << "\n";
};
전체 코드는 다음과 같습니다
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include<numeric>
// https://www.acmicpc.net/problem/3252
class CQueryFirstTaste
{
private:
/* 수열 사이즈 */
int sequenceSize;
/* 질의 사이즈 */
int querySize;
/* 수열 */
long* numberSequenceArray;
public:
CQueryFirstTaste()
{
}
~CQueryFirstTaste()
{
delete[] numberSequenceArray;
}
void getInputFromUser()
{
getSequenceAndQuerySizeInput();
getSequenceArrayInput();
}
void getSequenceAndQuerySizeInput()
{
std::string inputStr;
std::getline(std::cin, inputStr);
std::stringstream ss(inputStr);
ss >> sequenceSize;
ss >> querySize;
}
void getSequenceArrayInput()
{
numberSequenceArray = new long [sequenceSize];
std::string inputStr;
std::getline(std::cin, inputStr);
std::stringstream ss(inputStr);
for (int i = 0; i < sequenceSize; i++)
{
long tempVal;
ss >> tempVal;
numberSequenceArray[i] = tempVal;
}
}
void getQueries()
{
for (int i = 0; i < querySize; i++)
{
std::string inputStr;
std::getline(std::cin, inputStr);
std::stringstream ss(inputStr);
long tempVal;
ss >> tempVal;
switch (tempVal)
{
case 1:
{
int a;
int b;
ss >> a;
ss >> b;
queryProcess1(a, b);
break;
}
case 2:
{
int a;
int b;
int c;
int d;
ss >> a;
ss >> b;
ss >> c;
ss >> d;
queryProcess2(a, b, c, d);
break;
}
default:
std::cout << "hello";
break;
}
}
}
void queryProcess1(const long a, const long b)
{
long sum = 0;
/* 합을 출력한다.*/
for (int i = a-1; i < b; i++)
{
sum = sum + numberSequenceArray[i];
}
std::cout << sum << "\n";
/* index a 값과 index b 의 값을 교환한다.*/
std::swap(numberSequenceArray[a - 1], numberSequenceArray[b - 1]);
};
void queryProcess2(const long a, const long b, const long c, const long d)
{
/* 구간합1*/
long sum1 = 0;
for (int i = a - 1; i < b; i++)
{
sum1 = sum1 + numberSequenceArray[i];
}
/* 구간합2*/
long sum2 = 0;
for (int i = c - 1; i < d; i++)
{
sum2 = sum2 + numberSequenceArray[i];
}
/* 결과 */
std::cout << (sum1 - sum2) << "\n";
};
};
int main()
{
std::cin.tie(NULL);
std::ios::sync_with_stdio(false);
CQueryFirstTaste* cQueryFirstTaste = new CQueryFirstTaste();
cQueryFirstTaste->getInputFromUser();
cQueryFirstTaste->getQueries();
//cBingo->printMyMap();
}
입력
5 2
3 5 -2 3 -12
2 1 3 2 4
1 2 5
결과
0
-6
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩하시길 바랍니다 ~ :)
참조 및 인용
C++ Primer
Introduction to Algorithms
https://codemasterkimc.tistory.com/35
C++ 이론을 배울수 있는 곳 정리
개요 C++을 배우는 책, 강의, 블로그, 링크 등을 공유합니다. (링크 및 간략한 설명을 하였으나 만약 원작자가 링크를 거는것을 원치 않을 경우 연락주시기 바랍니다.) 서적 https://www.amazon.com/Prime
codemasterkimc.tistory.com
https://codemasterkimc.tistory.com/50
300년차 개발자의 좋은 코드 5계명 (Clean Code)
이번 글을 통해 배워갈 내용 좋은 코드(Clean Code)를 작성하기 위해 개발자로서 생각해볼 5가지 요소를 알아보겠습니다. 개요 좋은 코드란 무엇일까요? 저는 자원이 한정적인 컴퓨터 세상에서 좋
codemasterkimc.tistory.com
'C++ > C++ 알고리즘' 카테고리의 다른 글
| 백준 16283번 farm C++로 구현해보기 (0) | 2021.08.31 |
|---|---|
| 백준 17548번 Greetings C++로 구현해보기 (0) | 2021.08.31 |
| 백준 14647번 (가장 9가 많은 열 혹은 행 찾아서 전체 9 숫자에서 빼기) C++로 구현해보기 (0) | 2021.08.30 |
| 백준14645번 와이버스 부릉부릉 C++로 구현해보기 (0) | 2021.08.30 |
| 백준 21964번 선린인터넷고등학교 교가(마지막5글자 구하기) C++로 구현해보기 (0) | 2021.08.30 |