위클리 비타알고 시즌1 코딩테스트 초급부터 중급까지
    • 01
      Intro
    • 알고리즘 공부를 도전하는 여러분에게
    • 02
      19년 03월 위클리 비타알고
    • 03월 1주차: 앵무새 꼬꼬 ★1
      03월 1주차: 앵무새 꼬꼬 해설
      03월 1주차: 인싸가 되고 싶은 민수 ★2
      03월 1주차: 인싸가 되고 싶은 민수 해설
      03월 1주차: 교수님의 과제 폭탄 ★3
      03월 1주차: 교수님의 과제 폭탄 해설
      03월 2주차: 1등과 2등 ★2
      03월 2주차: 1등과 2등 해설
      03월 2주차: 알파벳 트리 장난감 ★2
      03월 2주차: 알파벳 트리 장난감 해설
      03월 2주차: 동전 줍기 대회★2
      03월 2주차: 동전 줍기 대회 해설
      03월 3주차: 외계인과 용돈 기입장 ★2
      03월 3주차: 외계인과 용돈 기입장 해설
      03월 3주차: 불이야!! ★2
      03월 3주차: 불이야!! 해설
      03월 3주차: 여름의 대삼각형 ★1
      03월 3주차: 여름의 대삼각형 해설
      03월 4주차: A4 용지를 만들자 ★2
      03월 4주차: A4 용지를 만들자 해설
      03월 4주차: 1차원 뿌요뿌요 ★3
      03월 4주차: 1차원 뿌요뿌요 해설
      03월 4주차: 알파벳 삼각 장난감 ★3
      03월 4주차: 알파벳 삼각 장난감 해설
    • 03
      19년 04월 위클리 비타알고
    • 04월 1주차: 방 탈출하기 ★2
      04월 1주차: 방 탈출하기 해설
      04월 1주차: 숫자 블럭 쌓기 ★3
      04월 1주차: 숫자 블럭 쌓기 해설
      04월 1주차: 행성을 관측하는 할아버지의 이야기 ★3
      04월 1주차: 행성을 관측하는 할아버지의 이야기 해설
      04월 2주차: 시간복잡도 ★2
      04월 2주차: 시간복잡도 해설
      04월 2주차: 두루마리 휴지 공장 ★3
      04월 2주차: 두루마리 휴지 공장 해설
      04월 2주차: 초급 마법사의 시험 ★4
      04월 2주차: 초급 마법사의 시험 해설
      04월 3주차: 탈옥수 ★3
      04월 3주차: 탈옥수 해설
      04월 3주차: 다람쥐와 도토리 ★4
      04월 3주차: 다람쥐와 도토리 해설
      04월 3주차: 스마트폰 내구성 테스트 ★4
      04월 3주차: 스마트폰 내구성 테스트 해설
      04월 4주차: JMOS ★3
      04월 4주차: JMOS 해설
      04월 4주차: 어려운 문제 ★2
      04월 4주차: 어려운 문제 해설
      04월 4주차: 제설작전 ★4
      04월 4주차: 제설작전 해설
    • 04
      19년 05월 위클리 비타알고
    • 05월 1주차: T세포 ★2
      05월 1주차: T세포 해설
      05월 1주차: 새로운 암호화 ★3
      05월 1주차: 새로운 암호화 해설
      05월 1주차: 스탈린 정렬 ★4
      05월 1주차: 스탈린 정렬 해설
      05월 2주차: 파손된 램 ★1
      05월 2주차: 파손된 램 해설
      05월 2주차: 어부의 고기잡이 ★3
      05월 2주차: 어부의 고기잡이 해설
      05월 2주차: 막대기로 하는 재미있는 놀이 ★5
      05월 2주차: 막대기로 하는 재미있는 놀이 해설
      05월 3주차: 거울 단어 ★1
      05월 3주차: 거울 단어 해설
      05월 3주차: 환경과 쥐 크기의 상관관계 ★3
      05월 3주차: 환경과 쥐 크기의 상관관계 해설
      05월 3주차: 비밀번호 찾기 ★5
      05월 3주차: 비밀번호 찾기 해설
      05월 4주차: 태민이의 취미 ★1
      05월 4주차: 태민이의 취미 해설
      05월 4주차: 플래카드 ★4
      05월 4주차: 플래카드 해설
      05월 4주차: 물질과 반물질 ★4
      05월 4주차: 물질과 반물질 해설
      05월 5주차: 소희와 버스 ★2
      05월 5주차: 소희와 버스 해설
      05월 5주차: 징검다리 건너기 ★3
      05월 5주차: 징검다리 건너기 해설
      05월 5주차: 그룹 지정 ★4
      05월 5주차: 그룹 지정 해설
    • 05
      19년 06월 위클리 비타알고
    • 06월 1주차: 의좋은 형제 ★1
      06월 1주차: 의좋은 형제 해설
      06월 1주차: 영상처리 ★3
      06월 1주차: 영상처리 해설
      06월 1주차: 신이 바라보는 세상 ★5
      06월 1주차: 신이 바라보는 세상 해설
      06월 2주차: 진법 변환 ★1
      06월 2주차: 진법 변환 해설
      06월 2주차: 기숙사 신설 ★4
      06월 2주차: 기숙사 신설 해설
      06월 2주차: 사람의 유형 ★5
      06월 2주차: 사람의 유형 해설
      06월 3주차: 출석부 ★2
      06월 3주차: 출석부 해설
      06월 3주차: K-거리 수 ★3
      06월 3주차: K-거리 수 해설
      06월 3주차: 해외 여행 ★4
      06월 3주차: 해외여행 해설
      06월 4주차: 스나이퍼 ★3
      06월 4주차: 스나이퍼 해설
      06월 4주차: 수열의 최대공약수 ★4
      06월 4주차: 수열의 최대공약수 해설
      06월 4주차: 자리 배치 ★5
      06월 4주차: 자리 배치 해설
    • 06
      19년 07월 주간 알고리즘
    • 07월 1주차: 정사각형의 개수 ★1
      07월 1주차: 정사각형의 개수 해설
      07월 1주차: 구슬 주머니 ★3
      07월 1주차: 구슬 주머니 해설
      07월 1주차: 경험치 쿠폰 ★4
      07월 1주차: 경험치 쿠폰 해설
      07월 2주차: 80% 초특가 세일 이벤트 ★3
      07월 2주차: 80% 초특가 세일 이벤트 해설
      07월 2주차: 외주 ★4
      07월 2주차: 외주 해설
      07월 2주차: 판 겹치기 ★5
      07월 2주차: 판 겹치기 해설
      07월 3주차: 두부 자르기 ★2
      07월 3주차: 두부 자르기 해설
      07월 3주차: 과자탑 높이 맞추기 ★3
      07월 3주차: 과자탑 높이 맞추기 해설
      07월 3주차: 트리의 아름다움 ★5
      07월 3주차: 트리의 아름다움 해설
      07월 4주차: 고장난 컴퓨터 ★1
      07월 4주차: 고장난 컴퓨터 해설
      07월 4주차: 개미 집합의 지름 ★2
      07월 4주차: 개미 집합의 지름 해설
      07월 4주차: 최대 자리곱 ★3
      07월 4주차: 최대 자리곱 해설
      07월 5주차: 재원 넘버 ★2
      07월 5주차: 재원 넘버 해설
      07월 5주차: 구름공원 ★3
      07월 5주차: 구름공원 해설
      07월 5주차: 비타민 주스 ★4
      07월 5주차: 비타민 주스 해설
    • 07
      19년 08월 위클리 비타알고
    • 08월 1주차: 평행선 ★3
      08월 1주차: 평행선 해설
      08월 1주차: 문자열 장난 ★4
      08월 1주차: 문자열 장난 해설
      08월 1주차: 잡초 제거 ★5
      08월 1주차: 잡초 제거 해설
      08월 2주차: 뱀이 지나간 자리 ★1
      08월 2주차: 뱀이 지나간 자리 해설
      08월 2주차: ab를 bba로 ★4
      08월 2주차: ab를 bba로 해설
      08월 2주차: 순열과 1비트 ★4
      08월 2주차: 순열과 1비트 해설
    • 08
      Outro
    • 이제까지 함께 고생한 여러분에게
    03월 1주차: 앵무새 꼬꼬 해설
    02 19년 03월 위클리 비타알고
    03월 1주차: 앵무새 꼬꼬 해설

    출제 의도


    • 구현

    문제가 요구하는 대로 구현할 수 있는지 확인하는 문제입니다.


    문제 해설


    처음에 테스트케이스의 수를 입력받고, 그 다음 줄부터 공백이 포함된 문자열이 입력으로 주어집니다. 한 줄을 통째로 입력받을 때 C언어의 경우는 fgets함수를 사용할 수 있고, C++의 경우는 std::getline 함수를 사용할 수 있습니다. 문자열을 입력받은 후, 이 문자열을 처음부터 순회하면서 알파벳 모음인지 아닌지를 판별하는 것이 중요합니다. 현재 문자가 모음인지 확인하려면 어떻게 하면 좋을까요? 모음은 소문자 a, e, i, o, u와 대문자 A, E, I, O, U로 총 10가지의 경우가 있습니다. 물론 다음과 같이 if 문이나 switch 문으로 10가지의 경우를 모두 처리해줄 수도 있습니다.

    // if문 사용
    if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
    ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U') putchar(ch);
    // switch문 사용
    switch (ch) {
    case 'a': case 'e': case 'i': case 'o': case 'u':
    case 'A': case 'E': case 'I': case 'O': case 'U':
    putchar(ch); break; defalut:
    break; }

    하지만... 너무 번거롭죠? 비교해야 할 경우를 10가지에서 5가지로 줄이는 방법이 있습니다. 현재 문자를 대문자든 소문자든 항상 소문자로 취급한다고 하면 가능한데요, 대문자를 소문자로 취급하는 방법은 대문자와 소문자의 아스키 코드 값이 32가 차이 남을 이용할 수 있습니다. ch | 32 처럼 bitwise-or 연산자를 이용해 32와 입력받은 문자를 or 연산하면 소문자를 얻을 수 있습니다. 물론 ch가 알파벳이 아닌 다른 특수 문자였다면 32와 or 연산한 결과 역시 알파벳이 아니므로 이 부분은 신경쓰지 않아도 됩니다.

    이러한 방법뿐만 아니라 대부분의 언어 라이브러리엔 주어진 문자열에서 특정 문자를 찾는 함수가 이미 존재합니다. C/C++는 물론이고 자바, 파이썬도 마찬가지입니다. C에는 strchr 함수, C++의 string 클래스에는 find 메소드, 자바의 String 클래스에는 indexOf 메소드, 파이썬은 아예 in 연산자로 확인이 가능합니다. 따라서 현재 문자를 32와 or 연산한 뒤 "aeiou" 문자열에서 현재 문자를 찾아, 있으면 출력하고 없으면 그대로 넘어가면 됩니다.

    그럼 이걸로 끝난 걸까요? 그렇게 생각하신다면, 문제를 다시 한 번 잘 읽어보셔야 합니다. 문제 조건에 소문자가 없으면 ???을 출력하라는 말이 있었지요. 따라서 상태 변수 하나를 만들어 처음에 0으로 초기화하고 한번이라도 모음이 있었으면 1로 만들고 마지막에 0이면 ???을 출력하면 됩니다. 물론 이는 풀이에 따라 다른데, 제때 출력하지 않고 배열 등에 저장하여 프로그램이 끝나기 직전 한꺼번에 출력한다면 모아둔 개수를 확인하면 되니 따로 상태 변수가 필요 없습니다.

    ※ 다른 언어로 작성한 알고리즘 코드에 대한 질문은 QnA 게시판을 이용해주시기 바랍니다.


    C++ 답안 코드


    컴파일러 설정 gcc 5.4, 언어 설정 -std=c++17 -02 -Wall -lm 기준입니다.

    cpp
    실행 결과를 확인해보세요!
    질문하기