CamelCase를 Pothole_case 로 바꾸기!

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

Example:

codingDojang --> coding_dojang

numGoat30 --> num_goat_3_0

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

출처: UT past test

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

59개의 풀이가 있습니다. 1 / 6 Page

파이썬입니다.

import re

pc = lambda src: re.sub("([A-Z0-9])", lambda m:"_"+m.group().lower(), src)

print(pc("codingDojang"))  # coding_dojang
print(pc("numGoat30"))     # num_goat_3_0

첫번째 문자가 대문자인 경우는 생각하지 않고 대문자나 숫자인 경우 무조건 "_"+소문자로 변경하도록 했습니다.

안녕하세요~ 혹시 re.sub의 두번째 인수인 lambda m에서 m에 어떻게 값이 전달되는지 알 수 있을까요? 사용자는 src만 넘겨주는데, 파이썬의 어떤 문법적 근거로 저게 가능한지 궁금하네여 - 김 매미, 2015/11/02 16:29 M D
+1 re.sub 을 위처럼 사용하면 함수를 인자로 전달받을 수 있습니다. 여기서 함수는 lambda를 이용한거구요, re.sub 에서 사용된 함수의 파라미터는 정규식에 매치되는 match object입니다. 결국 re.sub가 그 역할을 해준다고 봐야 할 것 같네요. - 길가의풀, 2015/11/02 21:04 M D
갓 파이썬.... - 강승윤, 2016/07/07 19:46 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def to_pathole(s):
    res=''
    for c in s:
        if c.isupper():c='_'+c.lower()
        elif c.isdigit():c='_'+c
        res += c
    return res

print to_pathole('codingDojang')
print to_pathole('numGoat30')
이해하기도 좋고 직관적인것 같아요 감사합니다 - 님드락, 2016/10/27 10:55 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬입니다.

def do(l):
    a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    return "".join(["_" + c.lower() if c in a else c for c in l])

print(do('numGoat30'))
단 3줄에 끝내다니 대단하시네요. - 최승호, 2016/07/15 00:01 M D
이 아이디어 좋네요^^ - 디디, 2016/10/18 22:38 M D
if c in a else c for c in l 이 부분을 어떻게 이해해야 하는지 혹시 도움좀 주실 수 있으신가요?ㅠㅠ - 님드락, 2016/10/27 11:01 M D
`A if CONDITION else B`는 파이썬의 3항 연산자 대응표기입니다. 그러니 `("_"+c.lower() if c in a else c) for c in l` 로 이해하시면 됩니다. - 룰루랄라, 2016/10/27 18:49 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
static void Main(string[] args)
        {
            string input = Console.ReadLine();
            StringBuilder answer = new StringBuilder();

            for (int i = 0; i < input.Length; i++)
            {
                string bigyo = input.Substring(i, 1);

                if (bigyo == bigyo.ToUpper() || IsNumeric(bigyo) == true)
                {
                    answer.Append("_" + bigyo.ToLower());
                }
                else
                {
                    answer.Append(bigyo);
                }

                Console.WriteLine(answer.ToString());
            }

        }

        static bool IsNumeric(string Tst)
        {
            int result = 0;
            return int.TryParse(Tst, out result);
        }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import re

change = lambda src: re.sub("([A-Z0-9])", lambda m:"_"+m.group().lower(), src)

print(change("codingDojang"))  # coding_dojang
print(change("numGoat30"))     # num_goat_3_0
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
$str = "numGoat30";
$keywords = preg_replace_callback("/[A-Z0-9]/",'change',$str);
function change($matches) {
    return "_".strtolower($matches[0]);
}
echo $keywords;
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

VB.NET

    Sub Main()
        Dim input As String = Console.ReadLine
        Dim r As New Text.StringBuilder

        For i As Integer = 0 To input.Length - 1
            Dim p As String = input.Substring(i, 1)

            r.Append({"_", ""}(CInt(p.ToUpper = p Or IsNumeric(p)) + 1) & p.ToLower)
        Next

        Console.WriteLine("Result: {0}", r.ToString)

        Console.ReadLine()
    End Sub
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def camel_to_pothole(camel):
        pothole = ""
        for ch in camel:
                if ch.isupper():
                        pothole = pothole + "_" + ch.lower()
                elif ch.isdigit():
                        pothole = pothole + "_" + ch
                else:
                        pothole = pothole + ch

        return pothole

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

Common Lisp 시도입니다.

(defun camel-to-pothole (string)
  (let ((buffer))
    (mapcar (lambda (ch)
              (if (or (upper-case-p ch) (digit-char-p ch))
                  (progn
                    (push #\_ buffer)
                    (push (char-downcase ch) buffer))
                  (push ch buffer)))
            (coerce string 'list))
    (coerce (reverse buffer) 'string)))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
            string input = Console.ReadLine();

            foreach(char c in input)
                if (c.ToString().Equals(c.ToString().ToUpper()))
                    input = input.Replace(c.ToString(), "_" + c.ToString().ToLower());

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

풀이 작성

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

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


언어별 풀이 현황
전 체 x 59
java x 10
scala x 1
python x 30
javascript x 1
lisp x 1
기 타 x 3
cpp x 5
cs x 4
objectivec x 1
php x 1
ruby x 2