반응형

백준 10807번 개수 세기 문제

 

 

입력되는 정수의 개수 : 1개부터 100개까지 (1<= N =< 100)

입력되는 정수의 범위 : -100부터 100까지 (-100 <= v =< 100)

 

 

 

자연수가 아니라 정수 v가 -100부터 시작되는 값이어서 어떻게하지 하면서

문제를 보고 초반에는 약간 헤맸는데

 

 

다행히 정수 v의 범위가 자연수에 - 부호를 붙여주면 값은 동일하다고 판단해서

자연수 범위의 배열과 마이너스 일때 배열을 따로 추가해서 관리해보았다

 

입력한 정수의 값이 0보다 큰 경우, arr_plus에 증감연산자를 사용해서

특정 정수를 만날때마다 그 배열의 인덱스를 증가시켜 횟수를 적립시켰다

 

마찬가지로 0보다 작은 경우, arr_minus에 저장해서 관리함

 

사용배열 : arr_plus[100], arr_minus[100]

 

 

 

 

//수도코드

arr_plus[100] = 0;
arr_minus[100] = 0

int input,v;
cin >> input;

for(int i=0; i<input; i++){

	if(i>0) arr_plus[i]++;
	else arr_minus[-i]++;
}

cin >> v;

if (v>=0) cout << arr_plus[v];
else cout << arr_minus[-v];

 

 

대충 이렇게 작성해보았는데

 

 

그냥 후루룩 쓰다보니 간과했던게 배열의 범위를 100개가 아닌 101로 주었어야 했음

마이너스 값의 경우 상관없지만, 0부터 100까지의 값을 저장해주어야 하는

arr_plus에서 범위가 초과하는 문제가 생긴다

 

그래서 2번 틀렸다가 겨우 알아냄..

 

 

그렇게 초안에서 다듬고 틀린부분을 수정한 완성본이 아래의 코드

 

 

 

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

int main() {
	
	int cnt,v;
	
	int arr_plus[101] = {0};
	int arr_minus[101] = {0};
	
	cin >> cnt;
	
	int tmp;
	
	for(int i=0; i<cnt; i++){
		cin >> tmp;
		
		if(tmp >=0){
			arr_plus[tmp]++;
		}
		else{
			arr_minus[-tmp]++;
		}
	}
	
	cin >> v;
	
	v>=0 ? cout << arr_plus[v] : cout << arr_minus[-v];
	
	return 0;
}

 

 

cnt : 맨 처음 입력인 입력할 정수의 개수

tmp : 입력받을 정수들

v : 찾을 정수

 

arr_plus[101] = 입력받은 tmp 중 0부터 100까지의 정수의 횟수를 저장할 배열

arr_minus[101] = 입력받은 tmp 중 -100부터 -1까지의 정수의 횟수를 저장할 배열

 

여기서 0을 plus에 둘지 minus 배열에 둘지는 그냥 본인 선택하기에 다를듯

 

 

마지막에 삼항연산자 문법을 사용해서 if else문을 줄여보았다

 

 

 

삼항연산자 문법

 

 

 

 

 

출처 : 

 

 

10807번: 개수 세기

첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거

www.acmicpc.net

 

 

 

C 언어 코딩 도장: 20.2 삼항 연산자 사용하기

먼저 삼항 연산자를 사용하기 전에 if 조건문으로 num1의 값이 참이면 num2에 100을 할당하고, 거짓이면 num2에 200을 할당하는 코드를 만들어보겠습니다. if_else.c #include int main() { int num1 = 5; int num2; if

dojang.io

 

반응형

+ Recent posts