12월 월말평가 답안지

admin 2024-04-24 16:44:33

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), 문자열 입력

문제 해설

N3인 경우를 가정하면 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")