크게 두가지의 방법으로 풀 수 있다
- 진짜 난쟁이들의 합이 100인 것을 활용하여 더하여 100인 조합을 찾은 후 이를 출력
- 가짜 난쟁이들의 합은 전체-100인 것을 활용하여 가짜 난쟁이를 거르고 진짜 난쟁이를 출력
->1번째는 9개 중에서 진짜인 7명을 찾아야 되지만 2번째는 가짜인 2명만 찾아내면 되기 때문에 이를 구하는 것이 더 빠르고 효율적일 것 같아 필자는 2번째 방법으로 문제를 풀었다
#include<stdio.h> int main() { int nan[9] = { 0 }; int tn[7] = { 0 }; //진짜 난쟁이들의 키 int sum = 0; //아홉 난쟁이의 키의 합 int over = 0; //sum-100 (넘친 키) int x = 0, y = 0; //가짜 난쟁이가 배열의 몇번째에 있는 지 for (int i = 0; i < 9; i++) { scanf("%d", &nan[i]); sum += nan[i]; } over = sum - 100; for (int i = 0; i < 9; i++) { for (int j = i + 1; i < 9; j++) { if ((nan[i] + nan[j]) == over) { x = i; y = j; break; } } } for (int i = 0; i < 9; i++) //진짜 난쟁이들의 키 배열 { if (i == x && i == y) continue; else { for (int j = 0; j < 7; j++) { tn[j] = nan[i]; } } } for (int i = 0; i < 7; i++) { for (int j = i + 1; j < 7; j++) { if (tn[i] > tn[j]) { int tmp = tn[i]; tn[i] = tn[j]; tn[j] = tmp; } } } for (int i = 0; i < 7; i++) { printf("%d\n", tn[i]); } return 0; }
지금까지 런타임에러는 많이 봤지만 out of bounds는 처음 봐서 당황했다
찾아본 결과 배열의 크기에 벗어나는 값이 입력되면 나오는 error라고 하는 데 추론해본 결과 진짜 난쟁이들을 배열로 넘겨주는 과정에서 error가 난 것 같았다
또한 오름차순 정렬도 굳이 마지막에 할 필요없이 처음에 해도 될 것 같다
생각해보니 아홉 난쟁이들 중에서 진짜 난쟁이를 따로 배열로 넘겨 출력할 필요없이
배열에서 가짜 난쟁이가 있는 순번을 기억한 후 출력을 할 때 그 순번이 온다면 continue를 사용하여 넘기는 식으로 출력하면 문자열 변수 하나를 선언할 필요가 없다!for (int i = 0; i < 8; i++) //가짜 난쟁이 찾기 { for (int j = i + 1; j < 9; j++) { if (nan[i] + nan[j] == sum) //x와 y에 가짜 난쟁이의 위치 저장 { x = nan[i]; y = nan[j]; } } } for (int i = 0; i < 9; i++) { if (nan[i] == x || nan[i] == y) continue; printf("%d\n", nan[i]); }
일곱 난쟁이의 키의 합이 100이기 때문에 가짜 난쟁이 둘의 합은 전체-100인 것을 이용
for (i = 0; i < 9; i++) { scanf("%d", &nan[i]); sum += nan[i]; } sum -= 100; //가짜 난쟁이들의 합
#include<stdio.h>
int main()
{
int nan[10] = { 0 }; //아홉 난쟁이
int sum = 0; //아홉 난쟁이 합
int tmp = 0;
int i, j;
int x = 0, y = 0; //가짜 난쟁이
for (i = 0; i < 9; i++)
{
scanf("%d", &nan[i]);
sum += nan[i];
}
sum -= 100; //가짜 난쟁이들의 합
for (int i = 0; i < 8; i++) //오름차순 정렬
{
for (int j = i + 1; j < 9; j++)
{
if (nan[i] > nan[j])
{
tmp = nan[i];
nan[i] = nan[j];
nan[j] = tmp;
}
}
}
for (int i = 0; i < 8; i++) //가짜 난쟁이 찾기
{
for (int j = i + 1; j < 9; j++)
{
if (nan[i] + nan[j] == sum)
{
x = nan[i];
y = nan[j];
}
}
}
for (int i = 0; i < 9; i++)
{
if (nan[i] == x || nan[i] == y)
continue;
printf("%d\n", nan[i]);
}
}
continue를 잘 사용하지 못했었는 데 이번 기회에 사용하면서 어떤 경우에 continue를 활용할 수 있는 지 확실하게 알게 된 좋은 시간이였다