-
1926. 간단한 369게임코딩 테스트/SW Expert Academy 2021. 6. 29. 22:44
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