본문 바로가기

프로그래밍/기타

프로그래머스 - 기능개발 (C#)

728x90
반응형
using System;
using System.Collections.Generic;
using System.Linq;

public class Solution 
{
    public int[] solution(int[] progresses, int[] speeds)
    {      
        var distributeList = new List<int>();
        int complete = 100;
        int distributeIndex = 0;
        double prevEndDay = -1;
        for(int i =0; i<progresses.Length; ++i)
        {
            if(speeds[i] == 0)
                break;
            
            float data = (complete - progresses[i]);
            double endDay = Math.Ceiling(data / speeds[i]);
            if(endDay > prevEndDay)
            {
                prevEndDay = endDay;
                distributeIndex = distributeList.Count;
                distributeList.Add(1);
                continue;
            }
            
            distributeList[distributeIndex]++;
        }
        
        return distributeList.ToArray();
    }
}
using System;

public class Solution 
{
    public int[] solution(int[] progresses, int[] speeds)
    {      
        int[] distributePool = new int[progresses.Length];
        int complete = 100;
        int distributeIndex = -1;
        double prevEndDay = -1;
        for(int i =0; i<progresses.Length; ++i)
        {
            if(speeds[i] == 0)
                break;
            
            float data = (complete - progresses[i]);
            double endDay = Math.Ceiling(data / speeds[i]);
            if(endDay > prevEndDay)
            {
                prevEndDay = endDay;
                distributeIndex++;
                distributePool[distributeIndex] = 1;
                continue;
            }
            
            distributePool[distributeIndex]++;
        }
        
        int[] distributes = new int[distributeIndex + 1];
        for(int i =0; i< distributes.Length; ++i)
            distributes[i] = distributePool[i];
        
        return distributes;
    }
}

첫번째 코드블럭은 List를 만들어 필요에 따라 Add()하고 ToArray()로 리턴하도록 구현했다.

확인 결과 평균 속도가 0.7ms가량 나온다. 코드도 뭔가 만족스럽지 않다.

그래서 두번째 코드블럭은 pool을 만들었고 Index에 해당하는 값을 증감시키는 방식으로 구현했다.

그리고 pool에 값을 넣은 Index만큼 크기의 Array를 만들어 리턴하도록 했다.

확인 결과 평균 속도가 0.3ms가량 나온다. 코드도 만족 스럽다.

List보다 pool을 만든게 더 빠른 이유는 간단하다.

List는 .Net 내부 구조를 보면 ArrayList나 다름 없다.

우리가 List를 사용할 때 간단하게 List.Add()를 하니까 LinkedList처럼 주소와 주소를 연결해서 삽입삭제가 빠른거처럼 생각하는데 그렇지가 않다.

내부적으로는 Add할때마다 더 큰 Array를 만들고 원래 있던 원소들을 넣어주는 식이다.

(결국 Add()하는 만큼 계속해서 새 Array를 만들어 원소를 복사하는 일련의 작업들을 하는 샘이다.)

 

Pool의 경우 적당한 크기의 Array를 만들어놓고 원소들만 건들면 된다.

그리고 최종적으로 필요한 만큼만 Pool에서 꺼내서 리턴해주면 끝난다.

 

다람쥐와 포동포동이

 

 

 

 

RememberCook 9월 28일 정식 출시!

두번째 게임인 RememberCook이 출시되었습니다. 귀여운 캐릭터들이 나오는 간단한 게임이며 플레이어의 공간인지능력을 테스트하는 게임입니다. 아래 링크를 통해 다운 받으실 수 있으니 많은 관

chipmunk-plump-plump.tistory.com

반응형