2251. 물통

·2025년 7월 22일
0

백준 알고리즘

목록 보기
201/272

3차원 벡터 만들기 .

문제 해결 전략

  • 문제를 읽어보면,
    a에서 b로 , a에서 c로 , b에서 a로 , b에서 c로
    , c에서 a로 , c에서 b로 향하는 총 6가지 방법이 있다.

  • 그리고 한번 체크를 했다면 다시 방문할 필요가 없기 때문에

  • 결론
    : bfs로 해야겠다는 판단을 함.

  • 나의 경우는 dir을 풀어서 사용하는 것이 복잡하다고 느껴서
    6번을 전부 일일이 진행함.

struct Bottle
    {
        int a, b, c;
    };

    vector<int> vResult;

    queue<Bottle>q;

    q.push({ 0,0,c });
    visited[0][0][c] = true;
    vResult.push_back(c);

    while (!q.empty())
    {
        auto curV = q.front();
        int aa = curV.a;
        int bb = curV.b;
        int cc = curV.c;

        q.pop();

        // aa 에서 bb로 줄때 
        if (aa + bb > b)
        {
            if (visited[aa + bb - b][b][cc] == false)
            {
                q.push({ aa + bb - b, b, cc });
                visited[aa + bb - b][b][cc] = true;

                if (aa + bb - b == 0)
                    vResult.push_back(cc);

            }         
        }
        else
        {
            if (visited[0][aa + bb][cc] == false)
            {
                q.push({ 0, aa + bb, cc });
                visited[0][aa + bb][cc] = true;                               
                vResult.push_back(cc);

            }            
        }

        // aa 에서 cc로 줄 때 
        if (aa + cc > c)
        {
            if (visited[aa + cc - c][bb][c] == false)
            {
                q.push({ aa + cc - c, bb, c });
                visited[aa + cc - c][bb][c] = true;
                if (aa + cc - c == 0 )
                    vResult.push_back(c);
            }
        }
        else
        {
            if (visited[0][bb][aa + cc] == false)
            {
                q.push({ 0, bb, aa + cc });
                visited[0][bb][aa + cc] = true;
                vResult.push_back(aa + cc);


            }
        }

        // bb 에서 aa로
        if (aa + bb > a) 
        {
            if (visited[a][aa + bb - a][cc] == false)
            {
                q.push({ a , aa + bb - a, cc });
                visited[a][aa + bb - a][cc] = true;
                if (a == 0)
                    vResult.push_back(cc);
            }
        }
        else
        {
            if (visited[aa + bb][0][cc] == false)
            {
                q.push({ aa + bb, 0, cc });
                visited[aa + bb][0][cc] = true;
                if (aa + bb == 0)
                    vResult.push_back(cc);
            }
        }



        // bb에서 cc로 
        if (bb + cc > c)
        {
            if (visited[aa][bb + cc - c][c] == false)
            {
                q.push({ aa , bb + cc - c, c });
                visited[aa][bb + cc - c][c] = true;
                if (aa == 0)
                    vResult.push_back(c);
            }
        }
        else
        {
            if (visited[aa][0][bb + cc] == false)
            {
                q.push({ aa, 0, bb + cc });
                visited[aa][0][bb + cc] = true;
                if (aa == 0)
                    vResult.push_back(bb + cc);
            }
        }


        // cc에서 aa로
        if (aa + cc > a)
        {
            if (visited[a][bb][aa + cc - a] == false)
            {
                q.push({ a , bb, aa + cc - a });
                visited[a][bb][aa + cc - a] = true;
                if (a == 0)
                    vResult.push_back(aa + cc - a);
            }
        }
        else
        {
            if (visited[aa + cc][bb][0] == false)
            {
                q.push({ aa + cc, bb, 0 });
                visited[aa + cc][bb][0] = true;
                if (aa + cc == 0)
                    vResult.push_back(0);
            }
        }

        // cc 에서 bb로
        if (bb + cc > b)
        {
            if (visited[aa][b][bb + cc - b] == false)
            {
                q.push({ aa , b, bb + cc - b });
                visited[aa][b][bb + cc - b] = true;
                if (aa == 0)
                    vResult.push_back(bb + cc - b);
            }
        }
        else
        {
            if (visited[aa][bb + cc][0] == false)
            {
                q.push({ aa, bb + cc, 0 });
                visited[aa][bb + cc][0] = true;
                if (aa == 0)
                    vResult.push_back(0);
            }
        }

    }
profile
🔥🔥🔥

0개의 댓글