알고리즘/프로그래머스 1단계

프로그래머스 - 이차원 배열 대각선 순회하기 - C++

게임만드는학생 2023. 7. 25. 12:45

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가 부합하지 않는 곳은 아예 연산하지 않는다는 측면에서 조금 더 효율적인 것 같다. 

 

p.s 혹시 1개의 반복문으로 구현이 가능하다면 알려주세요! 환영입니다!