Compy's Blog
679 words
3 minutes
[BOJ] 십자카드 문제
2025-02-04

십자카드 문제

TimeLimitMemoryLimitConditionTAG
1s128MB(1<= E_i <= 10)BruteForce

3227

위와 같은 십자모양의 한 장의 카드에서, 네 모서리에 1 이상 9 이하의 숫자가 하나씩 씌여 있다. 이 네 개의 숫자 중에는 같은 숫자도 있을 수 있다.

모든 가능한 십자 카드가 주어질 때, 각각의 카드는 다음과 같은 ‘시계수’라는 번호를 가진다. 시계수는 카드의 숫자들을 시계 방향으로 읽어서 만들어지는 네 자리 수들 중에서 가장 작은 수이다. 위 그림의 카드는 시계방향으로 3227, 2273, 2732, 7322로 읽을 수 있으므로, 이 카드의 시계수는 가장 작은 수인 2273이다.

입력으로 주어진 카드의 시계수를 계산하여, 그 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 알아내는 프로그램을 작성하시오.

예를 들어서, 다음과 같은 십자 카드의 시계수는 1122이며, 이 시계수보다 작은 시계수들은 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119 뿐이므로 1122는 10번째로 작은 시계수다. (여기서 십자카드는 0 이 나타날 수 없으므로 1120은 시계수가 될 수 없다. 또한 1121 이 적혀있는 카드의 시계수는 1112이므로, 1121은 시계수가 될 수 없다.

2112

일단 시간보고, 범위 봤더니 아 브포구나 알았구요.. 문제가 돌린다는게 정확히 뭘 구하라는건지 좀 생각을 해봤더니 그렇게 막 꼬아놓은 문제는 아니더군요!

그래서 그냥 브포로 구했습니다.. 처음에 코드를 쓰면서 아.. 더 효율적인 방법이 없나 하면서 풀었네요 허허

정답 코드

참 많이도 돌아갔네요 진짜.. 어휴 코드가 왜 이래.. 진짜 ㅠㅜ

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;


void swap(int* a, int* b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int dice[4];

bool visited[10][10][10][10];

bool check(int value){
    int current[] = {value / 1000, value / 100 % 10, value % 100 / 10, value % 10};
    if(!(current[0] && current[1] && current[2] && current[3])) return true;
    bool flag = false;
    for(int i = 0; i < 4; i++)
        if(visited[current[i]][current[(i+1)%4]][current[(i+2)%4]][current[(i+3)%4]]) flag = true;
    return flag;
}
int main() {
    for(int i = 0; i < 4; i++) cin >> dice[i];    
    int current = 10000000000;
    for(int i = 0; i < 4; i++){
        int currentValue = 0;
        for(int j = 0; j < 4; j++) {
            currentValue*=10;
            currentValue+=dice[j];
        }
        current = min(current, currentValue);

        int first = dice[0];
        for(int j = 0; j < 3; j++) swap(dice[j], dice[j+1]);   
        dice[3] = first;
    }
    
    int result = 1;
    for(int i = 1111; i < current; i++){
        if(check(i)) continue;        
        visited[i / 1000][i / 100 % 10][i % 100 / 10][i % 10] = true;
        result++;
    }
    cout << result;
}
[BOJ] 십자카드 문제
https://compy07.github.io/Blog/posts/boj/2659/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2025-02-04