CamelCase를 Pothole_case 로 바꾸기!

파이썬과 같은 몇몇 프로그래밍 언어는 Pothole_case 를 더 선호하는 언어라고 합니다.

Example:

codingDojang --> coding_dojang

numGoat30 --> num_goat_3_0

위 보기와 같이 CameleCase를 Pothole_case 로 바꾸는 함수를 만들어요!

출처: UT past test

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

68개의 풀이가 있습니다. 6 / 7 Page

c로 작성하였습니다

#include<stdio.h>

// This program transform CamelCase into Pothole_case

int main(void){

    FILE * f;
    int start_state=0;
    char c;

    f=fopen("file_output.txt","w");

    while((c=getchar()))
    {
        if('A'<= c && c <= 'Z'){
            if(start_state==1){
                fprintf(f,"%s","_");
            }
            c=c+('a'-'A');
            fprintf(f,"%c",c);
        }

        else if('0' <=c && c <= '9'){
            if(start_state==1){
                fprintf(f,"%s","_");
                }
            fprintf(f,"%c",c);
        }

        else{
            fprintf(f,"%c",c);
        }

        start_state=1;

        if(c=='\n' || c==EOF)
            break;

    }

    fclose(f);




    return 0;
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

안녕하세요. C++로 풀어봤습니다. 예시에 대문자로 시작하는 경우가 없는거 같아서 일단 무조건 소문자로 시작하는 전제로 풀었습니다.

#include<iostream>
#include<string>
using namespace std;

int setSign(int num)
{
    if(num > 96 && num <123)//소문자
        return -1;
    else if(num > 64 && num <91)//대문자
        return 1;
    else
        return 0;
}

void main()
{
    cout<<"Hello Stranger??"<<endl;

    string str;
    string res = "";

    cout<<"문자열을 입력하시오"<<endl;
    cin>>str;

    for(int i=0; i<str.length(); i++)
    {
        if(setSign((int)str[i]) == 1)
        {
            str[i] = (char)((int)str[i] + 32);
            res = res+'_';
        }
        else if(setSign((int)str[i]) == 0)
        {
            res = res+'_';
        }
        res = res + str[i]; 
    }
    cout<<res;
}


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

public static void main(String[] args) { String text = "numGoat30"; String newText = ""; int increaseNumber = 0;

    for(int i = 0; i < text.length(); i++) {
        if(Character.isUpperCase(text.charAt(i)) || (text.charAt(i) >= 48 && text.charAt(i) <= 57)) {
            if(newText.equals("")) {
                newText = text.substring(0, i) + "_" + Character.toString(text.charAt(i)).toLowerCase() + text.substring(i + 1);
            }
            else {
                newText = newText.substring(0, i + increaseNumber) + "_" + Character.toString(text.charAt(i)).toLowerCase() + text.substring(i + 1);
            }
            increaseNumber++;
        }
    }
    System.out.println(newText);
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import re
def to_pothole_case(arg):
    return re.sub(r'((?<!^)(?<!_))([A-Z0-9])', r'_\2', arg).lower()

Python 3.5.2에서 작성하였습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

자바로 작성했습니다.

public String PotholecaseParser(String input){

        String strResult = "";

        for(int i =0; i< input.length(); i++){

            if((input.charAt(i) >= 65 && input.charAt(i) <= 90) || (input.charAt(i) >= 48 && input.charAt(i) <= 57)){

                strResult += "_";

            }
            strResult += input.charAt(i);

        }

        strResult = strResult.toLowerCase();

        return strResult;
    }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def changePothole(st):
    new_s = ''
    for i,s in enumerate(st):
        if ord(s) >= 65 and ord(s) <= 90:
            new_s = new_s + '_' + chr(ord(s)+32)
        elif ord(s) >= 48 and ord(s) <= 57:
            new_s = new_s + '_' + s
        else:
            new_s = new_s + s
    return new_s

print(changePothole('numGoat30'))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

아직 눕눕이라...

f = "CodingDojang"

for i in f[1:]: #첫번째는 안건든다 생각하고...
    if i.isupper or i.isdigit():
        f = f.replace(i, '_' + i)

new_f = f.lower()
print(new_f)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
string,result = input(),str()
for x in string:
    if x.isupper() or x.isnumeric():
        result += '_' + x.lower()
    else:
        result += x
print(result)

#### 2016.12.12 D- 437 ####
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

C(11) gcc v4.9.4

//79COLUMNS////////////////////////////////////////////////////////////////////
// CamelCase를 Pothole case로 바꾸기
#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define MAX_WORD_LEN 80 // 한단어의 최대길이

// 주요함수
static char *to_pothole(const char *str);
// 문자열 헬퍼 함수
inline static void line_clear(void) { while (getchar() != '\n') continue; }
static char* s_gets(char* line, int length);

int main(void)
{
    char temp[MAX_WORD_LEN]; 
    while (s_gets(temp, MAX_WORD_LEN))
    {
        strcpy(temp, to_pothole(temp));
        puts(temp);
    }

    return 0;
}

char *to_pothole(const char *str)
{
    static char temp[MAX_WORD_LEN];
    int cursor = 0;

    while (*str)
    {
        if (isupper(str[cursor])) // 첫글자 대문자는 소문자로 변경
        {
            temp[cursor++] = tolower(*str++);
            continue;
        }

        if (isupper(*str) || isdigit(*str)) // 대문자, 숫자는 _문자로 변경
        {
            temp[cursor++] = '_';
            if (cursor == MAX_WORD_LEN - 1) // 단어길이 제한을 넘어갈수있다
                break;
            temp[cursor++] = tolower(*str++);
        }

        else
            temp[cursor++] = *str++;

        if (cursor == MAX_WORD_LEN - 1) // 단어길이제한을 지키자
            break;

    }
    temp[cursor] = '\0'; // 중요하다

    return temp;
}

static char* s_gets(char* line, int length)
{
    char* ret;
    char* find;

    ret = fgets(line, length, stdin);
    if (ret)    // ret != NULL
    {
        find = strchr(line, '\n');
        if (find)   // find != NULL
            *find = '\0';
        else    // find == '\0'
            line_clear();
    }

    return ret;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def Pothole_case(name):
    name=list(name)
    case=[]
    case+=[name[0].lower()]
    name=name[1:]
    while name!=[]:
        if name[0].upper()==name[0]:
            case+=[name[0].lower()]
        else:
            case[-1]+=name[0]
        if len(name)>1:
            name=name[1:]
        elif len(name)==1:
            name=[]
    print("_".join(case))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 68
python x 35
cs x 4
php x 1
기 타 x 4
lisp x 1
ruby x 2
cpp x 6
scala x 1
java x 12
javascript x 1
objectivec x 1