7번 과제 안 내신 분

문제

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 

 

교수님이 내준 특별과제를 28명이 제출했는데, 그중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

 

입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

 

출력

출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그다음 출석번호를 출력한다.

 

배열 사이즈는 학생 수만큼, 각 인덱스에는 다음 입력에서 들어오는 과제를 제출한 학생의 출석번호 - 1의 인덱스에 체크를 해준다.

 

C++

#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<int> num_vec(30);
    for (int i = 0; i < 28; i++){
        int num;
        cin >> num;
        num_vec[num - 1] = 1;
    }
    int count = 1;
    for (int i : num_vec){
        if (i != 1){
            cout << count << "\n";
        }
        count++;
    }
    return 0;
}

 

과제를 제출한 학생의 인덱스는 1의 값으로 체크해 두고 출력 시 확인한다.

 

C#

using System;
using System.Collections.Generic;
class Program{
    static void Main(string[] args){
        List<int> num_list = new List<int>(new int[30]);
        for (int i = 0; i < 28; i++){
            int num = int.Parse(Console.ReadLine());
            num_list[num - 1] = 1;
        }
        int count = 1;
        foreach(int i in num_list){
            if (i != 1)
                Console.WriteLine(count);
            count++;
        }
    }
}

 

Python

num_list = [0] * 30
for i in range(28):
    num = int(input())
    num_list[num - 1] = 1
count = 1
for i in range(30):
    if num_list[i] != 1:
        print(f"{count}")
    count += 1

 

8번 나머지

문제

두 자연수 A와 B가 있을 때, A% B는 A를 B로 나눈 나머지이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 

 

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄부터 열 번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

 

출력

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

 

입력받은 수를 42로 나누고 나머지를 저장해 둔다. 이 나머지 중에서 서로 다른 것들만 출력한다.

입력되는 수의 범위는 0이 아닌 1000 이하의 정수이다. 배열에 나머지를 저장할 때 요소에 해당 나머지가 없을 때만 저장해 둔다.

 

C++

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    int num, remain;
    vector<int> num_vec;
    for (int i = 0; i < 10; i++){
        cin >> num;
        remain = num % 42;
        if (find(num_vec.begin(), num_vec.end(), remain) == num_vec.end()){
            num_vec.push_back(remain);
        }
    }
    cout << num_vec.size();
    return 0;
}

 

find를 사용해서 배열에 해당 요소가 있는지 검색 후 없으면 추가한다.

 

C#

using System;
using System.Collections.Generic;
class Program{
    static void Main(string[] args){
        List<int> num_list = new List<int>();
        for (int i = 0; i < 10; i++){
            int num = int.Parse(Console.ReadLine());
            int remain = num % 42;
            if (!num_list.Contains(remain)){
                num_list.Add(remain);
            }
        }
        Console.WriteLine(num_list.Count);
    }
}

 

List는 Contains를 사용해서 요소를 포함하고 있는지 확인할 수 있다.

 

Python

num_list = []
for i in range(10):
    num = int(input());
    remain = num % 42
    if remain not in num_list:
        num_list.append(remain)
print(len(num_list))

 

파이썬의 경우 조건문의 문법에서 리스트의 요소를 검색해 볼 수 있다.

 

Node.js

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin','utf8').split('\n').map(Number);
const list = [];
for (let i = 0; i < 10; i++){
    const num = input[i];
    const remain = num % 42;
    if (!list.includes(remain)){
        list.push(remain);
    }
}
console.log(list.length);

 

includes를 사용해서 배열을 탐색하고 push로 값을 넣는다.

 

9번 바구니 뒤집기

문제

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀 있다. 바구니는 일렬로 놓여 있고, 가장 왼쪽 바구니를 1번째 바구니, 그다음 바구니를 2번째 바구니,..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다. 

 

도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다. 

 

바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다. 

 

둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. (1 ≤ i ≤ j ≤ N) 

 

도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.

 

출력

모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.

 

N크기의 배열의 특정 인덱스 범위의 순서를 M번 뒤집는 작업을 하고 최종 출력한다.

 

C++

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
int main(){
    int n, m, i, j;
    cin >> n >> m;
    vector<int> num_vec(n);
    iota(num_vec.begin(), num_vec.end(), 1);
    for (int k = 0; k < m; k++){
        cin >> i >> j;
        reverse(num_vec.begin() + i - 1, num_vec.begin() + j);
    }
    for (int l : num_vec){
        cout << l << " ";
    }
    return 0;
}

 

reverse를 사용해서 배열의 특정 인덱스 범위에서 요소를 뒤집는다.

 

C#

using System;
using System.Collections.Generic;
using System.Linq;
class Program{
    static void Main(string[] args){
        int n, m, i, j;
        int[] info = Console.ReadLine().Split().Select(int.Parse).ToArray();
        n = info[0];
        m = info[1];
        List<int> num_list = Enumerable.Range(1, n).ToList();
        for (int k = 0; k < m; k++){
            int[] data = Console.ReadLine().Split().Select(int.Parse).ToArray();
            i = data[0] - 1;
            j = data[1] - 1;
            num_list.Reverse(i, j - i + 1);
        }
        Console.WriteLine(string.Join(" ", num_list));
    }
}

 

Reverse 함수를 사용해서 특정한 범위의 인덱스 값을 뒤지어준다. 이때 인수는 시작 인덱스와 개수이다. 

 

Python

info_list = list(map(int, input().split()))
n = info_list[0]
m = info_list[1]
num_list = list(range(1, n + 1))
for k in range(m):
    idxs = list(map(int, input().split()))
    i = idxs[0] - 1
    j = idxs[1] - 1
    num_list[i:j+1] = num_list[i:j+1][::-1]
print(" ".join(map(str, num_list)))

 

num_list [i:j+1] = num_list [i:j+1][::-1] 

 

파이썬의 슬라이싱을 사용해서 배열의 인덱스를 특정해서 순서를 바꾸는 방법이다.

 

배열의 순서를 뒤집는 방법에는 몇 가지 있다.

 

reverse()

# reverse()
num_list = [1, 2, 3, 4, 5]
num_list.reverse()
print(num_list)  # [5, 4, 3, 2, 1]

 

reverse를 사용하면 원본 리스트의 요소가 뒤집어진다.

 

슬라이싱

# Slicing
num_list = [1, 2, 3, 4, 5]
reversed_list = num_list[::-1]
print(reversed_list)  # [5, 4, 3, 2, 1]

 

슬라이싱을 사용하면 해당 리스트의 요소를 뒤집은 새로운 리스트를 생성한다.

 

reversed()

num_list = [1, 2, 3, 4, 5]
reversed_list = list(reversed(num_list))
print(reversed_list)  # [5, 4, 3, 2, 1]

 

reversed 함수를 사용하면 리스트의 역순으로 정렬된 반복자를 반환한다. 이 반환값을 다시 리스트로 변환하면 뒤집어진 리스트를 만들 수 있다.

 

Node.js

const fs = require('fs');
const info_list = fs.readFileSync('/dev/stdin','utf8').split('\n');
const [n,m] = info_list[0].split(' ').map(Number);
let num_list = Array.from({ length: n }, (_, index) => index + 1);
for (k = 1; k <= m; k++){
    const [i, j] = info_list[k].split(' ').map(Number);
    const start = i - 1;
    const end = j - 1; 
    num_list.splice(start, end - start + 1, ...num_list.slice(start, end + 1).reverse());
}
console.log(num_list.join(' '));

 

 

splice 함수는 배열의 특정 범위를 제거하거나 추가할 때 사용한다. 

array.splice(start, deleteCount, item1, item2, ...)

 

start는 필수 매개변수로 deleteCount를 따로 지정하지 않으면 start부터 인덱스 끝까지 제거한다.

 

item 매개변수들은 선택 사항으로 start 인덱스 뒤에 item을 배열에 추가한다.

 

10번 평균

문제

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그러고 나서 모든 점수를 '점수/M*100'으로 고쳤다. 

 

예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다. 

 

세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

 

출력

첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10^-2 이하이면 정답이다.

 

기말고사를 망친 세준이의 성적을 조작한다.

 

최고 점수를 사용해서 점수를 조작하고 조작된 점수들의 평균을 내서 출력한다.

C++

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<float> num_vec(n);
    for (int i = 0; i < n; i++){
        float score;
        cin >> score;
        num_vec[i] = score;
    }
    auto max_iter = max_element(num_vec.begin(), num_vec.end());
    float max_val = *max_iter;
    for (int i = 0; i < n; i++){
        num_vec[i] = num_vec[i] / max_val * 100;
    }
    float sum = accumulate(num_vec.begin(), num_vec.end(), 0.0f);
    cout << sum / n;
    return 0;
}

 

본래의 성적을 저장하고 최대 값을 구한 뒤 조작한 성적을 다시 배열에 저장하고 합산하여 평균을 구한다.

 

accumulate 함수를 사용해서 배열 요소들의 합을 구한다.

 

C#

using System;
using System.Collections.Generic;
using System.Linq;
class Program{
    static void Main(string[] args){
        int n = int.Parse(Console.ReadLine());
        List<float> num_list = Console.ReadLine().Split().Select(float.Parse).ToList();
        float max_val = num_list.Max();
        for (int i = 0; i < n; i++){
            num_list[i] = num_list[i] / max_val * 100;
        }
        float sum = num_list.Sum();
        Console.WriteLine(sum / n);
    }
}

 

List.Sum() 함수는 요소의 합산을 구할 수 있다.

 

Python

n = int(input())
num_list = map(float, input().split(' '))
max_val = max(num_list);
for i in range(n):
    num_list[i] = num_list[i] / max_val * 100
sum_val = sum(num_list)
print(f"{sum_val / n}")

 

Node.js

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin','utf8').split('\n');
const n = parseInt(input[0]);
const num_list = input[1].split(' ').map(Number);
const max = Math.max(...num_list);
for (let i = 0; i < n; i++){
    num_list[i] = num_list[i] / max * 100;
}
const sum = num_list.reduce((acc, curr) => acc + curr, 0);
console.log(sum / n);

 

Math.max를 사용할 때는 스프레드 연산자로 매개변수를 전달해야 한다.

728x90
반응형

+ Recent posts