브론즈1에서 사람들이 많이 풀어본 순서대로 24문제 정도를 풀어보았다.
C++ 을 사용하였는데 2학년1학기때(2년전) 프로그래밍언어 과목으로 해당 언어를 다루어 본 이후로 처음이었다. 정말로 전형적인 문법 외에 머리에 있는게 없어서 문법을 알기 위해 구글링을 하면서 풀었다.. 이 시기동안은 딱히 문제를 푸는 능력이 향상되고 이런건 없고 언어에 익숙해져 가는 과정이라고 생각한다.
수행기간: 3/10~3/17
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다. 위의 예는 4번만에 원래 수로 돌아와서 사이클의 길이는 4이다.
예시를 그대로 따라 갔다.
두자리 숫자를 10의 자리(op1)와 1의 자리(op2)로 나누고
합을 구해 새로운 숫자(result)를 만든다. 그전 숫자의 1의 자리(op2)를 op1으로 변경해준 후, result의 1의 자리(op2)를 구한다. 이 과정을 계속 반복해 사이클을 체크한다.
#include<iostream>
using namespace std;
int main(void) {
int input;
cin >> input;
int op1 = input / 10;
int op2 = input % 10;
int cycle = 0;
int result;
while (1) {
cycle++;
result = op1 + op2;
op1 = op2;
op2 = result % 10;
if ((op1 * 10 + op2) == input) {
cout << cycle;
break;
}
}
}
시험 평균 조작 문제. 모든 과목의 점수를 점수/최고점*100 으로 바꾸고 다시 평균을 구하는 문제다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void) {
int n;
cin >> n;
vector<double> input(n);
for (int i = 0; i < n; i++) {
cin >> input[i];
}
int max = *max_element(input.begin(), input.end());
double sum = 0;
for (int i = 0; i < input.size(); i++)
{
input[i] = input[i] / max * 100;
sum += input[i];
}
cout << (sum / input.size());
}
max_element() 함수 이용. max인 요소의 주소를 반환함
#include<algorithm>
int max_idx = max_element(cnt.begin(), cnt.end()) - cnt.begin();
//벡터에서 최대값인 인덱스 구하기
int max= *max_element(cnt.begin(), cnt.end())
//벡터에서 최대값 구하기
sort()함수
sort(v.begin(), v.end()); //오름차순
sort(v.rbegin(), v.rend()); //내림차순
주어진 숫자를 최대한 적은 3또는 5로 만들어 보라는 문제였다. 만약 3 또는 5로 만들 수 없는 숫자라면 -1을 출력한다.
5로 나눌 수있는 범위 안에서 반복한다. 5의 배수를 뺀 숫자(n_temp)가 3으로 완전히 나누어지면 그때의 5의 개수(i)와 3의 개수(j)의 합을 비교해서 최소값(min)을 출력한다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void) {
int n;
cin >> n;
int bag1 = 3;
int bag2 = 5;
int quo1 = n / bag1;
int quo2 = n / bag2;
int min = n;
if (quo2 > 0 || quo1 > 0) {
for (int i = 0; i <= quo2; i++) {
int j = 0;
int n_temp = n - bag2 * i;
if (n_temp % bag1 == 0) {
j = n_temp / bag2;
if (min > i + j) {
min = i + j;
}
}
}
if (min == n)
cout << -1;
else
cout << min;
}
else {
cout << -1;
}
}
한 줄의 점수들(케이스)마다 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력하는 문제.
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(void) {
int r1;
cin >> r1;
vector<double> ratio(r1);
for (int i = 0; i < r1; i++) {
int r2;
cin >> r2;
vector<int> score(r2);
int sum = 0;
for (int j = 0; j < r2; j++) {
cin >> score[j];
sum += score[j];
}
double avg= sum / r2;
int people = 0;
for (int sc : score) {
if (sc > avg)
people++;
}
ratio[i] = round(((double)people / r2 * 100.0)*1000)/1000;
}
for (double rt : ratio) {
printf("%.3f%%\n", rt);
}
}
round()함수
#include<cmath>
round((n)*1000)/1000; //넷째 자리에서 반올림 -> 소수점 셋째 자리까지 구해짐
round((n)*100)/100; //셋째 자리에서 반올림 -> 소수점 둘째 자리까지 구해짐
출력format 정하기
printf("%.3f%%\n", rt); //.3f 소수점 셋째 자리까지 출력. (ex) 2.2 -> 2.200
// % 문자를 출력하기 위해선 %% 쓰면됨
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성. 단, 대문자와 소문자를 구분하지 않음, 가장 많이 사용된 알파벳이 여러개 존재하는 경우 ?출력함
아스키코드 값
A~Z =65~90
a~z =97~122
반복문을 돌면서 소문자이던 대문자이던 간에 같은 위치에 cnt[i]++;
cnt 벡터에서 가장 큰 원소의 인덱스를 구하고
반복문을 돌며 cnt[max_idx]의 값과 동일한 원소가 하나라도 있으면 ?를 출력하고 break;
만약 cnt를 모두 검사하고 마지막 반복문까지 돌아오는 경우라면(i==26) 대문자 알파벳으로 출력한다. 알파벳은 총 26개이므로 이를 끝까지 보고 가장 많이 사용된 알파벳을 출력하는걸 간단하게 만들려고 그냥 한번 더 반복을 해줬다. for(int i=0;i<27;i++)
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int main(void) {
string str;
cin >> str;
vector<int> cnt(26, 0);
for (char a : str) {
for (int i = 0; i < 26; i++) {
if (a == 65 + i || a == 97 + i) {
cnt[i]++;
}
}
}
int max_idx = max_element(cnt.begin(), cnt.end()) - cnt.begin();
for (int i = 0; i < 27; i++) {
if (i == max_idx)
continue;
if (i == 26) {
printf("%c", max_idx + 65);
}
else if (cnt[max_idx] == cnt[i]){
cout << "?";
break;
}
}
}