IT 프로그래밍/백준

[C++] 5597 과제 안 내신 분..?

기술1 2024. 3. 18. 19:37
반응형

 

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

 

5597번: 과제 안 내신 분..?

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데,

www.acmicpc.net

풀이


#include <iostream>
#include <algorithm>

using namespace std;
int main()
{
	int a, b;

	int data[30];
	int asd[100] = { 0, };

	for(int i = 1; i <= 28; i++)
	{
		cin >> data[i];
	}
	


	for (int i = 1; i <= 28; i++)
	{
		for (int j = 1; j <= 30; j++)
		{
			if (data[i] == j)
				asd[j] = data[i];
		}
	}

	for (int i = 1; i <= 30; i++)
	{
		if (asd[i] == 0)
			cout << i << endl;
	}
	return 0;
}

 풀고 보니 식이 많이 복잡해졌습니다. 사실 bool타입을 썼으면 더 빨리 풀 수 있는 문제인데 저는 bool타입을 이용하지 않아서 식이 그보다 조금 더 번거로워졌습니다. 

 

1. 사용자가 입력해야하는 갯수는 과제를 내지 않은 2명을 제외한 28명입니다. 

for(int i = 1; i <= 28; i++)
{
	cin >> data[i];
}

이렇게 28명을 나타내주는 배열을 만들었습니다.

 

2. 해당 식을 다른 배열에 넣어줄 것입니다. 각 배열의 자릿수와 맞게 값을 넣어줍니다. 예를들면 1번째 학생은 첫번째 배열에 가는 것입니다.

for (int i = 1; i <= 28; i++)
{
	for (int j = 1; j <= 30; j++)
	{
		if (data[i] == j)
			asd[j] = data[i];
	}
}

for문 안에 for문을 넣어주면서 직접 판별을 통해 배열을 넣어줍니다. 이때 처음에 판별하는 data 배열은 {0, }; 을 통해 0으로 초기화를 해줬습니다. 이후 초기화값이 그대로인 0이 과제를 제출하지 않은 정답이므로 출력해줍니다.

 

3. 과제를 내지 않은 즉 초기화값이 그대로인 배열을 출력해줍니다.

for (int i = 1; i <= 30; i++)
{
	if (asd[i] == 0)
		cout << i << endl;
}

 

 

 

다른 풀이


#include <iostream>

using namespace std;

int main() {

  int arr[31] = { 0, };
  int a;

  for(int i = 0; i < 28; i++) {
    cin >> a;
    arr[a] = 1;
  }

  for(int i = 1; i <= 30; i++) {
    if(!arr[i]) cout << i << '\n';
  }

  return 0;
}

해당 풀이 또한 0을 초기화값으로 두는 것은 동일합니다. 또한 28까지 a를 받는 것도 동일합니다만 arr[a] = 1을 해주었습니다. 즉 과제를 낸 모든 사람은 1을 넣어주면서 0인 사람만 넣으면 되기 때문입니다.

 

기본적으로 컴퓨터는 0을 거짓, 1을 참이라 판별하므로 if(!arr[i]) 만 해주면 손쉽게 값을 구할 수 있는 것입니다. 

 

반응형

'IT 프로그래밍 > 백준' 카테고리의 다른 글

[C++] 백준 27866 문자와 문자열  (0) 2024.03.20
[C++] 3052 나머지  (0) 2024.03.19
[C++] 백준 10813 공 바꾸기 풀이  (0) 2024.03.18
[C++] 백준 10810번 공넣기  (0) 2024.03.18
[C++] 백준 2562 최댓값  (0) 2024.03.16