C언어:5일차 (문자열~

이미리·2021년 8월 18일
0

boj_Algorithm

목록 보기
6/25

1157번
한번에 풀었다!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	char arr[1000000];
	int leng, big=0, error=0, index=0;
	scanf("%s", arr);
	int a[26] = { 0, };
	leng = strlen(arr);
	for (int i = 0; i < leng; i++) {
		if ((97 <= arr[i]) && (arr[i] <= 122)) {
			a[arr[i] - 97] += 1;
		}
		if ((65 <= arr[i]) && (arr[i] <= 90)) {
			a[arr[i] - 65] += 1;
		}
	} //대문자 소문자 구분없이 존재하는 알파벳 위치에 +1해줌.

	//제일 큰수를 출력
	for (int i = 0; i < 26; i++) {
		if (big < a[i]) {
			big = a[i]; 
			index = i;
		}
	}
	for (int i = 0; i < 26; i++) {
		if (big == a[i]) error += 1;
	}
	if (error == 1) {
		printf("%c", index+65);
	}
	else { 
		printf("?"); 
	}
	return 0;
}

하지만 중복체크와 최대인 수 찾는 곳에서 더 단축을 할 수 있을것같은데...
한번 찾아보았다.
근데 다들 이런식으로 푼것같다.


1152번 단어의 개수 세기

입력 : the curious case of benjamin button
출력 : 6

단어의 개수 = 띄어쓰기의 개수 +1; 로 보았다
띄어쓰기는 ' '인가.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	char arr[1000001];
	int leng, space=1;
	scanf("%s", arr);
	leng = strlen(arr);
	for (int i = 0; i < leng; i++) {
		if (arr[i] == ' ') {
			space += 1;
		}
	}
	printf("%d", space);
	return 0;
}

후다닥 짜보았다!
결과는 실패!! 공백을 입력받지 못한듯 싶다. ' '--> 이게 아닌가보다.

아 공백을 입력받지 못한게 아니라 공백이 들어오면 scanf는 종료되기 때문이었따!
예를 들어 im mini를 입력하게 되면 im만 arr에 들어오게 되는 것이다.

이걸 어카냥

** %[^\n]을 이용해서 문자열을 입력 받기를 통해 해결할 수 있따.
이것은 scanset를 이용한 것인데 그것의 의미는 \n을 제외하고 모든 것들을 입력한다는 의미이다.

출처: https://travelerfootprint.tistory.com/27 [나그네의 발자취]

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	char arr[1000001];
	int leng, word, space=1;
	scanf("%[^\n]", arr);
	leng = strlen(arr);
	for (int i = 0; i < leng; i++) {
		if (arr[i] == 32) {
			space++;
		}
	}
	printf("%d", space);
	return 0;
}

틀렸습니다가 뜬다.
앞과 뒤의 공백을 고려해주지 않았기 때문이다.
만일 " im mini "라고 하면 공백이 3개이기 때문에 4가 나온다..
공백이 연속해서 나오는 경우는 없다고 문제에서 주어졌기 때문에
앞의 한글자와 뒤의 한글자를 제외하고 카운트해주면 되겠다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	char arr[1000001];
	int leng, word, space=0;
	scanf("%[^\n]", arr);
	leng = strlen(arr);
	for (int i = 1; i < leng-1; i++) {
		if (arr[i] == 32) {
			space++;
		}
	}
	printf("%d", space+1);
	return 0;
}

띄어쓰기 하나만 들어왔을때를 고려해주지 않아서인가..?
다시...
틀렷ㅅ ㅂ 니다가... 오타는 고의다..

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	char arr[1000001];
	int leng, word, space=0;
	scanf("%[^\n]", arr);
	leng = strlen(arr);
	if (leng == 1) {
		if (arr[0] == 32) {
			printf("0");
			return 0;
		}
	}
	else {
		for (int i = 1; i < leng - 1; i++) {
			if (arr[i] == 32) {
				space++;
			}
		}
	}
	printf("%d", space+1);
	return 0;
}

컴퓨터는 참.. 새삼.. 응 박대가리야. 딱 보면 단어 몇개인지 알아채는 인간이랑은 다르다... 그래두 얘는 나보다 똑똒하다는 점이 개꼴받는다는 ㄴ것..응


2908번 상수
EZ EZ

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	char num1[4], num2[4];
	int n, m;
	scanf("%s", num1);
	scanf("%s", num2);
	n = ((num1[2] - 48) * 100) + ((num1[1] - 48) * 10) + (num1[0]-48);
	m = ((num2[2] - 48) * 100) + ((num2[1] - 48) * 10) + (num2[0]-48);
	if (m <= n)printf("%d", n);
	else printf("%d", m);
	return 0;
}

사실 not EZ
한참을 헤맸다. 아스키코드를 바로 생각해내지 못했기 때문에...
숫자가 들어올 땐 당연히 1-->1 이렇게 대응하는 줄알앗따.
0-->48...이라는걸 ㅠㅠ

0개의 댓글

관련 채용 정보