◇ 문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
◇ 제한 조건
- 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
- 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
◇ 입출력 예시
s | return |
"try hello world" | "TrY HeLlO WoRlD" |
◇ 예시 설명
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.
◇ 초기 내용
※ [출처] 프로그래머스-코딩테스트 연습-문제명
※ 초기 내용을 참고하여 문제에 맞는 코드를 작성하세요.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* s) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
char* answer = (char*)malloc(1);
return answer;
}
◇ 답안
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
char* solution(const char* s) {
char* answer = (char*)malloc(sizeof(char) * strlen(s));
int cnt = 0;
char* str = s;
for(int i = 0; i<strlen(s); i++){
if(str[i] >= 'A' && str[i]<= 'Z'){
str[i] = str[i] + 32;
}
}
for (int i = 0; i < strlen(s); i++) {
if (str[i] == ' ') {
cnt = 0; continue;
}
if (cnt % 2 == 0) {
//대문자
str[i] = str[i] - 32;
cnt++;
}
else {
//소문자
cnt++;
}
}
answer = str;
return answer;
}
◇ 답안 힌트
▶ s에는 소문자와 대문자가 섞여 있습니다. s 전체를 소문자 혹은 대문자로 완전히 바꿔주세요.
▶ 빈공백 문자(' ')를 만나면 str을 세는 변수는 0이됩니다.
▶ 아스키 코드 : (소문자) - (대문자) = 32이므로 소문자 - 32 = 대문자를 나타냄
◇ 답안 풀이
(※ 실행 흐름 순으로 해석됩니다.)
char* solution(const char* s) {
//s의 길이만큼 메모리 할당
char* answer = (char*)malloc(sizeof(char) * strlen(s) );
//str의 각 '단어'의 문자에 대한 위치를 나타낼 변수
int cnt = 0;
//s는 상수이므로 str변수에 s를 저장하여 선언
char* str = s;
//만약, str[i]가 대문자이면 소문자로 변환 -> 모든 str의 값을 소문자로 변환
for(int i = 0; i<strlen(s); i++){
if(str[i] >= 'A' && str[i]<= 'Z'){
str[i] = str[i] + 32;
}
}
for (int i = 0; i < strlen(s); i++) {
//만약, str[i]의 값이 ' '공백 문자이면 cnt를 0으로 초기화 한 후, 아래 내용을 수행하지 않음
//ex. str = good day(아래 참조)
str[i] | 'g' | 'o' | 'o' | 'd' | 'd' | 'a' | 'y' | |
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
cnt | 0 | 1 | 2 | 3 | 0 | 0 | 1 | 2 |
if (str[i] == ' ') {
cnt = 0; continue;
}
//만약, cnt(각 단어에 따른 문자 위치)가 짝수이면 소문자(위에서 모든 값을 소문자로 변환함)를 대문자로 변환
// 아스키 코드 : (소문자) - (대문자) = 32이므로 소문자 - 32 = 대문자를 나타냄
//단어 위치 +1
if (cnt % 2 == 0) {
//대문자
str[i] = str[i] - 32;
cnt++;
}
//만약, cnt(각 단어에 따른 문자 위치)가 홀수이면 원래 소문자 이므로 값을 변환할 필요 없음
//단어위치 +1
else {
//소문자
cnt++;
}
}
//answer에 str값 대입
answer = str;
return answer;
}
◇ 실행결과
◇ 출처
https://programmers.co.kr/learn/challenges
코딩테스트 연습
기초부터 차근차근, 직접 코드를 작성해 보세요.
programmers.co.kr
'코딩테스트 > C언어' 카테고리의 다른 글
[Level1] 자릿수 더하기 답안 및 풀이 (0) | 2021.06.09 |
---|---|
[Level1] 약수의 합 답안 및 풀이 (0) | 2021.06.08 |
[Level1] 문자열을 정수로 바꾸기 답안 및 풀이 (0) | 2021.06.07 |
[Level1] 문자열 다루기 기본 답안 및 풀이 (0) | 2021.06.07 |
[Level1] 문자열 내림차순으로 배치하기 답안 및 풀이 (0) | 2021.06.06 |
댓글