티스토리 뷰



  • ACM 준비를 하다가 풀어본 연습문제이다.

  • 영어라 정확히는 모르겠지만 왼쪽의 문자열(최대 20byte)를 사용해 오른쪽의 문자열(최대 80byte)를 만들 수 있냐는 문제다.

  • 왼쪽의 문자열 중 하나의 문자는 반드시 한번은 사용되어야 하는 것 같고, 오른쪽의 문자열 중에 왼쪽 문자열 중 없는 문자가 없으면 NO를 출력한다. 조건을 만족하면 YES를 출력.

  • 사용한 언어는 C++ 를 가장한 C.


#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int main(void) {
        int num;
        char bank[21];
        char str[81];
        int cnt = 0;
        int strsum = 0;

        scanf("%d", &num);

        for(int i = 0; i < num; i++) {
                scanf("%s", bank);
                scanf("%s", str);

                for(int j = 0; j < strlen(bank); j++) {
                        for(int k = 0; k < strlen(str); k++) {
                                if(bank[j] == str[k]) cnt++;
                        }
                        if(!cnt) {  
                                printf("NO ");
                                goto here;
                        }
                        strsum += cnt;
                        cnt = 0;
                }
                
                if(strsum == strlen(str))
                        printf("YES ");
                else
                        printf("NO ");

here:
                memset(bank, 0sizeof(bank));
                memset(bank, 0sizeof(str));
                strsum = 0;
        }
}


  • 실행시간을 조금이라도 줄이기 위해 goto문을 사용했다. (굳이 if(!cnt) 로 걸러주지 않아도 결과는 같을 것으로 추측)

  • 알고리즘은 왼쪽의 각 문자와 오른쪽의 각 문자를 비교해 카운트를 증가시키고 한 케이스의 검사가 끝났을 때 오른쪽 문자의 길이와 총 카운트의 합을 비교해 같을 경우는 YES. 다를 경우는 NO를 출력한다.

  • 중간에 카운트결과가 0일경우 보나마나 NO이므로 NO를 출력해주고 goto문으로 변수초기화 부분으로 넘어간다.


결과





프로필사진

Yowu (Yu Yongwoo)

그냥 지나가는 흔한 백엔드개발자423 느낌 입니다
우분투 데스크탑 개발 환경을 선호합니다
최근에는 vscode에 vim 모드 올려서 쓰고 있습니다
개발용 키보드는 역시 해피해킹 프로2 무각입니다
락 밴드에서 드럼을 꽤나 오래 쳤었습니다