티스토리 뷰

일단 문제는 둘째치고 내가 기동찬 array변환 함수를 알아냈다.

매번 split하고 배열 요소마다 int.parse 취해주는거 귀찮다고 생각하고 있었는데...

Array.ConvertAll<바꾸기전,바꾼 후>(대상 배열,컨버터); 이렇게 해주면 한줄로 끝이다.

ex) int[] intArray = Array.ConvertAll<string,int>(stringArray,int.Parse);

개꿀~~~~~~~~~~~~~~~~~~

이번에는 값 받아들이는걸 bufferstream 등 스트림 입출력으로 진행해보았다. 앞서 본 사람의 코드를 통해 새로 알게된 것도 좀 써봄

정답률이 50%인데 나는 꽤 헤맸다...


귀찮아서 이번에는 큐를 이용했다.


문서의 중요도는 Queue에 순서대로 저장한다.

큐는 Dequeue와 Enqueue를 반복하면서 상대적으로 문서들의 순서가 계속 바뀌게 될 텐데,

필요로 하는 문서가 무엇인지 계속 기억하는 것이 중요하다.

따라서 int pin을 통해 queue가 변동될때마다 문서의 상대적 위치만큼 pin 값도 변경해줘야 한다.


알고리즘을 단순화하면 다음과 같다.


* 맨 앞에 있는 문서의 중요도가 지금 대기문서 중요도 Max값이랑 같은가?

 - 같다

그게 pin이 꽂혀있는 문서라면?

count 출력

구할 것은 구했으니 break

그게 pin이 꽂혀있지 않은 문서라면?

count 증가

dequeue

상대적으로 문서들의 index가 -1씩 될테니 pin--

- 다르다(작다)

그게 pin이 꽂혀있는 문서라면?

pin = 큐.count; 

dequeue를 enqueue한다.

그게 pin이 꽂혀있지 않은 문서라면?

dequeue를 enqueue한다. 

상대적으로 문서들의 indexe가 -1씩 될테니 pin--


여기서 삽질했던 게 다르다(작다) ->pin이 꽂혀있는 문서라면? 부분인데, if 이후 else 안써가지고 pin이 꽂혀있지 않은 문서일 경우의 pin--까지 되어버렸다. 정말 조심해야해... else....



        {

            BufferedStream bs = new BufferedStream(Console.OpenStandardInput());

            StreamReader sr = new StreamReader(bs);

            StringBuilder sb = new StringBuilder();


            int pin; 

            int count;

            string[] str;

            Queue<int> waitingQueue;

            int countDown = int.Parse(sr.ReadLine());


            while(countDown-->0)

            {

                str = sr.ReadLine().Split();

                pin = int.Parse(str[1]);

                count = 0;


                str = sr.ReadLine().Split();

                waitingQueue = new Queue<int>(Array.ConvertAll<string, int>(str, int.Parse));


                while(waitingQueue.Count != 0)

                {                    

                    if(waitingQueue.Peek() == waitingQueue.Max())

                    {                        

                        count++;

                        if (pin == 0)

                        {                           

                            sb.AppendLine(count.ToString());

                            break;

                        }

                        waitingQueue.Dequeue();

                        pin--;

                    }

                    else

                    {

                        if (pin == 0)

                            pin = waitingQueue.Count;

                        waitingQueue.Enqueue(waitingQueue.Dequeue());

                        pin--;

                    }

                }

            }

            Console.WriteLine(sb);

        }

'■ 알고리즘 > ◻ 백준' 카테고리의 다른 글

[C#]백준 10866번 : 덱  (0) 2018.08.10
백준 할때 자주 찾는 메소드  (0) 2018.08.10
[C#] 백준 10845번 : 큐  (0) 2018.08.09
[C#]백준 9012번 : 괄호  (0) 2018.08.09
[C#]백준 10828번 : 스택  (0) 2018.08.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함