프로그래머스 레벨 1 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <vector>
 
using namespace std;
 
vector<int> solution(long long n) {
    vector<int> answer;
    
    while(n > 0)
    {
        answer.emplace_back(n % 10);
        n /= 10;
    }
    
    return answer;
}
 

자연수를 뒤집지 않고 배열로 만든다면 string으로 변환해서 앞에서부터 숫자로 배열에 집어 넣으면 된다.

프로그래머스 레벨 1 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
int solution(int n)
{
    int answer = n % 10;
        
    for(int i = 10 ; ; i *= 10 )
    {
        if(i > n)
            break;
        
        int Numb = n / i;
        answer += Numb % 10;
    }
    
    return answer;
}
 

직접 푼것.

 

while (n > 0)

{

    answer += n % 10;

    n /= 10;

}

 

while을 활용한 방법도 있다.

 

모범답안

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
 
using namespace std;
int solution(int n)
{
    int answer = 0;
 
    string s = to_string(n);
 
    for(int i = 0; i < s.size(); i++)
        answer += (s[i] - '0');
 
    return answer;
}
 

스트링을 이용해서 푸는 것은 생각했으나 ascii 코드를 활용해 푸는 것은 생각못해서 가져온 모범답안.

ascii 코드로 숫자는 '0'(48) 이후의 숫자이기 문자열에서 '0'을 빼주면 숫자로 변환된다.

 

프로그래머스 레벨 1 테스트

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <string>
#include <vector>
 
using namespace std;
 
string solution(string s) {
    string answer = "";
    string strTmp = "";
    
    for(int i = 0 ; i < s.size() ; i++)
    {
 
        
        if(isspace(s[i]))
        {
            for(int j = 0 ; j < strTmp.size() ; j++)
            {
                if ((j % 2== 0 && islower(strTmp[j]))
                    strTmp[j] = toupper(strTmp[j]);
                else if((j % 2!= 0 && isupper(strTmp[j]))
                    strTmp[j] = tolower(strTmp[j]);
            }
            answer += strTmp;
            answer += " ";
            strTmp.clear();
        }
        else
            strTmp += s[i];
        
        if(i == s.size()-1)
        {
            for(int j = 0 ; j < strTmp.size() ; j++)
            {
                if ((j % 2== 0 && islower(strTmp[j]))
                    strTmp[j] = toupper(strTmp[j]);
                else if((j % 2!= 0 && isupper(strTmp[j]))
                    strTmp[j] = tolower(strTmp[j]);
            }
            answer += strTmp;
            strTmp.clear();
        }
        
    }
    
    return answer;
}
 

의사코드

1. 공백이 나올때까지 문자열을 검사하며 수집한다.

2. 공백이 나오면 문자열을 저장하고 사이즈를 측정해 % 2 나머지가 0인것을 대문자로 변환한다.

3. 문자열이 대소문자 섞여서 나올 수 있기때문에 소문자인지 대문자인지 검사한 후 변환한다.

4. 정렬되면 정답 배열에 집어 넣는다.

 

// 수정 코드

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <string>
#include <vector>
 
using namespace std;
 
string solution(string s) 
{
    string answer = "";
    
    //문장의 시작을 홀수로 만듬
    int oddeven = 1;
    for (int i = 0; i < s.size(); i++)
    {
        if (isspace(s[i]))
        {
            answer += " ";
            //공백인 경우 짝수부터 문장 시작
            oddeven = 1;
            continue;
        }
 
        if (oddeven == 1 && islower(s[i]))
        {
            answer += toupper(s[i]);
            oddeven--;
            continue;
        }
        else if (oddeven == 0 && isupper(s[i]))
        {
            answer += tolower(s[i]);
            oddeven++;
            continue;
        }
 
        answer += s[i];
        //현재 문장의 홀짝 구분
        oddeven = (oddeven == 0) ? 1 : 0;
    }
    
    return answer;
}
 

if문과 for문이 너무 많이 들어가서 수정.

만약 isupper, toupper 같은 함수를 사용할 수 없다면

ascii 코드를 이용해 대소문자 확인 후 변경해주는식으로 코드를 짤 수 있다.

+ Recent posts