본문 바로가기

코딩테스트/Do it! 알고리즘 코딩테스트

2. 자료구조 - 1. 배열과 리스트 그리고 벡터

반응형

9/24

문제 001. 숫자의 합 구하기

문제 N개의 숫자가 공백 없이 쓰여 있다. 이 숫자를 모두 합해 출력하는 프로그램을 작성하시오.

 

입력 : 1번째 줄에 숫자의 개수 N(1<= N <= 100), 2번째 줄에 숫자 N개가 공백 없이 주어진다.

출력 : 입력으로 주어진 숫자 N개의 합을 출력한다.

 

풀이 : N의 범위가 1부터 100까지이므로 값을 int, long과 같은 숫자형으로 담을 수 없다.

  • 데이터 표현 범위
    • int : -2,147,483,648 ~ 2,147,483,647 -> 최대 10자리
    • long : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 -> 최대 19자리 

이기 때문이다. 그래서 문자열 형태로 입력값을 받고 해당 입력값을 배열에 저장해야한다.

 

코드 : 

#include <iostream>
using namespace std;

int main (){
	int N = 0;
    string numbers;
    
    cin >> N;
    cin >> numbers;
    
    int sum = 0;
    for(int i = 0; i<N ; i++){
    	sum+=numbers[i] - '0'; //character을 정수로 변환
    }
    cout<< sum << "\n";
}

 

# C++에서의 형변환  string형 <-> 숫자형
#include <string>
string sNum = "1234";
string sNum_d = "1234.56";

int inum = stoi(sNum);
long lnum = stol(sNum);
double dnum = stod(sNum_d);
float fnum = stof(sNum_d);

string numberToString = to_string(inum); //모든 숫자형에 관해서는 to_string()으로 동일

 

9/25

문제 002. 평균 구하기

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

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

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

 

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

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

참고 :

  • int: 일반적으로 4바이트(32비트)를 사용하며, 저장할 수 있는 값의 범위는 -2,147,483,648에서 2,147,483,647까지입니다.
  • long: 일반적으로 4바이트(32비트) 또는 8바이트(64비트)로 구현되며, C++에서는 최소한 4바이트 이상입니다. 8바이트 long의 경우, 저장할 수 있는 값의 범위는 -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807까지입니다.

 

코드 :

#include <iostream>
using namespace std;

int main(){
long sum =0;
int A[1000];
long max = 0;
int N =0;

cin >> N;
for(int i =0; i<N;i++){
	cin>>A[i];
}

for(int i = 0; i<N; i++){
	if(max<A[i]){
    	max = A[i];
    }
    sum = sum+A[i];
}

double result =0 ;
result = sum * 100.0 /max /N; //연산순서에 따라 정답이 달라짐. sum /max는 정수여서 소숫점자리가 무시됨.

cout << result<<"\n";
}

 

반응형