AI 공부 도전기

[Baekjoon] C++ 5단계 1차원 배열 (10818 최소, 최대 , 2562 최댓값, 2577 숫자의 개수, 3052 나머지, 1546 평균, 8958 OX퀴즈, 4344 평균은 넘겠지)

 

     

 

10818 최소, 최대

 

https://www.acmicpc.net/problem/10818

 

10818번: 최소, 최대

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

방법 1 - 460ms 275B

#include <iostream>
using namespace std;
int main() {
	int N;
	cin >> N;	
	int li[N];
	int max = -1000000; 
	int min = 1000000;
	for (int i = 0; i < N; i++) {
		cin >> li[i];
		if (li[i] > max) max = li[i];
		if (li[i] < min) min = li[i];		
	}
	cout << min << " " << max;	
}

 

방법 2 - 1번보다 더 오래 걸림 544ms 215B

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
	int N;
	cin >> N;	
	int li[N];
	for (int i = 0; i < N; i++) {
		cin >> li[i];		
	}
	sort(li, li + N);
	cout << li[0] << " " << li[N-1];	
}

 

3줄 추가 후 속도 향상 172ms 281B

#include <iostream>
#include <algorithm>
using namespace std;
int main() {	
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int N;
	cin >> N;	
	int li[N];
	for (int i = 0; i < N; i++) {
		cin >> li[i];		
	}
	sort(li, li + N);
	cout << li[0] << " " << li[N-1];	
}

 

2562 최대값

https://www.acmicpc.net/problem/2562

 

2562번: 최댓값

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어

www.acmicpc.net

 

방법 1 - 214B 0ms 2020KB

#include <iostream>
using namespace std;
int main() {
	int li[9];
	int m=0, idx=0;
	for (int i = 0; i < 9; i++) {
		cin >> li[i];
		if (m < li[i]) {
			m = li[i];
			idx = i+1;
		}
	}
	cout << m << "\n" << idx;	
}

 

방법 2 - 166B 0ms 1112KB

#include <stdio.h>
int main(){
	int s, max=0, idx;
	for(int i=0; i<9; i++){
		scanf("%d",&s);
		if(max < s){
			max=s;
			idx=i+1;
		}
	}
	printf("%d\n%d",max,idx);
}

 

2577 숫자의 개수

https://www.acmicpc.net/problem/2577

 

2577번: 숫자의 개수

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

www.acmicpc.net

 

배열 내부를 0으로 초기화

int n[10] = {0}

int n[10] = {}

 

방법 1 - 2020KB 0ms 231B

#include <iostream>
using namespace std;
int main(){
	int A,B,C;
	cin >> A >> B >> C;
	int res = A*B*C;
	int n[10]={0};
	
	while (1){
		if (res / 10 == 0){
			n[res%10]++;
			break;
		}
		else{
			n[res%10]++;
			res /= 10;
		}		
	}
		
	for (int i=0; i<10; i++){
		cout << n[i] << "\n";
	}	
}

 

방법 2 - 2020KB 0ms 292B

#include <iostream>
using namespace std;
int main(){
	int A,B,C;
	cin >> A >> B >> C;
	int res = A*B*C;
	int n[10]={0};
	
	while (res != 0){
		n[res%10]++;
		res /= 10;
	}
		
	for (int i=0; i<10; i++){
		cout << n[i] << "\n";
	}	
}

 

방법 3 - 1112KB 0ms 197B

#include<stdio.h> 
int main(){
	int a,b,c,n[10]={};
	scanf("%d %d %d",&a,&b,&c);
	int res = a*b*c;
	while(res != 0){
		n[res%10]++;
		res/=10;		
	}
	for(int i=0; i<10; i++)
		printf("%d\n",n[i]);
}

 

3052 나머지

https://www.acmicpc.net/problem/3052

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

 

방법 1 - 2020KB 0ms 276B (for문 2개를 통한 distinct 값 도출)

#include <iostream>
using namespace std;
int main(){
	int g, cnt=0, n[10]={};	
    
	for (int i=0; i<10; i++){
		cin >> g;
		n[i] = g % 42;
	}	
    
	for (int i=0; i<10; i++){
		int j;
		for (j=0; j<i; j++){
			if (n[i] == n[j])
				break;
		}
		if (i==j)
			cnt++;
	}	
    
	cout << cnt;	
}

 

방법 2 - 2020KB 0ms 209B (array 42개로 count)

#include <iostream>
using namespace std;
int main(){
	int g, cnt=0, n[42]={};	
	for (int i=0; i<10; i++){
		cin >> g;
		n[g % 42]++;
	}	
	for (int i=0; i<42; i++){
		if (n[i] != 0) cnt ++;
	}	
	cout << cnt;	
}

 

방법 3 - 1112KB 0ms 199B

#include<stdio.h> 
int main(){
	int g, cnt=0, n[42]={};	
	for (int i=0; i<10; i++){
		scanf("%d", &g);
		n[g % 42]++;
	}	
	for (int i=0; i<42; i++){
		if (n[i] != 0) cnt ++;
	}	
	printf("%d", cnt);
}

 

1546 평균

https://www.acmicpc.net/problem/1546

 

1546번: 평균

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

www.acmicpc.net

  

방법 1 - 2020KB, 0ms, 246B

 

#include <iostream>
using namespace std;
int main(){
	int n;
	cin >> n;
	double s=0, m=0, a[n]={};	
	for (int i=0; i<n; i++){	
		cin >> a[i];
		if (m < a[i]) m = a[i];
	}	
	for (int i=0; i<n; i++){
		s = s + a[i] / m * 100;		
	}	
	cout << s/n;	
}

 

방법 2 - 2020KB, 0ms, 215B

#include <iostream>
using namespace std;
int main(){
	int n;
	cin >> n;
	double s=0, m=0, a[n]={};	
	for (int i=0; i<n; i++){	
		cin >> a[i];
		s += a[i];
		if (m < a[i]) m = a[i];
	}	
	s = s/m*100/n;
	cout << s;	
}

 

방법 3 - 1112KB, 0ms, 173B

#include<cstdio>
int main() {
	int n,m=0,t;
	double sum=0;
	scanf("%d",&n);
	for(int i=0;i<n;++i){
		scanf("%d",&t);
		if(t>m) m=t;
		sum+=t;
	}
	printf("%f",sum/m*100/n);
}

 

8958 OX퀴즈

 

https://www.acmicpc.net/problem/8958

 

8958번: OX퀴즈

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수

www.acmicpc.net

 

string.length 길이를 구할 수 있음

strlen(string) 길이를 구할 수 있음

strlen(char[~]) 길이를 구할 수 있음

 

방법 1 - 2024KB, 4ms, 339B

#include <iostream>
#include <string>
using namespace std;
int main(){
	int n, inc=0, sum=0;
	cin >> n;	
	string ox="";
	for (int i=0; i<n; i++){
		cin >> ox;	
		for (int j=0; j<ox.length(); j++){				
			if (ox[j]=='X') inc = 0;
			else if (ox[j]=='O') inc++;
			sum += inc;	
		}		
		cout << sum << "\n";
		sum=0;
		inc=0;
		ox="";
	}			
}

 

방법 2 - 2020KB, 4ms, 349B

#include <iostream>
#include <cstring>
using namespace std;
int main(){
	char ox[80];
	int n, inc=0, sum=0;
	cin >> n;	
	for (int i=0; i<n; i++){
		cin >> ox;	
		for (int j=0; j < strlen(ox); j++){				
			if (ox[j]=='X') inc = 0;
			else if (ox[j]=='O'){
				inc++;
				sum += inc;					
			} 
		}		
		cout << sum << "\n";
		sum=0;
		inc=0;		
	}			
}

 

4344 평균은 넘겠지

 

https://www.acmicpc.net/problem/4344

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

 

소수점 자리 설정하기

cout << fixed;
cout.precision(3);

 

 

방법 1 - 2020KB, 4ms, 369B

#include <iostream>
using namespace std;
int main(){
	int c,n;
	cin >> c;
	for (int i=0; i<c; i++){
		cin >> n;
		int g[n], cnt=0;
		double avg=0;
		for (int j=0; j<n; j++){
			cin >> g[j];
			avg += g[j];
		}	
		avg = avg/n;
		for (int k=0; k<n; k++){
			if (g[k] > avg) cnt++;
		}		
		cout << fixed;
		cout.precision(3);
		cout << cnt/(double)n * 100<< "%\n"; 
	}		
}

 

방법 2 - 1112KB, 0ms, 352B

#include <stdio.h>
using namespace std;
int main(){
	int c,n;
	scanf("%d", &c);
	for (int i=0; i<c; i++){
		scanf("%d", &n);
		int g[n], cnt=0;
		double avg=0;
		for (int j=0; j<n; j++){
			scanf("%d", &g[j]);
			avg += g[j];
		}	
		avg = avg/n;
		for (int k=0; k<n; k++){
			if (g[k] > avg) cnt++;
		}		
		printf("%.3lf%%\n", (float)cnt/n*100);
	}		
}

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading