본문 바로가기

Algorithm/PS

[1일 1알고] 모두 0으로 만들기

https://school.programmers.co.kr/learn/courses/30/lessons/76503

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

중요한 것은 주어진 노드들이 트리로서 이어져있다는 것입니다.

기본적으로는 주어진 수 a의 합이 0이 아니라면 애초에 성립할 수 없다는 뜻입니다.

 

따라서 이 경우를 예외처리하고 어제 풀었던 등대문제 처럼 tree DP처럼 풀면 되겠네요

https://basaeng.tistory.com/165

 

[1일 1알고] 2차원 동전 뒤집기

https://school.programmers.co.kr/learn/courses/30/lessons/131703 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr구현 문제입니다. 어떻게 뒤집어

basaeng.tistory.com

 

끌어올리면서 말단노드와의 차이를 누적시키면 됩니다. 결론적으로는 루트 노드에서 취합하여 0을 만들어야합니다.

 

#include <string>
#include <vector>

using namespace std;

int n = 0;
vector<vector<int>> roads;
long long answer = 0;

void dfs(int cur, int parent, vector<long long>& a)
{
    for (auto next : roads[cur])
    {
        if (next == parent)
            continue;

        dfs(next, cur, a);
    }

    if (parent == -1)
        return;

    a[parent] += a[cur];
    answer += llabs(a[cur]);
    a[cur] = 0;
}

long long solution(vector<int> a, vector<vector<int>> edges) {
    answer = 0;

    n = a.size();

    long long total = 0;
    for (int elem : a)
    {
        total += elem;
    }

    if (total != 0)
        return -1;

    roads.assign(n, vector<int>());

    for (auto edge : edges)
    {
        roads[edge[0]].push_back(edge[1]);
        roads[edge[1]].push_back(edge[0]);
    }

    vector<long long> weights(a.begin(), a.end());

    dfs(0, -1, weights);

    return answer;
}

어제의 등대 문제보다는 훨씬 간단합니다.

 

다만 문제는 누적되는 값이 int의 범위를 넘을 수 있기 때문에 이를 신경써야겠네요

물론 몇개의 예시에서 제가 틀려서 하는 말입니다.

 

'Algorithm > PS' 카테고리의 다른 글

[1일 1알고] 인사고  (0) 2026.06.02
[1일 1알고] 표 편집  (0) 2026.05.28
[1일 1알고] 등대  (0) 2026.05.26
[1일 1알고] 2차원 동전 뒤집기  (0) 2026.05.22
[1일 1알고] 디스크 컨트롤러  (0) 2026.05.21