정답률 높은 문제라 쉽게 생각했는데
생각보다 복잡한 문제였다 ;-;
처음에는 0이 나온 인덱스의 앞의 것만 0으로 바꿔주면 된다고 생각했는데,
0이 나온 갯수만큼 최근의 나온 숫자(0과 인접하지 않더라도)를 모두 없애줘야 했고
#include <iostream>
using namespace std;
// 3 0 4 0
// 0
// 1 3 5 4 0 0 7 0 0 6
// 7
int current = -1;
void pop(int *arr, int cur) {
if (current == -1) {
}
else {
arr[current] = 0;
}
}
void sol(int *arr) {
int length = _msize(arr) / sizeof(arr[0]);
for (int i = 0; i < length; i++) {
if (arr[i] == 0) {
pop(arr, current);
current--;
}
else {
current++;
}
}
}
int sum(int* arr) {
int sum = 0;
for (int i = 0; i < _msize(arr) / sizeof(int); i++) {
sum += arr[i];
}
return sum;
}
int main() {
//input
int k; cin >> k;
int* arr = new int[k];
for (int i = 0; i < k; i++) {
cin >> arr[i];
}
//sol
// 0이 있는 인덱스 이전의 정수를 삭제
sol(arr);
// 배열의 합 출력
cout << sum(arr) << endl;
return 0;
}
두 번째로 푼 요 코드는
0이 나온 이후에 정수를 삭제해주지 못했다
해결 코드
#include <iostream>
#include <vector>
using namespace std;
int sum(vector<int>v) {
int sum = 0;
for (int i = 0;i < v.size(); i++) {
sum += v.at(i);
}
return sum;
}
int main() {
int k; cin >> k;
int* temp = new int[k];
vector<int>v;
for (int i = 0; i < k; i++) {
cin >> temp[i];
if (temp[i] == 0) {
if (v.empty())
continue;
else {
v.pop_back();
}
}
else {
v.push_back(temp[i]);
}
}
cout << sum(v);
return 0;
}
0을 포함해 모든 요소를 넣을 temp 배열과 실제로 남는 값을 넣을 vector v를 선언한다.
1) 받아온 값이 0일 때 v가 비어있는 상태면 패스(첫 입력부터 0이 나올 경우), v에 요소가 있을 때 pop을 한다
2) 받아온 값이 0이 아니면 그대로 v에 넣는다.
3) sum을 출력한다.
이렇게 해서 해결 (●'◡'●)
'Algorithm > Baekjoon' 카테고리의 다른 글
백준 1003 피보나치 함수 C++ 구현 (0) | 2022.10.31 |
---|---|
[BOJ]9934 : 완전 이진 트리 C++ 문제 풀이 (0) | 2021.11.04 |
[BOJ]11399 ATM : 그리디 알고리즘 C++ 문제풀이 (0) | 2021.03.09 |
[BOJ]1449수리공 항승 : 그리드 알고리즘 C++ 해결 코드와 설명 (0) | 2021.03.06 |
[BOJ]2847게임을 만든 동준이 : 그리디 알고리즘 C++ 문제 해결 및 코드 (0) | 2021.03.05 |