본문 바로가기
Problem Solving

[C++] [백준 3040] 백설 공주와 일곱 난쟁이

by tls1107 2021. 8. 9.
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
반응형

댓글