ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1926. 간단한 369게임
    코딩 테스트/SW Expert Academy 2021. 6. 29. 22:44

    https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PTeo6AHUDFAUq&categoryId=AV5PTeo6AHUDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=30&pageIndex=1 

     

    SW Expert Academy

    SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

    swexpertacademy.com

     

    문제 이해

     -> 369 프로그램을 제작하는 프로그램

     -> 3, 6, 9가 들어가는 수는 말하지 않는 대신 박수를 친다.

     -> 박수는 해당 숫자가 들어간 개수만큼 쳐야 한다.

     -> 예시로 35의 경우 박수 한 번을 치고, 36인 경우 박수를 두 번 처야한다.

     

     

    문제 주의

     -> 10 이상 1000 이하의 정수 범위의 N이 주어짐

     -> 박수를 치는 부분은 숫자 대신, 박수 횟수에 맞게 "-" 로 출력

     -> 주의할 점은 박수 한 번 칠때는 - 이며, 박수를 두 번 칠 때는 - - 가 아닌 --이므로 띄어쓰기에 주의

     

     

     

    문제 풀이 (1)    // 불합격 코드

     -> 반복문을 통해 1부터 100까지의 숫자를 Func 함수에 넣는다.

     -> Func 함수는 재귀 형식을 띄고 있으며 십의 자리가 넘어갈 시 재귀로 빠지게 된다.

     -> 우선, 일의 자리 수인 경우 나머지연산을 통해 숫자를 구한다.

     -> 구한 나머지 숫자로 3, 6, 9 가 포함되어 있는지 검증을 실시한다.

     -> 만일 포함되어 있다면 "-" 을 출력하고 함수를 종료한다.

     

     -> 혹은, 십의 자리 수인 경우 10으로 나눈 몫을 재귀호출로 빠지게 한다.

     -> 해당 몫은 일의 자리로 되며, 위 방식을 한번 더 거치게 된다.

     -> 또한 함수를 빠져나오게 되면 재귀호출로 얻은 값으로 본래의 함수를 실행하게 된다.

     -> 예시로 12가 들어온다면 십의 자리이므로 1을 몫으로 함수를 실행한다.

     -> 1는 369에 해당하지 않으므로 1를 출력하고 함수는 종료된다.

     -> 그 후 원래의 12에서 일의 자리인 2를 몫으로 함수를 실행한다.

     -> 2는 369에 해당하지 않으므로 2를 출력하고 함수는 종료된다.

     

     -> 단, 이 문제 풀이는 불합격을 받았는데, 문제 구문을 제대로 이해하지 못한 코드이다.

     -> 문제에서는 해당 숫자에 맞춰 - 출력하는 것인데 이 코드는 그렇지 못하다.

     -> 예시로 49 라는 숫자가 있다면 4- 를 출력하는 것이지만,

     -> 문제가 요구하는 출력값은 - 이다.

     -> 이는 3, 6, 9 라는 숫자를 -으로 지워버리는 것이 아닌,

     -> 3, 6, 9 라는 숫자가 들어있다면 그 숫자의 개수에 맞춰 -를 출력하는 문제였다.

     

    #include <iostream>
    using namespace std;
    
    void Func(int _num)
    {
        if (_num >= 10)
            Func(_num / 10);
    
        int tempNum = _num % 10;
    
        if (tempNum == 0)
            cout << tempNum;
        else if (tempNum % 3 == 0 || tempNum % 6 == 0 || tempNum % 9 == 0)
            cout << "-";
        else
            cout << tempNum;
    
    }
    
    int main()
    {
        int testCase;
        cin >> testCase;
    
        for (int i = 1; i <= testCase; i++)
        {
            Func(i);
            cout << " ";
        }
    
        return 0;
    }
    1 2 - 4 5 - 7 8 - 10 11 12 1- 14 15 1- 17 18 1- 20 21 22 2- 24 25 2- 27 28 2- -0 -1 -2 -- -4 -5 -- -7 -8 -- 40 41 42 4- 44 45 4- 47 48 4- 50 51 52 5- 54 55 5- 57 58 5- -0 -1 -2 -- -4 -5 -- -7 -8 -- 70 71 72 7- 74 75 7- 77 78 7- 80 81 82 8- 84 85 8- 87 88 8- -0 -1 -2 -- -4 -5 -- -7 -8 -- 100

     

    // https://zetawiki.com/wiki/SWEA_1926_%EA%B0%84%EB%8B%A8%ED%95%9C_369%EA%B2%8C%EC%9E%84

    // 위 링크를 코드 리뷰 형식으로 문제 풀이

    문제 풀이 (2)

     -> 반복문을 통해 1부터 100까지 반복한다.

     -> 반복문 안의 숫자는 count369 함수로 들어가게 된다.

     -> 예시로 37이라는 숫자가 있다면, 먼저 일의 자리를 나머지 연산으로 구한다.        // 7

     -> 7이 3,6,9 에 해당되어 있다면 함수 내의 count 변수가 1 올라간다.

     -> 하지만 7은 해당되어 있지 않으므로 if문의 구문을 벗어난다.

     -> 그 후 37의 수를 10으로 나눠 3을 챙긴다.

     -> while 반복문에 의해 위 과정을 다시 반복한다.

     -> 3은 3, 6, 9에 해당되어 있으므로 count 변수가 1 올라간다.

     -> 그 후 3의 수를 10으로 나눠 0을 챙긴다.

     -> 이 때, 10은 if문에 의해 반복문을 탈출한다.

     -> 끝으로 count 변수를 반환한다.     // 1

     

     -> main 함수로 돌아와서 count 변수는 0이 아니므로 이중 반복문으로 들어간다.

     -> count 변수는 1의 값을 가지고 있으므로 - 를 1번 출력한다.

     -> 만일, 28 이라는 수가 있다면 count369 함수를 거쳤을 때 count 변수는 0이므로 숫자를 단순출력하고 넘어간다.

     

    // https://zetawiki.com/wiki/SWEA_1926_%EA%B0%84%EB%8B%A8%ED%95%9C_369%EA%B2%8C%EC%9E%84
    
    #include <iostream>
    using namespace std;
    
    int N;
    int count369(int n) {
    	int count = 0;
    	while (true) {
    		int digit = n % 10;
    		if (digit == 3 || digit == 6 || digit == 9) count++;
    		n /= 10;
    		if (n == 0)break;
    	}
    	return count;
    }
    int main() {
    	scanf_s("%d", &N);
    	for (int i = 1; i <= N; i++) {
    		int count = count369(i);
    		if (count == 0) {
    			printf("%d ", i);
    			continue;
    		}
    		for (int j = 0; j < count; j++) {
    			printf("-");
    		}
    		printf(" ");
    	}
    }
    1 2 - 4 5 - 7 8 - 10 11 12 - 14 15 - 17 18 - 20 21 22 - 24 25 - 27 28 - - - - -- - - -- - - -- 40 41 42 - 44 45 - 47 48 - 50 51 52 - 54 55 - 57 58 - - - - -- - - -- - - -- 70 71 72 - 74 75 - 77 78 - 80 81 82 - 84 85 - 87 88 - - - - -- - - -- - - -- 100

    '코딩 테스트 > SW Expert Academy' 카테고리의 다른 글

    1204. 최빈수 구하기  (0) 2021.07.03
    1966. 숫자를 정렬하자  (0) 2021.06.30
    1928. Base64 Decoder  (0) 2021.06.28
    1954. 달팽이 숫자  (0) 2021.06.24
    1970. 쉬운 거스름돈  (0) 2021.06.23

    댓글