반응형

2021 IGRUS Newbie Programming Contest

 

 

 

 

 

1시에 시험이 시작됐는데

늦잠+늦은 점심으로 너무 늦게참여해서 한문제만 풀고 끝났음

그래서 올리는 문제 풀이

 

 

 

 

맛있다고 생각하는 기준 (=출력해야할 맛의 순위)

홀수 (홀수가 여러개라면 그중 가장 큰 값의 홀수) > 가장 큰 값의 짝수

 

홀수 * 홀수 = 홀수

홀수 * 짝수 = 짝수

짝수 * 짝수 = 짝수

 

이므로 홀수가 하나 이상인 경우 모든 홀수를 곱셈을 해준게 가장 맛있는 칵테일이다

또는, 홀수가 하나도 없이 3개의 수가 모두 짝수인 경우, 세개의 값을 모두 곱한 것이 가장 맛있는 칵테일이다

 

홀수의 유무를 확인할 수 있게 참,거짓이 가능한 bool 형식 변수 odd를 선언해서 사용했다

 

a,b,c,의 음료를 입력받을 때는, 입력받을 때 마다, 홀수인지 판별 후

1개 이상이라도 홀수가 나오는 경우 odd를 true로 바꿀수있게 하였고,

 

출력해야할 ans에 입력받은 홀수를 곱해주었다

 

odd가 false인 경우는 입력받은 수 중 홀수가 없다는 뜻이므로 출력해야할 ans는 모든 수를 곱한 값(짝수)과 같다

 

 

 

#include<bits/stdc++.h>
using namespace std;

int main() {
	
	int arr[3];
	bool odd=false;
	int ans=1;
	
	for(int i=0; i<3; i++){
		cin >> arr[i];
		if(arr[i]%2 !=0){
			ans*=arr[i];
			odd=true;
		}		
	}
    
	if(odd){
		cout <<ans;	
	}
	else{
		cout<< arr[0]*arr[1]*arr[2];
	}	
	return 0;
}

 

 

남은 문제들은 앞으로 여유될때 하나씩 풀어볼 예정

 

 

 

출처 : www.acmicpc.net/problem/21312

 

21312번: 홀짝 칵테일

정진이는 특별한 음료를 가지고 있다. 음료들은 정수로 표현되는 고유 번호를 가지고 있다. 정진이는 이 음료들을 섞어 만든 칵테일을 만든다. 이 칵테일은 홀짝 칵테일이라 부르는데, 홀짝 칵

www.acmicpc.net

 

반응형
반응형

 

 

정수 2개(x,y)를 차례대로 입력 받은 뒤 (x,y)가 속하는 사분면의 위치를 출력해주는 문제

 

 

사분면

출처 : 위키백과

 

 

1~4 사분면은 위의 이미지로 판별이 가능하니까 x,y의 값으로 판별이 가능함

 

따라서 x를 먼저 입력받은 뒤, x가 +인지 -인지 확인한 다음

y를 입력받아 y가 +인지 -인지 확인하여 사분면을 출력했다

 

1사분면 (+x, +y)

2사분면 (-x, +y)

3사분면 (-x, -y)

4사분면 (+x, -y)

 

 

#include<bits/stdc++.h>
using namespace std;

int main() {
	int x,y;
	cin >> x;
	if(x<0){
		cin >> y;
		if(y<0) cout <<3;
		else cout << 2;
	}
	else{
		cin >> y;
		if(y<0) cout << 4;
		else cout << 1;
	}
	return 0;
}

 

 

 

출처 : www.acmicpc.net/problem/14681

 

14681번: 사분면 고르기

점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다.

www.acmicpc.net

 

반응형
반응형

 

 

입력이 총 9개의 자연수이므로 비교할 값 변수인 tmp를 0으로 초기화 해서 매번 입력받아 비교해서

들어오는 입력값이 이전에 저장해놓은 값보다 크면 그때마다 몇번째 수인지 저장할 인덱스와 최대값을 바꾸어준다

 

 

#include<bits/stdc++.h>
using namespace std;

int main() {
	
	int tmp=0;
	int index=0;
	int input;
	
	for(int i=0; i<9; i++){
		cin >> input;
		if(tmp < input){
			tmp = input;
			index = i+1;
		}
	}
	
	cout << tmp<<"\n"<<index;
	
	return 0;
}

 

 

출처 : www.acmicpc.net/problem/2562

 

2562번: 최댓값

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

www.acmicpc.net

 

반응형
반응형

 

 

 

 

 

 

5

OOXXOXXOOO

OOXXOOXXOO

OXOXOXOXOXOXOX

OOOOOOOOOO

OOOOXOOOOXOOOOX

 

 

입력의 형태는 크게 횟수와 문자열의 모음으로 문자열 벡터를 생성해서 5번 반복해서 생성한 벡터에 차례대로 입력함

이중 for문을 사용해서 벡터 값에 있는 문자열을 하나씩 꺼내서

문자열 인덱스로 접근 후 각 값이 O인지 X인지 확인 후 점수체계를 만들어줌

 

 

str O O X X O X X O O O
ans 1 2 0 0 1 0 0 1 2 3

 

위의 표를 참고해서 보면 연속되어 퀴즈를 맞힌 OO, OOO의 경우 얻을수있는 점수는 1점이 3개가 아니라

연달아 맞힘으로 인해 점수가 연속해서 맞힌 갯수만큼 증가하게된다

따라서 OO = 3점, OOO = 6점임을 알수있음

 

나는 총점과 str[j]에 해당하는 점수를 각각의 변수로 따로 선언해서 과거 문제를 맞춘 이력을 기억하도록 했다

ex) O : score++;

X : score=0;

 

연속해서 맞히다가 틀릴 경우 연속했던걸 기억해둘필요 없으므로 score를 0으로 리셋해준다

 

 

 

#include<bits/stdc++.h>
using namespace std;

int main() {
	int ans;
	int score;
	
	vector<string> v;
	string str="";
	
	int cnt;
	cin >> cnt;
	
	for(int i=0; i<cnt; i++){
		cin >> str;
		v.push_back(str);
	}
	
	for(int i=0; i<cnt; i++){
		ans=0;
		score=0;
		str = v[i];
		
		for(int j=0; j<str.length(); j++){
			if(str[j] == 'O'){
				score++;
				ans+=score;
			}
			else {
				score=0;
			}
		}
		cout<<ans<<"\n";
	}

	return 0;
}

시간 0ms

 

 

 

좀더 줄여본 방법

벡터에 따로 저장 안하고 입력과 동시에 입력받은 문자열 판별해서 점수출력하기

 

#include<bits/stdc++.h>
using namespace std;

int main() {
	int ans;
	int score;
	
	string str="";
	
	int cnt;
	cin >> cnt;
	
	for(int i=0; i<cnt; i++){
		cin >> str;
		
		ans=0;
		score=0;
		
		for(int j=0; j<str.length(); j++){
			if(str[j] == 'O'){
				score++;
				ans+=score;
			}
			else {
				score=0;
			}
		}
		cout<<ans<<"\n";
		str="";
	}

	return 0;
}

시간 4ms

코드 길이랑 메모리는 조금 줄었고 시간은 비슷하거나 미세하게 차이가 있는듯

 

 

 

 

 

출처 : www.acmicpc.net/problem/8958

 

8958번: OX퀴즈

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

www.acmicpc.net

 

반응형
반응형

 

세 자리수의 자연수 3개의 곱셈의 결과에 포함된 0~9까지의 숫자를 한줄 한줄 차례대로 출력하는 문제

 

처음에는 숫자를 문자열로 바꿔가지고 하나씩 잘라서 출력해야되나 했는데

최근에 특정 숫자로로 나눈 나머지를 사용하는 방법이 많았어서

 

크기가 10인 0~9까지의 정수형 배열을 만든다음, 값을 0으로 초기화 시키고

3개의 수를 곱한 결과를 10으로 나눈 나머지의 위치에 ++; 증감연산자를 사용해서 해당 하는 숫자를 1씩 증가시킨 뒤

반복문으로 0~9까지의 배열을 돌아가며 값을 모두 출력해주기로 했다

 

10으로 나눌때 몫이 1이상일때까지 반복하도록 while 문을 사용했음

따라서 10보다 작은 수인 0~9까지의 값이 나온다면 

미리 만들어준 배열의 값을 1씩 증가시킴

 

 

 

 

#include <bits/stdc++.h>
using namespace std;

//BOJ 2577

int main() {
	int a,b,c;
	cin >> a>> b >> c;
    
	int n = a*b*c;
	int arr[10]={0};
	int tmp=0;
    
	while(n/10>0){
		tmp = n%10;
		n/=10;
		arr[tmp]++;
	}
    
	arr[n]++;
    
	for(int i=0; i<10; i++){
		cout << arr[i] << "\n";
	}
    
	return 0;
}

 

위의 코드를 좀더 줄여봄

2가지 정도를 단순화했음

1. n을 10으로 나눈 나머지(n%10)의 값을 배열의 인덱스에 바로 쓸수있었다

2. while문의 조건을 변경해봄 (마지막에 n의 값을 반복문 바깥에서 저장해줬어야했는데 반복문 내에서 모두 처리하도록 함)

 

1 -> tmp 변수를 따로 선언해서 사용했는데 바로 인덱스로 사용가능하길래 줄임

 

2-> while문을 사용할 때 n(세 자연수의 곱셈 값)의 값을 10으로 나눈 몫이 0보다 클때까지 반복시켰는데

이런식으로 하면 while문이 종료되고 마지막에 따로 n의 값을 한번 더 저장해줘야돼서

 

반복문 하나로 다 처리하고싶어서 while 의 조건을 n/10 >0이 아니라 n>10으로 수정했다

 

 

 

 

#include <bits/stdc++.h>
using namespace std;

int main() {
	int a,b,c;
	cin >> a>> b >> c;
    
	int n = a*b*c;
	int arr[10]={0};
	
	while(n>0){
		arr[n%10]++;
		n/=10;
	}
	for(int i=0; i<10; i++){
		cout << arr[i] << "\n";
	}
	return 0;
}

 

 

출처 : www.acmicpc.net/problem/2577

 

2577번: 숫자의 개수

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

www.acmicpc.net

 

반응형

+ Recent posts