프로그래머스 - 이차원 배열 대각선 순회하기 - C++
https://school.programmers.co.kr/learn/courses/30/lessons/181829
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int solution(vector<vector<int>> board, int k)
{
int answer=0;
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[i].size();j++)
{
if(i+j<=k)answer+=board[i][j];
}
}
return answer;
}
설명
먼저 떠올린 방법은 단순히 이중포문을 돌면서 조건을 판단해 answer에 다 더하는 것으로 그렇게 구현하여 통과하였다.
그런데 이중for문 말고 1개의 반복문으로는 구현을 못하나? 라는 생각이 들었고 어렴풋이 될거도 같은 느낌이 들었지만 생각해내지 못하였다.
그렇게 다른사람의 풀이를 보던 중 1개의 코드를 발견하였는데, 이 코드이다.
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int solution(vector<vector<int>> board, int k)
{
int answer = 0;
int row = board.size(), col = board.front().size();
++k;
for (int i = 0; i < row && i < k; ++i)
{
int c = (col <= k - i) ? col : k - i;
answer += accumulate(board[i].begin(), board[i].begin() + c, 0);
}
return answer;
}
accumulate()
https://cplusplus.com/reference/numeric/accumulate/
https://cplusplus.com/reference/numeric/accumulate/
function template <numeric> std::accumulate sum (1)template T accumulate (InputIterator first, InputIterator last, T init);custom (2)template T accumulate (InputIterator first, InputIterator last, T init, BinaryOperation binary_op); Accumulate values in ra
cplusplus.com
저 삼항 연산자를 통해서 각 줄마다 i+j<k를 넘지 않을 만큼의 j까지만 반복문이 실행되며
accumulate() 를 통해 0부터 가능한 j까지의 값을 더하는 것이었다.
즉 이 코드도 이중 for문을 이용한 구현이었고 가독성 측면에서는 비교적 안좋았다고 생각한다.
그래도 i*j번이 아닌 i+j<k가 부합하지 않는 곳은 아예 연산하지 않는다는 측면에서 조금 더 효율적인 것 같다.