[BOJ 28358] 생일 맞추기

2023. 7. 22. 19:30Baekjoon/제 7회 천하제일 코딩대회 본선

728x90

https://www.acmicpc.net/problem/28358

 

28358번: 생일 맞추기

첫 번째 테스트 케이스는 아이디에 $0$, $1$, $2$, $3$, $4$가 포함된 경우이다. 태어난 달은 $5$월부터 $9$월 사이, 태어난 일은 $5$일부터 $9$일 사이여야 하므로 생일이 될 수 있는 날짜는 총 $25$개이다.

www.acmicpc.net

 

- 문제 요약

많은 사람이 아이디를 지을 때 생일과 관련된 숫자를 넣지만, 찬우의 아이디에서 등장하는 숫자는 태어난 달이나 태어난 일에 등장하는 숫자들과 하나도 겹치지 않는다.

찬우의 아이디에 어떤 숫자가 포함되어 있는지 주어지면, 찬우의 생일이 될 수 있는 날짜의 수를 구해보자.

찬우가 태어난 해는 윤년이다.

즉, 찬우의 생일은 일이 될 수도 있다.

또한 태어난 달이나 일이 한 자리라면 십의 자리는 빈칸으로 생각한다.

따라서 찬우의 생일이 일이라면 생일에 이 등장하지 않는 것이고, 일 또는 일이라면 생일에 이 등장하는 것이다.

첫째 줄에 테스트 케이스의 수 가 주어진다. (1≤T≤1234)

둘째 줄부터 개의 줄에 걸쳐 한 줄에 하나씩 테스트 케이스가 주어진다.

각 줄에는 개의 정수가 공백으로 구분되어 주어진다.

해당 테스트 케이스에서 이 찬우의 아이디에 등장한다면 번째 정수는 , 등장하지 않는다면 이다. (1≤i≤10)

 

- 알고리즘 정리

 

테스트 케이스의 수가 그리 많지 않으므로 1월 1일부터 12월 31일까지 브루트포스를 돌려줍니다.

1월부터 12월의 일수를 담아놓은 배열인 M[]을 만들고, 반복문을 돌리면서 월 또는 일에 0이 들어가는지를 확인해 주면 쉽게 문제를 해결할 수 있습니다.

 

 

- 코드 작성

 

#include<bits/stdc++.h>
using namespace std;

#define MAX 10
int t,arr[MAX],M[13]={0,31,29,31,30,31,30,31,31,30,31,30,31},cnt;

bool f(int x){
	for(int i=0;i<10;i++){
		if(arr[i]&&to_string(x).find(i+'0')!=string::npos){
			return false;
		}
	}
	return true;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>t;
	while(t--){
		cnt=0;
		for(int i=0;i<10;i++){
			cin>>arr[i];
		}
		for(int i=1;i<=12;i++){
			for(int j=1;j<=M[i];j++){
				if(f(i)&&f(j)){
					cnt++;
				}
			}
		}
		cout<<cnt<<'\n';
	}
}

코드 제출 결과

 

728x90