[BAEKJOON 3052번 : 나머지]
[문제]

[고찰]
해당 문제는 10개의 수를 42로 나눈 나머지의 값들 중, 서로 다른 값이 몇 개인지를 파악하면 되는 문제입니다.
저는 문제대로 접근을 했고, 해당 답변으로 문제 풀이에 성공하였습니다.
하지만, 해당 문제를 풀고 다시 복귀할 때의 두 번째 for 문 안에서 서로 다른 값을 구하는 로직이 너무 복잡하고 위험하다는 것을 깨달았습니다.
조건을 3개나 걸고 있기도 하고, else if 문 중 remain[i + 1]로 인해 remain[10]에 접근할 수도 있기 때문입니다.
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int remain[10];
int answer = 0;
for (int i = 0; i < 10; ++i)
{
cin >> remain[i];
remain[i] = remain[i] % 42;
}
sort(remain, remain + 10);
for (int i = 0; i < 10; ++i)
{
if (i == 9 && remain[9] != remain[0])
{
++answer;
}
else if (remain[i] != remain[i + 1])
{
++answer;
}
if (remain[0] == remain[9])
{
answer = 1;
}
}
cout << answer;
return 0;
}
그렇기 때문에 조건을 다시 고민해 보았고, 다른 방법을 찾을 수 있었습니다.
[개념]
for (int i = 0; i < 10; ++i)
{
if (i == 0 || remain[i] != remain[i - 1])
++answer;
}
이렇게 for 문을 구성하면, 안전하면서도 간결하게 서로 다른 값을 구할 수 있습니다.
i는 0일 때 ++answer을 해주는 이유는, 첫 번째로 오는 remain[0]은 첫 번째 요소로 항상 새로운 값으로 계산되어야 하기 때문입니다. 또한, i - 1 인덱스에 안전하게 접근할 수 없는 i = 0 케이스를 별도로 처리하기 위함입니다.
기존처럼 remain[ i ]와 remain[ i + 1]을 비교하는 것이 아닌, remain[ i ]와 remain[ i - 1]을 비교해줌으로써 간결하면서도 안전하게 문제를 풀 수 있습니다.
해당 문제는 bool형 배열을 이용해서도 풀 수있습니다.
[코딩테스트 15일차] BAEKJOON 5073번, 5597번
[BAEKJOON 5073번 : 삼각형과 세 변][문제] [고찰] 해당 문제에 대해 저는 아래의 코드로 답변을 냈습니다.답변은 정답이긴 했지만, 제출하고 나니 if문을 중첩하여 사용할 필요가 없었다는 것을 깨달
sunlight-dby.tistory.com
해당 페이지에서 BAEKJOON 5597번에서도 유사한 아이디어를 사용하고 있습니다.
기본 값이 false로 채워진 bool형 배열을 선언 및 초기화 한 뒤, 입력받은 숫자의 나머지를 인덱스로 접근하여 해당 값을 true로 변경해줍니다. 이렇게되면, 나중에 값이 true인 값의 개수만 구하면 됩니다.
[정리]
문제의 조건을 그저 푸는 데에만 집중하는 것이 아니라, 좀 더 안전하게 푸는 것에도 집중해야 겠습니다.
또한, 기존에 사용했던 것을 잘 활용할 수 있게 복습을 철저히 해야하겠습니다.
[Solution]
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int remain[10];
int answer = 0;
for (int i = 0; i < 10; ++i)
{
cin >> remain[i];
remain[i] = remain[i] % 42;
}
sort(remain, remain + 10);
for (int i = 0; i < 10; ++i)
{
if (i == 0 || remain[i] != remain[i - 1])
++answer;
}
cout << answer;
return 0;
}
[Solution : bool형 배열 사용]
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
bool remain[42] = { false, };
int answer = 0;
for (int i = 0; i < 10; ++i)
{
int num;
cin >> num;
remain[num % 42] = true;
}
for (int i = 0; i < 42; ++i)
{
if (remain[i])
{
++answer;
}
}
cout << answer;
return 0;
}'코딩 테스트' 카테고리의 다른 글
| [코딩테스트 18일차] BAEKJOON 2908번, 2798번 (0) | 2025.05.14 |
|---|---|
| [코딩테스트 17일차] BAEKJOON 1052번, 10809번 (0) | 2025.05.12 |
| [코딩테스트 15일차] BAEKJOON 5073번, 5597번 (0) | 2025.05.06 |
| [코딩테스트 14일차] BAEKJOON 4153번 : 직각삼각형 (0) | 2025.05.06 |
| [코딩테스트 13일차] BAEKJOON 2953번, 3009번, 3053번 (0) | 2025.05.04 |