• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

문제풀이 확인 부탁드립니다.

23.12.12 15:32 작성 23.12.12 15:32 수정 조회수 147

0

package com.company.대기업유제.그래프;

import java.util.*;

class 교육과정 {
    public String[] solution(String[] subjects, String[] course){
       String[] answer = {};

       /**
        * n개의 교육과정 수료해야함
        * 교육과목에는 선수과목이 있다.
        * 선수과목 관련해서는 위상정렬을 사용한다.
        * n개의 과목을 모두 이수할수있는 순서를 배열에 담아 반환
        * (답이 여러개면 그 중 아무거나 반환) 위상정렬의 특징
        * subjects : n개의 과목 목록
        * course : 선수과목 정보
        * */

       //먼저 선수과목을 구분하기 위해 노드들을 생성
       Map<String, Node> nodes = createNodes(subjects, course);

       //후위순회로 탐색
       LinkedList<String> result = new LinkedList();

       Set<Node> discovered = new HashSet<>();

       for (var entry : nodes.entrySet()) {

          if(!discovered.contains(entry.getValue())){
             DFS(entry.getValue(), result, discovered);
          }

       }

       return result.toArray(String[]::new);
    }

    private void DFS(Node node, LinkedList<String> result, Set<Node> discovered) {

       discovered.add(node);

       for (Node next : node.nexts) {
          if(!discovered.contains(next)){
             DFS(next, result, discovered);
          }
       }

       result.addFirst(node.name);
    }


    private Map<String, Node> createNodes(String[] subjects, String[] course) {

       Map<String, Node> nodeMap = new HashMap<>();

       for (String subject : subjects) {
          nodeMap.put(subject, new Node(subject));
       }

       for (String s : course) {

          String[] split = s.split(" ");
          //선수과목
          String parent = split[1]; // parent -> child

          String child = split[0];

          Node parentNode = nodeMap.get(parent);
          Node childNode = nodeMap.get(child);

          parentNode.nexts.add(childNode);
       }
       return nodeMap;
    }

    class Node{

       public Node(String name) {
          this.name = name;
       }

       final String name;
       Set<Node> nexts = new HashSet<>(); //하위 과목
    }


       
    public static void main(String[] args){
       교육과정 T = new 교육과정();

       System.out.println(Arrays.toString(T.solution(new String[]{"english", "math", "physics", "art", "music"}, new String[]{"art math", "physics art", "art music", "physics math", "english physics"})));
       System.out.println(Arrays.toString(T.solution(new String[]{"art", "economics", "history", "chemistry"}, new String[]{"chemistry history", "economics history", "art economics"})));
       System.out.println(Arrays.toString(T.solution(new String[]{"math", "science", "music", "biology"}, new String[]{"science music", "math music", "math science", "biology math"})));
    }
}

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.14

안녕하세요, 인프런 AI 인턴입니다.

제공해 주신 코드는 위상 정렬(Topological Sorting)을 활용하여 교육 과정의 순서를 찾는 문제의 해결 방안으로 보입니다. 위상 정렬은 방향 그래프에서 노드를 선행 순서에 따라 나열하는 알고리즘입니다.

코드를 살펴보면 다음의 과정을 통해 위상 정렬을 진행하고 있습니다:
1. createNodes 함수를 통해 각 과목(subjects)을 노드로 생성하고 선수과목 정보(course)도 반영하여 그래프 구성
2. 모든 노드에 대해 DFS(깊이 우선 탐색)을 실행하여 순환을 확인하고 완료 순서대로 결과에 추가(DFS 함수 호출)
3. 이 때, discovered 집합을 사용하여 이미 방문한 노드를 추적합니다.
4. 최종적으로 위상 정렬된 결과인 result 리스트를 배열로 변환하여 반환

문제 풀이에 대한 코드는 적절한 알고리즘을 사용하고 있으며, 주어진 문제 조건에 맞게 잘 구현된 것으로 보입니다. 단, 내부적인 논리와 예외 처리가 코드 상에서 완전히 처리되었는지 확인하는 것은 실제 입력 값에 대한 테스트 실행을 통해 검증할 필요가 있습니다. 또한, 위상 정렬을 사용할 때는 순환(cycle)이 존재하는지 여부를 고려해야 합니다. 순환 존재 시 위상 정렬은 일반적으로 적용할 수 없습니다.

실행 결과가 예상과 다르거나 오류가 발생하는 경우, 디버그를 통해 개별 입력 값에 대한 처리 과정을 점검하고, 노드 생성 및 DFS 실행 과정에서의 로직을 세부적으로 확인해야 합니다.

만약 결과가 예상과 일치한다면, 구현하신 알고리즘이 문제를 올바르게 해결하고 있는 것입니다. 추가적인 테스트 케이스로 코드를 검증해보는 것을 추천드립니다.