파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제

상근이가 가지고있는 숫자중 제시된 숫자의 갯수를 구하는 문제이다.

풀이 : 내가 작성한 코드

            int[] arry = new int[20000001];
            int n = int.Parse(Console.ReadLine());
            string[] nstr = Console.ReadLine().Split(' ');

            int m = int.Parse(Console.ReadLine());
            string[] mstr = Console.ReadLine().Split(' ');
            int nIdx = 10000000;
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < nstr.Length; i++)
            {
                arry[nIdx + int.Parse(nstr[i])]++;
            }
            for (int i = 0; i < mstr.Length; i++)
            {
                stringBuilder.Append(arry[nIdx + int.Parse(mstr[i])] + " ");
            }
            Console.WriteLine(stringBuilder.ToString());

단순히 이중for문으로 풀수도있지만 시간초과가 날수 있기 때문에 카운트소팅으로 문제를 해결했다. 카운트할 갯수를 저장한 배열을 선언하다 범위가  [-10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다] 이기 때문에 배열크기를 20,000,001로 할당했다. 

예를들어 -9000000 이 값이 나오면 10000000을 더해 1000000인덱스에 접근하여 1을 더해준다.

 

그렇게 하면 다른 조건처리 없이 배열의 값을 할당할 수 있기 때문이다. 20,000,000이 아닌 20,000,001인 이유는 0의 카드도 나올수 -10000000인 카드가 나오면 배열의 인덱스는 0을 가리키기 때문이다. 

 

https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

반응형

+ Recent posts