컴퓨터 과학/💯 코테

코딩 테스트 합격자 되기 | 문제28. 양과 늑대

2024. 12. 12. 08:30
목차
  1. 28. 양과 늑대

28. 양과 늑대

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

 

프로그래머스

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

programmers.co.kr

 

2진 트리 모양 초원의 각 노드에 늑대와 양이 한 마리씩 놓여 있습니다. 이 초원의 루트 노드에서 출발하여 각 노드를 돌아다니며 양을 모으려 합니다. 각 노드를 방문할 때 마다 해당 노드에 있던 양과 늑대가 당신을 따라오게 됩니다. 이때, 늑대는 양을 잡아먹을 기회를 노리고 있으며, 당신이 모은 양의 수보다 늑대의 수가 같거나 더 많아지면 바로 모든 양을 잡아먹어 버립니다. 당신은 중간에 양이 늑대에게 잡아먹히지 않도록 하면서 최대한 많은 수의 양을 모아서 다시 루트 노드로 돌아오려 합니다.

예를 들어, 위 그림의 경우(루트 노드에는 항상 양이 있습니다) 0번 노드(루트 노드)에서 출발하면 양을 한마리 모을 수 있습니다. 다음으로 1번 노드로 이동하면 당신이 모은 양은 두 마리가 됩니다. 이때, 바로 4번 노드로 이동하면 늑대 한 마리가 당신을 따라오게 됩니다. 아직은 양 2마리, 늑대 1마리로 양이 잡아먹히지 않지만, 이후에 갈 수 있는 아직 방문하지 않은 모든 노드(2, 3, 6, 8번)에는 늑대가 있습니다. 이어서 늑대가 있는 노드로 이동한다면(예를 들어 바로 6번 노드로 이동한다면) 양 2마리, 늑대 2마리가 되어 양이 모두 잡아먹힙니다. 여기서는 0번, 1번 노드를 방문하여 양을 2마리 모은 후, 8번 노드로 이동한 후(양 2마리 늑대 1마리) 이어서 7번, 9번 노드를 방문하면 양 4마리 늑대 1마리가 됩니다. 이제 4번, 6번 노드로 이동하면 양 4마리, 늑대 3마리가 되며, 이제 5번 노드로 이동할 수 있게 됩니다. 따라서 양을 최대 5마리 모을 수 있습니다.

각 노드에 있는 양 또는 늑대에 대한 정보가 담긴 배열 info, 2진 트리의 각 노드들의 연결 관계를 담은 2차원 배열 edges가 매개변수로 주어질 때, 문제에 제시된 조건에 따라 각 노드를 방문하면서 모을 수 있는 양은 최대 몇 마리인지 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 2 ≤ info의 길이 ≤ 17
    • info의 원소는 0 또는 1 입니다.
    • info[i]는 i번 노드에 있는 양 또는 늑대를 나타냅니다.
    • 0은 양, 1은 늑대를 의미합니다.
    • info[0]의 값은 항상 0입니다. 즉, 0번 노드(루트 노드)에는 항상 양이 있습니다.
  • edges의 세로(행) 길이 = info의 길이 - 1
    • edges의 가로(열) 길이 = 2
    • edges의 각 행은 [부모 노드 번호, 자식 노드 번호] 형태로, 서로 연결된 두 노드를 나타냅니다.
    • 동일한 간선에 대한 정보가 중복해서 주어지지 않습니다.
    • 항상 하나의 이진 트리 형태로 입력이 주어지며, 잘못된 데이터가 주어지는 경우는 없습니다.
    • 0번 노드는 항상 루트 노드입니다.

입출력 예

infoedgesresult

[0,0,1,1,1,0,1,0,1,0,1,1] [[0,1],[1,2],[1,4],[0,8],[8,7],[9,10],[9,11],[4,3],[6,5],[4,6],[8,9]] 5
[0,1,0,1,1,0,1,0,0,1,0] [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6],[3,7],[4,8],[6,9],[9,10]] 5

입출력 예 설명

입출력 예 #1

문제의 예시와 같습니다.

입출력 예 #2

주어진 입력은 다음 그림과 같습니다.

0번 - 2번 - 5번 - 1번 - 4번 - 8번 - 3번 - 7번 노드 순으로 이동하면 양 5마리 늑대 3마리가 됩니다. 여기서 6번, 9번 노드로 이동하면 양 5마리, 늑대 5마리가 되어 양이 모두 잡아먹히게 됩니다. 따라서 늑대에게 잡아먹히지 않도록 하면서 최대로 모을 수 있는 양은 5마리입니다.

 

내 답안

import java.util.*;
class Solution {
      private static ArrayList<Integer>[] tree;
    private static class Info{
        int node,sheep,wolf;
        HashSet<Integer> visited;

        public Info(int node,int sheep, int wolf, HashSet visited){
            this.node = node;
            this.sheep = sheep;
            this.wolf = wolf;
            this.visited = visited;
        }
    }
    public static void buildTree(int[] info, int[][]edges){
        tree = new ArrayList[info.length];

        for(int i =0 ; i<tree.length;i++){
            tree[i] = new ArrayList<>();
        }

        for(int[] edge : edges){
            tree[edge[0]].add(edge[1]);
        }

    }

    public static int solution(int[] info, int[][] edges) {
        int answer = 0;

        buildTree(info,edges);
        Arrays.stream(tree).forEach(vo->{
            System.out.println(vo.toString() + " ");
        });

        ArrayDeque<Info> queue = new ArrayDeque<>();
        queue.add(new Info(0,1,0,new HashSet<>()));
        
        while(!queue.isEmpty()){
            Info now = queue.poll();

            answer = Math.max(now.sheep,answer);
            now.visited.addAll(tree[now.node]);

            for(int next : now.visited){
                HashSet<Integer> set = new HashSet<>(now.visited);
                set.remove(next);

                if(info[next] == 1){
                    if(now.sheep != now.wolf+1){
                        queue.add(new Info(next, now.sheep, now.wolf + 1, set));
                    }
                }
                else{
                    queue.add(new Info(next, now.sheep+1,now.wolf,set));
                }
            }

        }
        return answer;
    }
}
반응형

'컴퓨터 과학 > 💯 코테' 카테고리의 다른 글

코딩 테스트 합격자 되기 | 문제31. 포켓몬  (0) 2025.01.09
코딩 테스트 합격자 되기 | 문제27. 다단계 칫솔 판매  (0) 2024.12.06
코딩 테스트 합격자 되기 | 문제26. 예상 대진표  (2) 2024.12.04
코딩 테스트 합격자 되기 | 문제25. 트리 순회  (0) 2024.12.01
코딩 테스트 합격자 되기 | 문제25. 트리 순회  (0) 2024.11.27
  1. 28. 양과 늑대
'컴퓨터 과학/💯 코테' 카테고리의 다른 글
  • 코딩 테스트 합격자 되기 | 문제31. 포켓몬
  • 코딩 테스트 합격자 되기 | 문제27. 다단계 칫솔 판매
  • 코딩 테스트 합격자 되기 | 문제26. 예상 대진표
  • 코딩 테스트 합격자 되기 | 문제25. 트리 순회
이재원
이재원
깃든블로그이재원 님의 블로그입니다.
이재원
깃든블로그
이재원
유튜브
깃허브
전체
오늘
어제
글쓰기 관리
  • 분류 전체보기 (452)
    • WORK (11)
      • ✍🏻 기록 (8)
      • PLC (1)
    • DevOps (30)
      • 🛠️ CICD (9)
      • 🐳 Docker & Kubernetes (12)
      • 📡 AWS (3)
      • 🌌 Git (6)
    • 웹 개발 (197)
      • 🖥️ HTML&CSS (11)
      • 🌐 JavaScript (39)
      • 🍃 SpringBoot (51)
      • 🎆 JSP (15)
      • 🐍 Python (16)
      • ⚛️ React (15)
      • #️⃣ TypeScript (15)
      • 🧊 ThreeJS (13)
      • 🟩 Node.js (16)
      • 🚨 Error Log (6)
    • 서버&백엔드 (100)
      • 🔥 JAVA (51)
      • 🗃️ DataBase (21)
      • 🐧 Linux (21)
      • 🖥️ Windows (7)
    • AI (6)
      • 🤖 딥러닝 (6)
    • 앱 개발 (1)
      • 📱 Flutter (1)
      • ReactNative (0)
    • 컴퓨터 과학 (71)
      • 🀰 디자인패턴 (10)
      • 🔢 자료구조 (11)
      • 🛜 네트워크 (12)
      • 🖥️ 운영체제 (1)
      • 🔆 프로그래밍 (5)
      • 💯 코테 (32)
    • 개인프로젝트 (4)
      • 🤪 forfun (2)
      • 💼 포트폴리오 (1)
      • 🍎 MacBook (1)
    • 자격증 (1)
      • 💯 OPIC (0)
      • 자격증 (1)
    • 꿀팁 (9)
      • ✨ 유용한 사이트 (8)
      • 📙 티스토리 (1)
    • 여행 (1)
      • ✈️ 해외여행 (1)
      • 🗺️ 국내여행 (0)
    • 음식 (6)
      • 🏰 맛집 (5)
      • 🍰 요리 (1)
    • 일상 (4)
      • 🎨 만들기 (1)
      • 🛒 쇼핑 (2)
      • 👟 운동 (1)
    • 유튜브 (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • nestjs
  • 사케
  • 키오스크
  • 영등포구청
  • 안국역
  • 까르띠에
  • 이자카야
  • 한식
  • JPA
  • java
  • 이천
  • 청담메종
  • 키오스크 공익
  • 한강
  • 가성비
  • 티스토리챌린지
  • 코딩테스트
  • springboot
  • 키오스크공익
  • 코테
  • 인사동
  • 존맛
  • 식권관리
  • 러닝
  • 스프링부트
  • 역삼
  • 맛집
  • 오블완
  • 양평역
  • thymleaf
반응형
이재원
코딩 테스트 합격자 되기 | 문제28. 양과 늑대
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.