문제링크 : https://www.acmicpc.net/problem/2659
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = INT_MAX;
int a, b, c, d;
bool visited[9999];
int func(int a, int b, int c, int d) //제일 작은 시계수 구하기
{
int num1 = a*1000 + b*100 + c*10 + d;
int num2 = b*1000 + c*100 + d*10 + a;
int num3 = c*1000 + d*100 + a*10 + b;
int num4 = d*1000 + a*100 + b*10 + c;
return min({num1, num2, num3, num4});
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> a >> b >> c >> d;
int base = func(a, b, c, d);
for(int i=1; i<10; i++)
{
for(int j=1; j<10; j++)
{
for(int k=1; k<10; k++)
{
for(int l=1; l<10; l++)
{
int tmp = func(i, j, k, l); //모든 경우에 대해 시계수 구하기
if(visited[tmp]) continue;
visited[tmp]=1; //시계수 체크
}
}
}
}
int cnt = 0;
for(int i=1111; i<=base; i++) //base값 전의 시계수 카운팅
{
if(visited[i]) cnt++;
}
cout << cnt;
return 0;
}
총 자릿수가 4자리이고, 각 자릿수당 9가지여서 경우의 수가 생각보다 적다.
따라서 4중 for문을 이용해 모든 경우에 대해 시계수를 구하도록 하였다.
시계수를 구하는 과정도 케이스가 4가지 밖에 되지 않기 때문에 전부 직접 적어서 확인하고 가장 작은 값을 리턴하도록 하였다.
이후에 가능한 가장 작은 시계수인 1111부터 입력받은 값을 베이스로한 시계수 사이의 값을 카운팅하여 출력해주면 된다.
'백준 > 실버' 카테고리의 다른 글
[백준 1246번] 온라인 판매 (C++) (0) | 2024.05.05 |
---|---|
[백준 1485번] 정사각형 (C++) (0) | 2024.05.04 |
[백준 11536번] 줄 세우기 (C++) (0) | 2024.05.02 |
[백준 14729번] 칠무해 (C++) (0) | 2024.05.01 |
[백준 5648번] 역원소 정렬 (C++) (0) | 2024.04.30 |