7번 문제
내가 풀이한 답
처음에 배열 하나만 가지고 index의 위치를 기준으로 코드를 짜려고 했다. 하지만, 너무 비효율적이라는 생각이 들었고 다른 방법을 생각해보았다. 방법이 잘 떠오르지 않아서 강의 초반부를 들었다. 그 때, 머리를 망치로 얻어맞은듯한 느낌을 받았다. 배열을 하나 더 사용하는 것이었다. 왜 이런 방법이 안떠올랐을까 하면서 자괴감이...
처음 입력된 값을 받는 scanf에서 공백이 섞인 문자를 읽어들이기 위해 %[^\n]이라는 것을 사용했다. 이는 \n을 제외한 나머지들을 읽어들이는 역할을 한다. 그리고 공백없이 문자를 담을 배열인 b는 index라는 변수를 따로두었다. 공백이 아닌 문자가 확인될 때마다 index 변수에 해당하는 index에 값을 소문자로 변환해서 집어넣었다. 이 때, 소문자로 바꿔주는 것은 cctype 라이브러리의 tolower를 썼다. 이것도 정리를 해놔야겠다.
#include <stdio.h>
#include <cstring>
#include <cctype>
using namespace std;
int main(int argc, char** argv) {
//freopen("input.txt", "rt", stdin);
char a[101], b[101];
scanf("%[^\n]", &a);
int i, index = 0;
for(i=0; i<strlen(a); i++){
if(a[i] != ' '){
b[index] = tolower(a[i]);
index++;
// b[index++] = tolower(a[i]);
}
}
//b[index] = '\0';
printf("%s", b);
return 0;
}
}
그 결과 통과를 했다.
사이트의 답안
#include<stdio.h>
using namespace std;
int main(){
//freopen("input.txt", "rt", stdin);
char a[101], b[101];
int i, p=0;
gets(a);
for(i=0; a[i]!='\0'; i++){
if(a[i]!=' '){
if(a[i]>=65 && a[i]<=90){
b[p++]=a[i]+32;
}
else b[p++]=a[i];
}
}
b[p]='\0';
printf("%s\n", b);
return 0;
}
나는 공백이 섞인 문자를 읽어들이기 위해 %[^\n]이라는 것을 사용했는데 gets라는 함수를 써서 쉽게 해결할 수 있었다. 또 하나 배워간다. 그리고 여기서 대, 소문자를 구분하기 위해 아스키 코드 65~90에 해당하는 대문자를 조건문으로 삼아 +32를 해주어 소문자로 만들었다.