[ 백준 ] 2659 / 십자카드 문제

金弘均·2021년 9월 14일
0

Baekjoon Online Judge

목록 보기
24/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2659 / 십자카드 문제
 *
 * Kind :: Simulation
 *
 * Insight
 * - 십자모양 카드에서 (위쪽, 오른쪽, 아래쪽, 왼쪽) 을
 *   간단히 (u, r, d, l) 이라고 하자
 *   + urdl 의 모든 조합
 *     즉, 1111 ~ 9999 까지 모든 시계수를 구하고
 *     주어진 십자 카드의 시계수가 몇번째로 작은 시계수인지 알아내면된다
 *
 * - 위처럼 풀 경우 모든 시계수를 구하고
 *   중복되는 시계수를 제거한 뒤 한번 정렬해주어야 한다
 *   + 그러나 위와같은 작업없이 구할 수 있는 좋은 풀이가 있었다
 *     https://browoo.tistory.com/122
 *     # 일단 주어진 십자 카드의 시계수를 구한 뒤
 *       1111 부터 그 시계수 이하의 시계수들만 찾아
 *       몇번째인지 찾는 알고리즘이다
 *       -> 주어진 십자 카드의 시계수를 cn, 몇번째인지 세는 변수를 rank 라고 하고
 *          urdl 순서의 네자릿수의 수가 주어졌을 때 시계수를 반환하는 함수를 clockNum 이라 하면
 *          for (int i=1111; i<=cn; i++) {
 *              if (clockNum(i)) == i) rank++;
 *          }
 *
 * Point
 * - 정말 if (clockNum(i) == i) 로
 *   cn 이하의 시계수를 찾는 알고리즘이 너무 신선하고 우아하다
 *   + 이래서 PS 를 끊을 수 없다니까 ㅋㅋ
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
int clockNum(int n);


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    string s;
    for (int i=0; i<4; i++) {
        char c; cin >> c;
        s += c;
    }

    // Process
    int cn = clockNum(stoi(s)); /* 주어진 십자 카드의 시계수 */

    int ans = 0; /* cn 은 전체 시계수에서 ans 번째 */
    for (int i=1111; i<=cn; i++) {
        /* i 와 clockNum(i) 가 같다면
         * 이는 cn 이하의 시계수를 찾은 것을 뜻함 */
        if (clockNum(i) == i) ans++;
    }

    // Control : Output
    cout << ans << endl;
}

// Helper Functions
int clockNum(int n)
/* 십자 카드에서 urld 에 해당하는 네자릿수의 수가 주어졌을 때 그 카드의 시계수를 반환 */
{
    int ret = n;
    for (int i=0; i<3; i++) {
        n = n % 1000 * 10 + n / 1000;
        ret = min(ret, n);
    } return ret;
}
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글