백준

[C언어/C++] 14370번 전화번호 수수께끼 (Large) + 반례 모음

골드일 2022. 5. 8. 23:48

하................
어렵지 않은 문제인데 제가 허튼짓을 해서 한참 걸린 문제입니다.
Case #1: 이렇게 출력해야 하는데
CASE #1: 이렇게 출력하고 있었네요.....
맞왜틀 40분 동안 하다가 찾아서 고쳐서 맞았습니다.

문제를 일단 보시면 저렇게 무작위로 섞여있는 문자열에서
zero one two three four five six seven eight nine 이 몇 개 들어있는지 찾으면 되는 문제입니다.

잘 보시면 각 단어에 하나밖에 없는 알파벳이 있습니다.
예를 들면
zero에서 z는 0~9에서 유일하죠 ?
four에서 u도 유일합니다.

제가 푼 방법은
1. 알파벳의 개수를 전부 더한 다음에
2. (0으로 예를 들면) z 1개당 z, e, r, o를 각각 하나씩 빼주고
3. brr[0]에 1을 더합니다.
이런 식으로 0, 4, 5, 7 . . . . 순으로 지워줬습니다.
숫자 4 다음에 5를 f로 찾을 수 있는 이유는 4에서 5를 제외한 f가 전부 삭제되었으니 남은 f는 five에서의 f 뿐이겠죠?


마지막에 brr[0] ~ brr[9]까지 배열 안에 더해진 숫자만큼 해당 숫자를 출력해주면 됩니다.
정말 생각도, 코딩으로 구현도 제대로 했지만 출력할 때 오타 때문에 시간 정말 오래 소비했습니다.
여러분은 그럴 일 없겠지만 절대 저 같은 실수 하지 마세요!
참 부끄럽네요...

마지막으로 반례 남기겠습니다.

3
VVVFFFIIIEEEOONEZER
OONEZER
OWT    

Case #1: 01555
Case #2: 01
Case #3: 2
2
VVVFFFIIIEEEOONEZERVVVFFFIIIEEEOONEZERVVVFFFIIIEEEOONEZERVVVFFFIIIEEEOONEZERVVVFFFIIIEEEOONEZER
NOE

Case #1: 0000011111555555555555555
Case #2: 1
2
NNNNNNNNNNEEEEEEIIIIOO
OOIIIIEEEEEENNNNNNNNNN
Case #1: 119999
Case #2: 119999
2 
INNEINNEIINNEENNNNEEOO 
WTO 
Case #1: 119999 
Case #2: 2

제가 해봤던 반례들입니다.
모두 화이팅

#include <stdio.h>
#include <string.h>
int main() {
    int t;
    char s[2000] = {};
    int arr[100] = {}, brr[10] = {};
    scanf("%d", &t);
    for(int i = 0; i < t; i++) {
        scanf("%s", s);
        for(int i = 0; i < strlen(s); i++) {
            char temp = s[i];
            arr[temp]++;
        }
            while(arr['Z'] > 0) {
                brr[0]++;
                arr['Z']--;
                arr['E']--;
                arr['R']--;
                arr['O']--;

            }
            while(arr['U'] > 0) {
                brr[4]++;
                arr['F']--;
                arr['O']--;
                arr['U']--;
                arr['R']--;
            }
            while(arr['F'] > 0) {
                brr[5]++;
                arr['F']--;
                arr['I']--;
                arr['V']--;
                arr['E']--;
            }
            while(arr['V'] > 0) {
                brr[7]++;
                arr['S']--;
                arr['E']--;
                arr['E']--;
                arr['V']--;
                arr['N']--;
            }
            while(arr['X'] > 0) {
                brr[6]++;
                arr['S']--;
                arr['I']--;
                arr['X']--;
            }
            while(arr['W'] > 0) {
                brr[2]++;
                arr['T']--;
                arr['W']--;
                arr['O']--;
            }
            while(arr['G'] > 0) {
                brr[8]++;
                arr['E']--;
                arr['I']--;
                arr['G']--;
                arr['H']--;
                arr['T']--;
            }
            while(arr['H'] > 0) {
                brr[3]++;
                arr['T']--;
                arr['E']--;
                arr['H']--;
                arr['R']--;
                arr['E']--;
            }
            while(arr['I'] > 0) {
                brr[9]++;
                arr['N']--;
                arr['I']--;
                arr['N']--;
                arr['E']--;
            }
            while(arr['O'] > 0) {
                brr[1]++;
                arr['O']--;
                arr['E']--;
                arr['N']--;
            }
            printf("Case #%d: ", i+1);
            for(int i = 0; i < 10; i++) {
                while(brr[i] > 0) {
                    printf("%d", i);
                    brr[i]--;
                }
            }
            printf("\n");
    }
}