티스토리 뷰
일단 문제는 둘째치고 내가 기동찬 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 |