글 작성자: Doublsb

https://programmers.co.kr/learn/courses/30/lessons/86048

 

풀이

- 입실, 퇴실 순서 배열이 주어진다

- 입실과 퇴실의 시간은 기록되어 있지 않으며, 입실/퇴실이 동시에 이뤄지는 경우는 없다

- 각 사람 별로 반드시 만난 사람 수를 반환해야 한다

 

- 규칙 찾느라 좀 헤맸는데, 아래와 같이 풀었다.

 

C#

using System;
using System.Linq;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int[] enter, int[] leave) {

        var interSect = new List<int>();
        
        var answerHash = new Dictionary<int, HashSet<int>>();
        var answer = new int[enter.Length];
        
        for(int i=0; i<leave.Length; i++)
        {
            int index_in = Array.IndexOf(enter, leave[i]);
            
            int take_count = index_in;
            int takeLast_count = leave.Length - i - 1;
            
            if(take_count <= 0 || takeLast_count <= 0) continue;

            interSect 
                = enter.Take(take_count)
                  .Intersect(leave.TakeLast(takeLast_count)).ToList();
            
            interSect.Add(leave[i]);
            
            foreach(var inter in interSect)
            {
                if(!answerHash.ContainsKey(inter-1)) 
                    answerHash.Add(inter-1, new HashSet<int>());
                
                foreach(var node in interSect)
                {
                    if(inter == node) continue;
                    answerHash[inter-1].Add(node);
                }
            }
            
            enter[index_in] = 0;
        }
        
        foreach(var e in answerHash) answer[e.Key] += e.Value.Count;

        return answer;
    }
}

 

결과

100.0 / 100.0

 

피드백

효율성을 덜 갖다버릴 수 있는 방법을 모르겠군. 음...

반응형