#include <stdio.h>

int M[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31 };

int is_yun_year(int y)
{
	return (((y % 4) == 0) && ((y % 100 != 0)) || ((y % 400) == 0));
}
int main()
{
	// k = 황금 사과가 수확되기 시작하는 사과와 배의 개수
	// n = 2일마다 수확되는 사과의 개수
	// m = 3일마다 수확되는 배의 개수
	int k, n, m;

	scanf("%d %d %d", &k, &n, &m);

	// k가 수확된 사과와 배의 개수를 저장하는 변수인데
	// 첫날에 사과와 배를 수확했기 떄문에
	// 첫번째로 수확된 사과와 배 제거
	k -= n + m;

	//6일을 기준으로 한 사가와 배의 수확량
	int num6 = 3 * n + 2 * m;

	// days 날에 처음으로 황금사과를 수확
	int days = 0; // 첫번째 황금 사과 수확까지 걸리는 날
	if (k > 0) // 만약 수확해야 하는 사과와 배의 개수가 0보다 크다면
	{
		int x = k / num6; // num6를 반복해야 하는 횟수
		days += x * 6; // days에 x * 6일만큼 사과와 배를 수확

		// k는 총 수확해야하는 사과와 배의 개수이니 
		// k에 x * 6일만큼 수확한 사과와 배를 제거해준다.
		k -= x * num6;

		// 만약 수확해야 하는 사과와 배가 없으면
		// days에 2를 추가해 첫 황금 사과를 수확하는 날짜를 저장한다.
		if (k == 0) days += 2;

		// 만약 수확해야 하는 사과와 배가 2일마다 수확되는 사과의 양보다 작거나 같다면
		// 한번 더 사과를 수확한 후 다음 사과 수확일에 황금 사과를 수확하면 되므로
		// days에 4를 추가해 첫 황금 사과를 수확하는 날짜를 저장한다.
		else if (k <= n) days += 4;

		// 만약 수확해야 하는 사과와 배가 2일마다 수확되는 사과의 양과 3일마다 수확되는 배의 양을 합친 것보다 작거나 같다면
		// 한번 씩 사과와 배를 수확한 후 황금 사과를 수확하면 되므로
		// days에 4를 추가해 첫 황금 사과를 수확하는 날짜를 저장한다.
		else if (k <= n + m) days += 4;

		// 만약 수확해야 하는 사과와 배가 2일마다 수확해야 하는 사과를 2번 수확한 것과 3일마다 수확되는 배의 양을 합친 것보다 작거나 같다면
		// 사과를 두 번 수확하도 배를 한 번 수확하면 황금 사과를 수확하는 날짜가 나오므로
		// days에 6를 추가해 첫 황금 사과를 수확하는 날짜를 저장한다.
		else if (k <= 2 * n + m) days += 6;

		// 위에 작업을 다 거쳤는데도 끝나지 않았다면 num6 과정을 한번 더 하면 되므로
		// days에 8을 더한다.
		else days += 8;
	}
	else days = 2; // 만약 k가 0보다 작다면 다음 사과 수확날에 황금 사과를 수확할 것이므로 days를 2로 정한다.

	int year = 2023, month = 1, day = 1;

	while (1)
	{
		// 만약 is_yun_year 함수에서 결과가 1이 나오면 윤년이란 뜻인데
		// M[2]가 2월 달 끝부분이므로 29로 바꾼다.
		if (is_yun_year(year)) M[2] = 29; 
		else M[2] = 28; // 윤년이 아니면 28로 둔다.
		if (days >= M[month]) // 만약 첫번쨰 황금 사과 수확일이 달 수를 넘어버린다면
		{
			days -= M[month]; // days에 달 수를 빼고
			month++; // 달을 하나 올린다.
			if (month == 13) // 만약 month가 13이면 년도를 올려줘야 하므로
			{
				year++; // 년도를 올려주고
				month = 1; // 달을 1로 바꿔준다.ㄴ
			}
		}
		else break; //days가 M[month]를 넘지 않으면 이 반복문을 나간다.
	}
	// 년도는 4칸에 맞춰서 출력하고
	// 월과 일은 2칸에 맞춰 출력한다.
	printf("%04d/%02d/%02d", year, month, day + days);
}

'SFPC > 2022' 카테고리의 다른 글

2022 SFPC B1  (0) 2023.02.16
2022 SFPC A1  (0) 2023.02.03
2022 SFPC pE1 ver.2  (0) 2023.02.02
2022 SFPC pE1 ver.1  (0) 2023.02.02
2022 SFPC pD1 ver.2  (0) 2023.02.01
2022 SFPC pD1 ver. 1  (0) 2023.02.01

문제 링크

1008번: A/B (acmicpc.net)

 

1008번: A/B

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net


문제

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)


출력

첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.


예제 입력 1                                                                                                  예제 출력 1

     1 3                                                                                       0.33333333333333333333333333333333

10-9 이하의 오차를 허용한다는 말은 꼭 소수 9번째 자리까지만 출력하라는 뜻이 아니다.


예제 입력 2                                                                                                  예제 출력 2

     4 5                                                                                                              0.8

 


소스 코드

#include <stdio.h>

int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	printf("%.9lf", (double)a / b);
	return 0;
}

'백준(BOJ)' 카테고리의 다른 글

백준 15700(타일 채우기 4)  (0) 2022.01.25
백준 14681(사분면 고르기)  (0) 2022.01.25
백준 사이트에 제가 만든 문제가 올라왔습니다.  (1) 2021.12.01
백준 21756(지우개)  (0) 2021.09.08
백준 10998(A×B)  (0) 2021.09.08
백준 10172(개)  (0) 2021.09.08

문제 링크

21756번: 지우개 (acmicpc.net)

 

21756번: 지우개

$N$개의 칸에 $1$ 부터 $N$ 까지의 수들이 왼쪽부터 순서대로 저장되어 있다. 또, 각 칸은 왼쪽부터 $1$ 부터 $N$까지 순서대로 번호가 붙어 있다. 즉, 처음에는 각 칸의 번호와 각 칸에 저장된 수가

www.acmicpc.net


문제

 N개의 칸에 1부터 N까지의 수들이 왼쪽부터 순서대로 저장되어 있다. 또, 각 칸은 왼쪽부터 1부터 N까지 순서대로 번호가 붙어 있다. 즉, 처음에는 각 칸의 번호와 각 칸에 저장된 수가 같다.

아래 그림은 N=7일 때의 예이다.

다음 작업을 수가 정확히 하나가 남을 때 까지 반복한다.

(A) 홀수번 칸의 수들을 모두 지운다 (B) 남은 수들을 왼쪽으로 모은다.

제일 첫 작업의 (A) 단계가 끝나면 칸들의 상태는 다음과 같을 것이다.

(B) 단계가 끝나면 다음과 같을 것이다.

두번째 작업이 진행되면 칸들은 아래 두 그림과 같이 바뀔 것이다.

이제 수가 하나 남았으므로 작업은 더 이상 진행되지 않는다.

 N을 입력으로 받아 위와 같이 작업을 진행했을 때 마지막으로 남는 수를 계산하는 프로그램을 작성하라.


입력

첫 번째 줄에 정수 N이 주어진다.


출력

마지막으로 남는 수를 한 줄에 출력한다.


제한


서브태스크

번호 배점 제한
1 5 입출력 예제만이 주어짐
2 15 N <= 8
3 30 N은  1,2,4,8,16,32,64 중 하나이다. 즉, N은 1이거나, 2이거나, 2를 여러 번 곱한 수 중 하나이다.
4 50 추가 제약 조건 없음

예제 입력 1                                                                                                  예제 출력 1

     1                                                                                                                1


예제 입력 2                                                                                                  예제 출력 2

     2                                                                                                               2


예제 입력 3                                                                                                  예제 출력 3

     5                                                                                                               4


소스 코드

#include <stdio.h>

int a[200], b[200];
int main()
{
	int n, i, j;
	scanf("%d", &n);
	for (i = 0; i < n; i++) //a배열에 1부터 n까지의 숫자로 채운다.
	{
		a[i] = i + 1;
	}

	// n = a 배열의 크기
	while(n > 1)
	{
		// 만약 i / 2를 했을 때 나머지가 1이라면 홀수이므로 b[j]번째에 a[i]번쨰 값을 넣는다.
		// n = a 배열의 크기
		// i = 배열 a의 현재 탐색 위치 (탐색)
		// j = 배열 b의 현재 저장 위치 (저장)
		j = 0;
		for (i = 0; i < n; i++)
		{
			if (i % 2 == 1)
			{
				b[j] = a[i];
				j++;
			}
		}

		// 해야할 일 : b 배열의 값을 a배열에 전부 복사한다.
		// i = b배열의 현재 탐색 위치
		// j = b배열의 크기
		for (i = 0; i < j; i++)
		{
			a[i] = b[i];
		}
		n = j;
	}
	
	for (int i = 0; i < n; i++) //a배열 값을 출력한다.
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

'백준(BOJ)' 카테고리의 다른 글

백준 14681(사분면 고르기)  (0) 2022.01.25
백준 사이트에 제가 만든 문제가 올라왔습니다.  (1) 2021.12.01
백준 1008(A/B)  (0) 2021.09.08
백준 10998(A×B)  (0) 2021.09.08
백준 10172(개)  (0) 2021.09.08
백준 10171(고양이)  (0) 2021.09.08

문제 링크

10998번: A×B (acmicpc.net)

 

10998번: A×B

두 정수 A와 B를 입력받은 다음, A×B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net


문제

두 정수 A와 B를 입력받은 다음, A×B를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)


출력

첫째 줄에 A×B를 출력한다.


예제 입력 1                                                                                            예제 출력 1

     1 2                                                                                                         2

예제 입력 1                                                                                            예제 출력 1

     3 4                                                                                                         12


소스 코드

#include <stdio.h>

int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	printf("%d", a * b);
}

'백준(BOJ)' 카테고리의 다른 글

백준 사이트에 제가 만든 문제가 올라왔습니다.  (1) 2021.12.01
백준 1008(A/B)  (0) 2021.09.08
백준 21756(지우개)  (0) 2021.09.08
백준 10172(개)  (0) 2021.09.08
백준 10171(고양이)  (0) 2021.09.08
백준 10718(We love kriii)  (0) 2021.09.08

문제 링크

10172번: 개 (acmicpc.net)

 

10172번: 개

문제 아래 예제와 같이 개를 출력하시오. 입력 출력 예제 입력 1 복사 예제 출력 1 복사 |\_/| |q p| /} ( 0 )"""\ |"^"` | ||_/=\\__|...

www.acmicpc.net


문제

아래 예제와 같이 개를 출력하시오.


입력

없음.


출력

개를 출력한다.


예제 입력 1                                                                                                                   예제 출력 1

                                                                                                                     

예제 출력 1

 


소스 코드

#include <iostream>

int main(void)
{
    printf("|\\_/|\n");
    printf("|q p|   /}\n");
    printf("( 0 )\"\"\"\\\n");
    printf("|\"^\"`    |\n");
    printf("||_/=\\\\__|\n");

    return  0;
}

'백준(BOJ)' 카테고리의 다른 글

백준 1008(A/B)  (0) 2021.09.08
백준 21756(지우개)  (0) 2021.09.08
백준 10998(A×B)  (0) 2021.09.08
백준 10171(고양이)  (0) 2021.09.08
백준 10718(We love kriii)  (0) 2021.09.08
백준 2557(Hello World)  (0) 2021.09.08

문제 링크

10171번: 고양이 (acmicpc.net)

 

10171번: 고양이

아래 예제와 같이 고양이를 출력하시오.

www.acmicpc.net


문제

아래 예제와 같이 고양이를 출력하시오.


입력

없음.


출력

고양이를 출력한다.


예제 입력 1                                                                                                                   예제 출력 1

                                                                                                                 

예제 출력 1

 


소스 코드

#include <iostream>

int main()
{
    printf("\\    /\\\n");
    printf(" )  ( ')\n");
    printf("(  /  )\n");
    printf(" \\(__)|\n");
   

    return 0;
}

 

'백준(BOJ)' 카테고리의 다른 글

백준 21756(지우개)  (0) 2021.09.08
백준 10998(A×B)  (0) 2021.09.08
백준 10172(개)  (0) 2021.09.08
백준 10718(We love kriii)  (0) 2021.09.08
백준 2557(Hello World)  (0) 2021.09.08
백준 1001(A-B)  (0) 2021.09.08

+ Recent posts