코딩테스트 (C#)

백준 5597 : 과제 안 내신 분..? - C# 풀이

UniCoti-sub 2024. 9. 12.
반응형

문제 사진

이번 문제도 그냥 적당히 쉬운 편이다.

난이도가 선형적으로 증가하는 건지 아니면 그냥 새로운 요소가 추가되는 건지

모르겠다만 만약에 난이도가 선형적으로 증가한다면 한 2달 뒤에는 난관이 펼쳐질 것 같다.

 

아무튼, 이번 문제는 한줄에 한명씩 번호가 주어지는데,

30명중에 번호가 없는 2명을 찾으면 되는 문제이다.

이번 문제는 이해하기 쉬울 것이라고 생각한다.

 

나는 일단 1부터 30까지 모두 더한 다음에 나와있는 번호를 모두 빼면

제출 안한 두 사람의 번호만 남을테니 그걸 써볼까 했는데

그냥 정석대로 배열을 쓰는 게 나은 것 같았다.

 

30칸짜리 배열을 만든 다음 주어진 번호의 인덱스에 있는

배열의 값을 바꾸고, 이후 역추적하여 배열의 값이 특정한 2명을

뽑아 출력하면 간단히 해결할 수 있을 것이다.

 

using System;

namespace unicoti {
    class Program {
        static void Main(string[] args) {
            int[] arr = new int[30];
     
            for(int i = 0; i < 28; i++) {
                int.TryParse(Console.ReadLine(), out int a);
                arr[a-1] = 1;
            }
            
            for(int i = 0; i < 30; i++) {
                if(arr[i] == 0) {
                    Console.WriteLine(i+1);
                }
            }
        }
    }
}

 

내가 앞에서 말한 그대로이다.

일단 번호가 적혀있는 모든 배열의 인덱스 값을 1로 바꿔주었다.

이후 for문으로 값이 0인 인덱스를 찾아서 출력해주었다.

 

여기서 i + 1은 배열의 형식(0부터 시작)과 번호의 형식(1부터 시작)을

보간하기 위한 상수이다. 배열 문제에서 주로 +1, -1의 보정이 많이 필요하다.


오늘의 느낀점)

이번 문제는 컴파일러도 없는 환경에서 단 한번의 수정으로 풀어낸 문제여서

그렇게 느낀점은 없다. 다만 아이디어를 생각해보는 과정에서 얻는 점은 조금 있었다.

만약 합계를 통해 풀어낸다고 치면, 둘 중 하나의 번호만 알면 둘다 알 수 있다.

 

따라서 둘다 알아내는 것 보다 효율적일 수 있다고 생각했으나

둘중 하나라도 알려면 27번까지 저장해야 알 수 있기에

결국 다시 원형인 일차원 배열로 돌아왔다.

뭐 이것도 나쁘지는 않은 것 같다만 약간 마음에 안들기도 하다.


이상으로 도움이 되었길 바라며,

 

끝.

반응형

댓글