백준 1145 적어도 대부분의 배수

apircity·2022년 5월 5일
0

boj

목록 보기
5/24
post-thumbnail

boj 1145 적어도 대부분의 배수

📌 how to solve

  • 적어도 대부분의 배수 -> 주어지는 다섯 수 중 최소 3개 이상의 수로 나누어
    떨어지면서 가장 작은 수
    -> 조건을 만족시키면서도 가장 작아야하므로 for문을 활용하여 1부터 조건에
    대입시키고 조건을 만족한다면 break로 빠져나온 후 출력
  • 하지만 조건을 만족하는 숫자가 나올때까지 반복해야되서 끝이 특정되어 있지 않기 때문에 원래 쓰던 for(int i=1; i<n; i++)를 쓸 수 없다
  • 숫자%주어진 숫자=0인 경우 나누어떨어진 것이기 때문에 count+1
  • 이를 5번 반복했을 때 count가 3이상이라면 조건을 만족했기 때문에 출력

💡 idea

  • for문을 활용한 무한 반복문
for(int j=1; j++) //break할때까지 j가 1씩 커지며 무한 반복

-문제에 응용

for (int j = 1;; j++) //조건을 만족하는 적어도 대부분의 배수가 나오면 종료
	{
		for (int i = 0; i < 5; i++)
		{
			if (j % num[i] == 0)
				count++;
		}
		if (count >= 3)
		{
			printf("%d", j);
			break;
		}
		else
            count=0; //중요: 초기화하지 않으면 틀림
    }
  • 적어도 대부분의 수가 아닌 경우 count=0을 하지 않으면 다음 숫자에 전 숫자들이 조건을 만족했던 횟수가 누적되서 들어가기 때문에 실제로는 대부분의 배수가 아닌데도 조건에 맞는 수라고 프로그램이 착각하고 출력하게 됨

🔑 code

#include<stdio.h>
int main()
{
	int num[6] = { 0 };
	int count = 0;
	int i, j;
	for (int i = 0; i < 5; i++)
	{
		scanf("%d", &num[i]);
	}
	for (int j = 1;; j++) //무한반복문
	{
		for (int i = 0; i < 5; i++)
		{
			if (j % num[i] == 0)
				count++;
		}
		if (count >= 3)
		{
			printf("%d", j);
			break;
		}
		else
			count = 0;
	}
	return 0;
}

🎉 후기

for문을 활용하여 어떻게 하면 무한반복문을 만들어야할지 몰라서 검색을 한 후 풀었는 데 다시 생각해보니 while문을 활용해서도 풀 수 있었다.
처음에는 막연하게 어떻게 구현할 수 있을까라는 생각이 들었는데 count를 활용하여
조건을 처리하니 별로 어려운 문제가 아니였다.

✨ plus

  • while문으로 구현
int num=1; //적어도 대부분의 배수 후보
int real=0; //적어도 대부분의 배수
while(1)
{
 ~조건 생략
if(count>=3)
    real=num;
    break;
else
    count=0;
    num++;
}    

-적어도 대부분의 배수는 5개의 숫자 중 가장 작은 수보다 크거나 같으므로 min을 구한 다음에 min부터 for문을 돌리면 시간을 조금이라도 더 줄일 수 있다

profile
junior developer

0개의 댓글