12 월 월말평가 모두 고생하셨습니다.
아래에는 답안이 공개되어 있습니다.
답안지 보기 ↓
문제 A: 해피 포인트
난이도: Stone - 1(매우 쉬움)
문제 카테고리: Casting operator, 반복문, 문제해독
문제 해설
Algo가 빵을 살때마다 N가격의 1%만큼 포인트가 쌓이기 때문에 100%가 되려면 100일이 필요하다. 따라서 100일을 출력해주면 되는 문제이다.
답안코드
// C #include<stdio.h>
int main(void){ int bread_price, days; double point = 0;
scanf("%d", &bread_price); for(days = 0; point < bread_price; days++){ point += (double)bread_price / 100; }
printf("%d", days);
return 0; } |
// C++ #include<iostream>
using namespace std;
int main(void){ int bread_price, days; double point = 0;
cin >> bread_price;
for(days = 0; point < bread_price; days++){ point += (double)bread_price / 100; }
cout << days;
return 0; } |
# Python import io import sys
bread_price = int(input()) point = 0 days = 0
while(point < bread_price): point += bread_price / 100 days += 1
print(days) |
// 쉬운 버전 // C #include<stdio.h>
int main(void){
// 1% 는 결국 100%가 되기 위해선 1 x 100이기 때문 printf("100");
return 0; } |
문제 B: 안뚫?
난이도: Stone - 2(쉬움)
문제 카테고리: 문자(Ascii), 문자열 입력
문제 해설
N가 3인 경우를 가정하면 A = D가 되고, Z = C가 된다. 그리고 문자는 ASCII 코드이기 때문에 숫자로 변환이 가능하다. ASCII 코드상 영어 대문자는 65 ~ 90 까지의 정수를 가진다.
답안코드
// C #include<stdio.h>
// 문자열의 최대 길이를 상수로 선언 #define STRING_MAX 101
int main(void){ int secure; char str[STRING_MAX] = {0, };
scanf("%d", &secure); scanf("%s", str);
for(int i=0; str[i] != '\0'; i++){ str[i] = str[i] + secure;
// 만일 입력 Z(90)가 들어오면 N번 만큼 더 // 더하기 때문에 90 + N이 되어버린다. // 그렇기 때문에 알파벳 갯수만큼(26) 빼주어야 // 다시 A(65)로 되돌아간뒤 N번을 표시한다. if(str[i] > 90) str[i] -= 26; }
printf("%s", str);
return 0; } |
// C++ #include <iostream> // C++ 에는 char배열 대신 string 이라는 문자열 // 형식의 데이터 타입이 있습니다. #include <string>
using namespace std;
int main () { int secure; string sec_str;
cin >> secure; cin >> sec_str; for(int i=0; i < sec_str.size(); i++){ sec_str[i] += secure; if(sec_str[i] > 90) sec_str[i] -= 26; }
cout << sec_str;
return 0; } |
# Python import io import sys
secure = int(input()) caiser = str(input()) ans = []
for i, n in enumerate(caiser): ans.append(ord(n) + secure) if(ans[i] > 90): ans[i] -= 26 ans[i] = chr(ans[i]) i += 1
print(''.join(ans))
|
문제 C: N수 평균
난이도: Stone - 2(쉬움)
문제 카테고리: Casting operator
문제 해설
N개의 숫자를 받아 평균을 구하는 문제이다. 하지만 받는 수는 정수이지만, 출력하는 수는 실수로 바꿔야 하므로 형변환(Casting)이 필요한 문제이다.
답안코드
// C #include<stdio.h>
int main(){ int n; int temp, sum; scanf("%d", &n); sum = 0; for(int i=0; i<n; i++){ scanf("%d", &temp); sum += temp; } // int로 받은 정수는 실수로 표현하기 위해 // Casting을 통해 형변환 합니다. // (float)는 int, char -> float으로 변경해줍니다. printf("%0.2f", (float)sum/n); return 0; } |
// C++ #include <iostream>
using namespace std;
int main() { int n, sum = 0;
cin >> n;
for (int i = 0, temp; i < n; i++) { cin >> temp; sum += temp; }
// 자리수 지정 cout << fixed; cout.precision(2); cout << (double)sum/n;
return 0; }
|
# Python import io import sys
numbers = int(input()) sum = 0
for i in range(0, numbers): sum += int(input())
print(round(sum/numbers,2))
|
문제 D: 사과
난이도: Stone - 2(쉬움)
문제 카테고리: 구현
문제 해설
학급수에 따라서 주어진 사과를 학생 수만큼 나머지(%) 연산을 통하면 나눠주고 남은 사과의 갯수가 나온다. 이걸 모두 합치면 나오는 문제이다.
답안코드
// C #include<stdio.h>
int main(){ int class, student, apples, sum = 0;
scanf("%d", &class); for(int i=0; i<class; i++){ scanf("%d %d", &student, &apples); sum = sum + (apples % student); } printf("%d\n", sum); return 0; } |
// C++ #include <iostream>
using namespace std;
int main() { // C++ 에서 class는 시스템에서 이미 사용되는 예약어 이므로 // 앞에 '_' 를 붙이거나 이름을 변경 해주어야 한다. int _class, student, apples, sum=0;
cin >> _class;
for (int i = 0; i < _class; i++) { cin >> student >> apples; sum += apples % student; }
cout << sum;
return 0; } |
# Python import io import sys
_class = int(input()) sum = 0
for i in range(0, _class): student, apples= input().split() sum += int(apples) % int(student)
print(sum) |
스페셜 문제 E: 괄호
난이도: Iron - 1(보통)
문제 카테고리: 자료구조, 스택(Stack)
문제 해설
입력된 “(“ 는 “)”가 1:1로 있어야 할 경우 YES 상태를 유지한다. 만약 “((())” 처럼 들어온 “(“가 3개지만 “)”가 두개일 경우 NO를 출력한다. 따라서 “(“ 마다 하나씩 개수를 세어주고, “)” 들어올때마다 개수를 빼주면 된다.
하지만, 여기서 “)” 가 먼저 들어오는 경우를 생각해야 한다. 이렇게 들어올 경우 무조건 NO 상태가 된다.
해답은 두 가지 방법이 존재한다. 자료구조인 스택을 이용한 방법과 “(“ 가 몇개인지 세어가는 방식으로 이루어진다.
답안코드 1번 (여는 괄호의 개수로 파악)
a. C언어만 답안을 드립니다.
// C #include<stdio.h>
#define MAX_STR 51
int main(){ int n, cnt = 0; char vps[MAX_STR];
scanf("%d", &n);
for(int i=0; i<n; i++){ scanf("%s", vps); cnt = 0; for(int j=0; vps[j] != '\0'; j++){ // 먼저 ')'가 들어오는 경우 예외처리 if(cnt == 0 && vps[j] == ')'){ cnt = -1; break; } if(vps[j] == '('){ cnt++; } else if(vps[j] == ')' && cnt > 0){ cnt--; } } if(cnt == 0) printf("YES\n"); else printf("NO\n"); } return 0; } |
답안코드 2번 (자료구조 스택을 통해 사용)
// C는 크게 차이 나지 않습니다. 오히려 사용하는게 더 어려워요 // 대신 스택 구현 방법에 대해 알아봅시다.
// C 스택 구현법 #include<stdio.h>
#define MAX_STACK_SIZE 100 int stack[MAX_STACK_SIZE]; int top=-1; int IsEmpty(){ if(top<0) return true; else return false; } int IsFull(){ if(top>=MAX_STACK_SIZE-1) return true; else return false; } void push(int value){ if(IsFull()==true) printf("스택이 가득 찼습니다."); else stack[++top]=value; } int pop(){ if(IsEmpty()==true) printf("스택이 비었습니다."); else return stack[top--]; } int main(){ push(3); push(5); push(12); printf("%d ",pop()); printf("%d ",pop()); printf("%d ",pop()); return 0; } |
// C++ #include <iostream> #include <stack> #include <string>
using namespace std;
int main() { int n, err; string vps; stack<char> _stack;
cin >> n;
for (int i = 0; i < n; i++) { cin >> vps; err = 1; while( !_stack.empty() ) _stack.pop(); for(int j=0; j < vps.length(); j++){ if(vps[j] == '(') _stack.push('('); else if(vps[j] == ')'){ if(_stack.empty()){ err = -1; break; } else _stack.pop(); } } if(_stack.empty() && err == 1) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
|
# Python 역시 stack이 따로 구현되진 않으나 배열이 stack 처럼 사용 가능합니다. import io import sys
n = int(input())
for i in range(0, n): vps = input() stk = [] err = 1
for n in vps: if(n == '('): stk.append('(') elif(n == ')'): if(len(stk) <= 0): err = -1 break else: stk.pop()
if(len(stk) == 0 and err == 1): print("YES") else: print("NO")
|