𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 2840번: ν–‰μš΄μ˜ 바퀴 - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 2840번: ν–‰μš΄μ˜ 바퀴 - C++

.23 2022. 1. 13. 18:07
문제

μƒλ•μ΄λŠ” μ΅œκ·Όμ— ν–‰μš΄μ˜ 바퀴λ₯Ό κ΅¬λ§€ν–ˆλ‹€. μƒλ•μ΄λŠ” λ°”ν€΄μ˜ 각 칸에 μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ₯Ό μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 μ μ—ˆλ‹€.

바퀴에 같은 κΈ€μžλŠ” 두 번 이상 λ“±μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 또, λ°”ν€΄λŠ” μ‹œκ³„λ°©ν–₯으둜만 λŒμ•„κ°„λ‹€. 바퀴 μ˜†μ—λŠ” ν™”μ‚΄ν‘œκ°€ μžˆλŠ”λ°, 이 ν™”μ‚΄ν‘œλŠ” 항상 ν•œ 곳을 가리킀고 있으며, λŒμ•„κ°€λŠ” λ™μ•ˆ κ°€λ¦¬ν‚€λŠ” κΈ€μžλŠ” λ°”λ€Œκ²Œ λœλ‹€. μœ„μ˜ κ·Έλ¦Όμ—μ„œλŠ” Hλ₯Ό 가리킀고 μžˆλ‹€.

μƒλ•μ΄λŠ” 바퀴λ₯Ό μ—°μ†ν•΄μ„œ K번 돌릴 것이닀. 맀번 바퀴λ₯Ό 돌릴 λ•Œ λ§ˆλ‹€, μƒλ•μ΄λŠ” ν™”μ‚΄ν‘œκ°€ κ°€λ¦¬ν‚€λŠ” κΈ€μžκ°€ λ³€ν•˜λŠ” νšŸμˆ˜μ™€ μ–΄λ–€ κΈ€μžμ—μ„œ νšŒμ „μ„ λ©ˆμΆ”μ—ˆλŠ”μ§€λ₯Ό 쒅이에 μ λŠ”λ‹€.

ν¬μ›μ΄λŠ” 상덕이가 적어놓은 쒅이λ₯Ό λ°œκ²¬ν–ˆλ‹€. κ·Έ 쒅이λ₯Ό λ°”νƒ•μœΌλ‘œ 상덕이가 바퀴에 적은 μ•ŒνŒŒλ²³μ„ μ•Œμ•„λ‚΄λ €κ³  ν•œλ‹€.

상덕이가 쒅이에 적어놓은 λ‚΄μš©κ³Ό λ°”ν€΄μ˜ 칸의 μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 바퀴에 적어놓은 μ•ŒνŒŒλ²³μ„ μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 λ°”ν€΄μ˜ 칸의 수 Nκ³Ό 상덕이가 바퀴λ₯Ό λŒλ¦¬λŠ” 횟수 Kκ°€ 주어진닀. (2 ≤ N ≤ 25, 1 ≤ K ≤ 100)

λ‹€μŒ 쀄뢀터 Kμ€„μ—λŠ” 바퀴λ₯Ό νšŒμ „μ‹œμΌ°μ„ λ•Œ ν™”μ‚΄ν‘œκ°€ κ°€λ¦¬ν‚€λŠ” κΈ€μžκ°€ λͺ‡ 번 λ°”λ€Œμ—ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” S와 νšŒμ „μ„ λ©ˆμΆ”μ—ˆμ„ λ•Œ κ°€λ¦¬ν‚€λ˜ κΈ€μžκ°€ 주어진닀. (1 ≤ S ≤ 100)

 

좜λ ₯

첫째 쀄에 λ§ˆμ§€λ§‰ νšŒμ „μ—μ„œ ν™”μ‚΄ν‘œκ°€ κ°€λ¦¬ν‚€λŠ” λ¬ΈμžλΆ€ν„° μ‹œκ³„λ°©ν–₯으둜 바퀴에 적어놓은 μ•ŒνŒŒλ²³μ„ 좜λ ₯ν•œλ‹€. μ΄λ•Œ, μ–΄λ–€ κΈ€μžμΈμ§€ κ²°μ •ν•˜μ§€ λͺ»ν•˜λŠ” 칸은 '?'λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½, 상덕이가 적어놓은 쒅이에 ν•΄λ‹Ήν•˜λŠ” ν–‰μš΄μ˜ 바퀴가 μ—†λ‹€λ©΄ "!"λ₯Ό 좜λ ₯ν•œλ‹€. 


μ• λ₯Ό 많이 λ¨Ήμ—ˆλ˜ 문제...

문제 해석이 어렡기도 ν–ˆκ³  μ˜ˆμ™Έμ²˜λ¦¬ 쑰건이 λΉ‘μ…Œλ‹€.

 

λ‚˜λ¦„μ˜ λ…Όλ¦¬λ‘œ ν’€μ—ˆλ˜ λ‹΅μ•ˆμ΄ μžˆμ—ˆλŠ”λ°, λͺ¨λ“  μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ€¬μŒμ—λ„ μ–΄λ–€ κ²½μš°μ—μ„œ κ±Έλ¦¬λŠ”μ§€ λ°˜λ‘€λ₯Ό λͺ»μ°Ύμ•„μ„œ κ²°κ΅­ μ œμΆœμ€ κ΅¬κΈ€λ§ν•΄μ„œ μ°Έκ³ ν•œ λ‹΅μ•ˆμœΌλ‘œ ν–ˆλ‹€.

μƒκ°ν•΄μ€˜μ•Ό ν•˜λŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

  1. μƒˆλ‘œ λ“€μ–΄κ°€μ•Ό ν•  칸에 같은 문자 λ˜λŠ” ?이 μ•„λ‹Œ λ‹€λ₯Έ λ¬Έμžκ°€ λ“€μ–΄κ°€μžˆλŠ” 경우
  2. μ€‘λ³΅λœ λ¬Έμžκ°€ 같은 칸이 μ•„λ‹Œ λ‹€λ₯Έ 칸에 λ“€μ–΄μžˆλŠ” 경우

κ°€μž₯ λ§ˆμ§€λ§‰ 문자λ₯Ό κΈ°μ€€μœΌλ‘œ 좜λ ₯ν•˜λŠ” 것이기 λ•Œλ¬Έμ— μ΄μ—λ§Œ 더 μœ μ˜ν•΄μ£Όλ©΄ λœλ‹€.

 

더보기
#include <cstdio>
#include <cstring>
#include <vector>
#define MAX 26

using namespace std;

vector<pair<int, char> > roulette;

int main(void) {
    int N, K;
    scanf("%d %d", &N, &K);

    roulette.resize(K);
    for(int i = 0; i < K; i++) {
        scanf("%d %c", &roulette[i].first, &roulette[i].second);
    }

    char wheel[MAX];
    memset(wheel, '?', MAX);

    int alphabet[26] = { 0 }; // 쀑볡성 체크용

    wheel[0] = roulette[K - 1].second;
    int pos = 0;
    for(int i = K - 2; i >= 0; i--) {
        int index = (pos + roulette[i + 1].first) % N;
        if(wheel[index] != roulette[i].second && wheel[index] != '?') {
            printf("!\n");
            return 0;
        }
        wheel[index] = roulette[i].second;
        pos = index;
    }

    for(int i = 0; i < N; i++) { // 같은 κΈ€μž 두 번 이상 λ“±μž₯ν•˜λŠ”μ§€ 검사
        alphabet[wheel[i] - 'A']++;
        if(alphabet[wheel[i] - 'A'] > 1 && wheel[i] != '?') {
            printf("!\n");
            return 0;
        }
    }

    for(int i = 0; i < N; i++) {
        printf("%c", wheel[i]);
    }
    printf("\n");
    return 0;
}

 

μ½”λ“œ
#include <cstdio>
#include <cstring>
#define MAX 25

int main(void) {
    int N, K;
    scanf("%d %d", &N, &K);

    char roulette[MAX];
    memset(roulette, '?', MAX);

    int index = 0;
    for(int i = 0; i < K; i++) {
        int pos;
        char c;
        scanf("%d %c", &pos, &c);

        pos %= N;
        if(index - pos < 0) index = index - pos + N;
        else index -= pos;

        if(roulette[index] != c && roulette[index] != '?') {
            printf("!\n");
            return 0;
        }

        roulette[index] = c;
    }

    for(int i = 0; i < N; i++) {
        for(int j = i + 1; j < N; j++) {
            if(roulette[i] != '?' && roulette[i] == roulette[j]) {
                printf("!\n");
                return 0;
            }
        }
    }

    for(int i = 0; i < N; i++) { // λ§ˆμ§€λ§‰ indexλΆ€ν„° μ‹œμž‘
        printf("%c", roulette[(i + index) % N]);
    }
    printf("\n");

    return 0;
}
Comments