반응형

 

문제 요약

알파벳으로 이루어진 입력 문자열에서 가장 많이 사용된 알파벳 대문자로 출력

가장 많이 사용된 알파벳이 2개 이상이라면 물음표 ? 출력

 

풀이 과정

알파벳 대문자(A~Z)는 아스키코드 65부터 90까지이며

알파벳 소문자(a~z)는 아스키코드 97부터 122까지이다

 

위의 두가지를 사용해서 처음에는 알파벳 a부터 z까지 해당하는 배열을 만들려고했으나

돌면서 중복 값을 찾는게 귀찮아서 벡터로 전환해서 해결했다

 

 

인덱스와 값으로 알파벳에 접근가능한 배열

A B C D E F G H I J K L M N O P W R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

아스키코드 65가 A이므로

index가 0인 경우, 65를 더한 다음 char 화하여 출력해주면 A가 출력이 되는 방법을 사용했다

 

초기값을 -1로 세팅해서 입력 문자열 str에 특정 알파벳이 나올 때마다

65나 97을 뺀 값을 벡터의 인덱스로 사용하여 증감연산자로 값을 1씩 올려준다

 

이때, 최대값을 저장하는 max와 최대값의 위치를 저장하는 index도 함께 업데이트를 해준다

 

문자열에서 반복되는 알파벳을 모두 체크한 다음 count를 사용하여 벡터에서 특정 max 값의 갯수를 센다

max의 값이 2개 이상이라면 물음표를 출력하고

그렇지 않는 경우에는 index에 65를 더하여 문자로 출력시켜주면 끝

 

 

코드

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

int main() {
	vector<int> v1(26,0);
	string str;
	cin >> str;
	
	int tmp = 0;
    
	int index = 0;    
	int max = -1;
    
	for(int i=0; i<str.length(); i++){
    		//소문자
    		if(97 <= str[i] && str[i] <=122) {
			v1[str[i] - 97]++;
			if(max < v1[str[i] - 97]){
				max = v1[str[i]-97];
				index = str[i]-97;
			}
		}
        	//대문자
        	else if(65 <= str[i] && str[i] <= 90){
			v1[str[i] - 65]++;
			if(max < v1[str[i] - 65]){
				max = v1[str[i]-65];
				index = str[i]-65;
			}
		}
	}
    
	int cnt = count(v1.begin(), v1.end(), max);
	if(2<=cnt) cout << "?";
	else cout << char(index + 65);
	return 0;
}

 

 

 

 

출처 : https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

반응형
반응형

문자열 반복해서 새로운 문자열을 만드는 문제

문제만보면 되게 쉬워보이는데 이전에 제출한게 틀려있길래 간만에 겸사겸사 풀어봄

 

 

 

 

 

 

 

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

//횟수만큼 반복해서 새로운 문자열 만들어주는 함수
int makeStr(int cnt, string str){
	//한번씩 출력할 문자열
	string tmpStr;
	
	for(int i=0; i<str.length(); i++){
		for(int j=0; j<cnt; j++){
			tmpStr += str[i];
		}
	}
	cout << tmpStr;
	return 0;
}

int main() {
	//전체 반복 횟수
	int totalCnt = 0;
	cin >> totalCnt;
	
    //makeStr 함수 호출 시 사용되는 변수 (횟수와 문자열)
	int tmpCnt = 0;    
	string tmpStr;
    
	for(int i=0; i<totalCnt; i++){
		cin >> tmpCnt;
		cin >> tmpStr;
		if(i>0) cout << "\n";
        //첫번째 입력이면 한번 출력 후 new line 필요없으므로
        //출력이 1이상일때부터 출력하도록 함
		makeStr(tmpCnt, tmpStr);
	}	
	return 0;
}

 

 

처음에 풀때는 메인함수에서 입력을 다 처리해주다가

그냥 문자열을 새로 만들어주는 함수 makeStr을 작성해서 호출하도록 했다

 

문자열 특성 상 배열처럼 인덱스 접근이 가능하므로

새로 만들 임시 문자열 tmpStr에 할당 연산자(+=)로 반복해야 하는 횟수만큼

i번째 문자열을 j(=cnt)번만큼 더해주었다

 

 

 

출처: https://www.acmicpc.net/problem/2675

 

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net

 

반응형
반응형

 

 

하나라도 완료를 뜨게하고싶어서 시도한 입출력문제

new line(\n)과 문자열 escape(\)를 추가해주면 간단하게 해결할수있다

 

 

 

 

#include<bits/stdc++.h>
using namespace std;
int main() {	
	cout<<"\\    /\\\n )  ( ')\n(  /  )\n \\(__)|";
	return 0;
}

예제 출력을 그대로 복사 붙여넣기한 다음,

줄바꿈이 필요한 곳은 \n를 백슬래시(\)앞에는 \를 추가해주면 된다

 

 

 

#include<bits/stdc++.h>
using namespace std;
int main() {	
	cout<<"|\\_/|\n|q p|   /}\n( 0 )\"\"\"\\\n|\"^\"`    |\n||_/=\\\\__|";
	return 0;
}

 

 

 

 

이게 왜 개랑 고양이인가 싶었는데

막상 출력해보니 은근 귀여움ㅋ

 

 

 

반응형
반응형

 

 

 

 

 

입력된 문자열 2개를 같은 문자열로 만들기 위해 제거해야할 최소의 문자의 수를 구하는문제

 

예제를 보면 aabbcc와 xxyybb는 공통된 bb만을 갖고있으므로 나머지 aacc와 xxyy는 제거되어야한다

따라서 총 8개의 문자를 제거해야하므로 출력값은 8이 나오는것

 

 

풀이를 위해 생각한 과정

 

문자열 str1, str2를 각각 입력받은 다음, a부터 z까지의 크기를 갖는 배열 arr1, arr2를 만든다

 

str1에서 나온 문자를 arr1의 알파벳 문자에 해당하는 인덱스 값을 증가시켜주어

str1에 해당하는 문자의 개수를 기록한다

 

그렇게 str2도 동일한 과정을 거쳐

arr1과 arr2와의 차이를 모두 더한 값을 출력하도록했다

 

이때, 차이는 음수가 될수있으므로 음수인경우는 -부호를 붙여 양수로 만들어 계산을 했다

 

 

문제 - str1과 str2의 사이즈가 다르다는 생각을 못해서 런타임 에러가 났다

OutOfBounds 컨테이너 또는 배열에서 할당된 경계를 넘어가는 접근 발생

 

런타임 에러가 났길래 자세히 봤더니 배열 범위에 문제가 생긴듯해서 처음에는 알파벳개수에 문제가 생긴줄알았는데

입력받는 문자열의 개수가 다를수있다는걸 간과해서

 

각각의 개수를 반복하는 반복문으로 수정해서 오류 해결완료함

 

 

 

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

int main() {	
	string str1;
	string str2;	
	cin >> str1;
	cin >> str2;
	
	int arr1[27]={0};
	int arr2[27]={0};
	
	for(int i=0; i<str1.size();i++){		
		arr1[str1[i]-'a']++;	
	}
    
	for(int i=0; i<str2.size();i++){		
		arr2[str2[i]-'a']++;
	}
    
	int ans=0;
	int tmp;
	
	for(int i=0; i<26; i++){
		tmp = arr1[i]-arr2[i];		
		if(tmp >0){
			ans+=tmp;
		}else{
			ans+=(-tmp);
		}
	}
	cout << ans;
	return 0;
}

 

 

 

 

출처 : https://www.acmicpc.net/problem/1919

 

1919번: 애너그램 만들기

두 영어 단어가 철자의 순서를 뒤바꾸어 같아질 수 있을 때, 그러한 두 단어를 서로 애너그램 관계에 있다고 한다. 예를 들면 occurs 라는 영어 단어와 succor 는 서로 애너그램 관계에 있는데, occurs

www.acmicpc.net

 

반응형
반응형

백준 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

 

반응형
반응형

 

   472

 * 385

 ㅡㅡㅡ

  2360 = (472*5)

 3776  = (472*8*10)

1416   = (472*3*100)

ㅡㅡㅡㅡ

181720 = (472*385)

 

2360은 단순하게 472와 5의 곱셈으로 표현이 가능하다

385에서 5를 추출해내는 방법은 10으로 나눈 나머지가 제일 간편하다고 생각

 

3776은 472*8의 값으로 실제 우리가 곱셈을 할 때는 80의 곱셈에서 10을 생략한 값을 쓰니까

385에서 8을 추출해내서 곱셈 값을 출력해줌

 

1416은 472*3과 같으므로 385를 100으로 나눈 몫을 사용했다

 

 

마지막 총합인 181720은 처음에 출력 값에 저 모든 값을 더했는데

생각해보니 그냥 곱셈값을 적으면 되는거라 더 단순하게 수정함

 

#include<bits/stdc++.h>

using namespace std;
int main (){
	
	int a,b;
	cin >> a;
	cin >> b;
	cout << a*(b%10) << "\n";
	cout << a*((b/10)%10) << "\n";
	cout << a*(b/100) << "\n";
	cout << a*b;
	return 0;
}

 

 

 

www.acmicpc.net/problem/2588

 

2588번: 곱셈

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

www.acmicpc.net

 

반응형
반응형

백준에 올라와있는 문제 중 윤년 문제 풀이

 

 

 

 

 

4의 배수이면서, 100의 배수가 아니거나 400의 배수인 경우, 윤년이라고 볼 수 있다

 

따라서 4로나눈 나머지가 0 임과 동시에 400으로 나눈 나머지가 0

또는 100으로 나누었을 경우 나머지가 0이 아니어야 한다

 

 

 

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

int main (){

	int N=0;
	cin >> N;
    
	if(N%4 == 0 && (N%400==0 || N%100 !=00)){
		cout << 1;
	}
	else{
		cout << 0;
	}
    
	return 0;
}

 

 

 

www.acmicpc.net/problem/2753

 

 

 

2753번: 윤년

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서

www.acmicpc.net

 

반응형

+ Recent posts