728x90
반응형


문제 풀기 전 생각 :
/*
아홉명의 난장이의 모자에 쓰인 숫자 9개 중 7개를 더했을때
숫자 100이 되는 숫자들이 출력되어야 한다
어느 난쟁이가 가짜인지 판별하려면 모두 더한 값에서 두 숫자를 뺐을때
100이 되면 두 숫자가 모자에 쓰인 난장이가 가짜인것을 알 수 있다
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n[9],sum=0;
for(int i=0 ; i<9 ; i++){
scanf("%d",&n[i]);
sum += n[i];
}
int x,y,flag=0;
for(int i=0 ; i<9 ; i++){
for(int j=0 ; j<9 ; j++){
if(i == j || ((sum-n[i]-n[j]) != 100)) continue;
flag = 1;
x = i;
y = j;
break;
}
if(flag == 1) break;
}
for(int i=0 ; i<9 ; i++){
if(i != x && i != y)
printf("%d\n",n[i]);
}
return 0;
}
https://www.acmicpc.net/problem/3040
3040번: 백설 공주와 일곱 난쟁이
매일 매일 일곱 난쟁이는 광산으로 일을 하러 간다. 난쟁이가 일을 하는 동안 백설공주는 그들을 위해 저녁 식사를 준비한다. 백설공주는 의자 일곱개, 접시 일곱개, 나이프 일곱개를 준비한다.
www.acmicpc.net
풀 때 어려웠던 점 또는 느낀점 :
처음에는 7개의 반복문을 써야 하나? 잠시 고민했지만
두 명만 가짜라는 것을 기억하고
두명의 가짜를 찾아내는 코드를 짰다
재밌는 문제였다
개선방안 :
#include <stdio.h>
int main()
{
int max = -100;
int n[9] = { 0, };
for(int i=0; i<9; i++)
{
scanf("%d", &n[i]);
max += n[i];
}
for (int i = 0; i < 9; i++)
{
int remnant = max - n[i];
for (int j = i + 1; j < 9; j++)
{
if (remnant - n[j] == 0)
{
n[i] = n[j] = 0;
}
}
if (n[i] == 0)break;
}
for (int i = 0; i < 9; i++)
{
if (n[i] == 0) continue;
printf("%d\n", n[i]);
}
}
두 명의 가짜를 찾아내는 접근법은 같다
하지만 나는 플래그로 두 가짜의 인덱스를 저장했지만
위의 코드는 0으로 만들어 0이라면 출력할 때 건너가게 만들었다
좀 더 좋은 방법인듯 하다
728x90
반응형
'Problem Solving' 카테고리의 다른 글
[C++] [백준 2783] 삼각 김밥 (0) | 2021.08.09 |
---|---|
[C++] [LeetCode 543] Diameter of Binary Tree (0) | 2021.08.09 |
[C++] [백준 15552] 빠른 A+B (0) | 2021.08.09 |
[C++] [백준 1920] 수 찾기 (0) | 2021.08.09 |
[C++] [LeetCode 206] Reverse Linked List (0) | 2021.08.09 |
댓글