새소식

⌨️ Algorithms/백준

[Python] 백준 16205번_변수명

2023. 5. 9. 23:50

  • -

https://www.acmicpc.net/problem/16205

 

16205번: 변수명

첫째 줄에 사용한 표기법의 번호와 변수명이 주어진다. 번호가 1인 경우는 카멜 표기법, 2인 경우는 스네이크 표기법, 3인 경우는 파스칼 표기법이다. 입력으로 주어지는 변수명의 길이는 100을

www.acmicpc.net

 

  • 변수명을 정하는 표기법은 여러 가지가 있음
    • 카멜 표기법 (Camel Case): 각 단어의 첫 글자를 대문자로 적음. 단, 가장 첫 글자는 소문자를 사용
      • 예시: camelCase, variableN, thisIsCamelCase, howToSolveThisProblem
    • 스네이크 표기법 (Snake Case): 소문자만 사용하고, 각 단어의 사이에 언더바(_)를 넣어서 적음
      • 예시: snake_case, variable_n, this_is_snake_case, how_to_solve_this_problem
    • 파스칼 표기법 (Pascal Case): 카멜 표기법과 같지만, 가장 첫 글자도 대문자를 사용
      • 예시: PascalCase, VariableN, ThisIsPascalCase, HowToSolveThisProblem
  • 한 표기법을 사용한 변수명이 주어졌을 때, 이를 다른 표기법으로 변환하기
  • 입력
    • 첫째 줄에 사용한 표기법의 번호와 변수명이 주어짐
    • 번호가 1인 경우는 카멜 표기법, 2인 경우는 스네이크 표기법, 3인 경우는 파스칼 표기법
    • 입력으로 주어지는 변수명의 길이는 100을 넘지 않음
    • 카멜 표기법, 파스칼 표기법을 사용한 변수명은 알파벳 소문자와 대문자로만 이루어져 있고, 스네이크 표기법을 사용한 변수명은 알파벳 소문자와 언더바(_)로만 이루어져 있음
    • 또, 스네이크 표기법을 사용한 변수명의 첫 글자와 마지막 글자는 언더바가 아니고, 언더바가 연속해서 두 개 이상 사용하는 경우는 없음
  • 출력
    • 첫째 줄에 카멜 표기법을 사용한 경우, 둘째 줄에 스네이크 표기법을 사용한 경우, 셋째 줄에 파스칼 표기법을 사용한 경우를 출력
  • 시간 제한: 2초
  • 메모리 제한: 512 MB

 

"""
입출력 예시)

(예제 입력 1) 
2 variable_n
            -> variableN
               variable_n
               VariableN

(예제 입력 2) 
1 camelCase
            -> camelCase
               camel_case
               CamelCase

(예제 입력 3) 
3 HowToSolveThisProblem
            -> howToSolveThisProblem
               how_to_solve_this_problem
               HowToSolveThisProblem

(예제 입력 4) 
2 good
            -> good
               good
               Good
"""

 

 

## 의사코드 ##

# 카멜, 파스칼 표기법 -> 대문자를 기준으로 자르기
# import re
# re.findall('[A-Z][a-z]*', string)

# 스네이크 표기법 -> 언더바를 기준으로 자르기
# string.split('_')

 

 

 

 

import re
n, string = input().split()

# 표기법 번호에 따라 단어 나누기
# 카멜 표기법
if n == '1':
    variables = re.findall('[A-Z][a-z]*', string)
# 스네이크 표기법
elif n == '2':
    variables = string.split('_')
# 파스칼 표기법
else:
    variables = re.findall('[A-Z][a-z]*', string)

# 다른 표기법으로 변환
# 파스칼 표기법: 가장 첫 글자도 대문자, 나머지도 각 단어의 첫 글자를 대문자로
for v in variables:
    v = v.title()
pascal = ''.join(variables)

# 카멜 표기법: 첫 번째 단어의 가장 첫 글자는 소문자, 나머지는 각 단어의 첫 글자를 대문자로
variables[0] = variables[0].lower()
camel = ''.join(variables)

# 스네이크 표기법: 소문자만 사용, 각 단어 사이에 언더바
for i in range(1, len(variables)):
    variables[i] = variables[i].lower()
snake = '_'.join(variables)

print(camel)
print(snake)
print(pascal)

 

 

  • (틀림)
    • 'title()'을 사용한 부분에서 리스트 요소가 변경되지 않아서 틀림
    • + 카멜 표기법인 경우 틀림

 

 

 

 

import re
import sys
n, string = sys.stdin.readline().split()

# 표기법 번호에 따라 단어 나누기
# 카멜 표기법
if n == '1':
    variables = re.findall('[A-Z][a-z]*', string)
# 스네이크 표기법
elif n == '2':
    variables = string.split('_')
# 파스칼 표기법
else:
    variables = re.findall('[A-Z][a-z]*', string)

# 다른 표기법으로 변환
# 파스칼 표기법: 가장 첫 글자도 대문자, 나머지도 각 단어의 첫 글자를 대문자로
for i in range(len(variables)):
    variables[i] = variables[i].title()
pascal = ''.join(variables)

# 카멜 표기법: 첫 번째 단어의 가장 첫 글자는 소문자, 나머지는 각 단어의 첫 글자를 대문자로
variables[0] = variables[0].lower()
camel = ''.join(variables)

# 스네이크 표기법: 소문자만 사용, 각 단어 사이에 언더바
for i in range(1, len(variables)):
    variables[i] = variables[i].lower()
snake = '_'.join(variables)

print(camel)
print(snake)
print(pascal)

 

 

  • (해결)
    • 'title()'을 사용한 부분에서 리스트 요소가 변경되지 않아서 틀림
      • -> 인덱스로 리스트 요소 값 변경

 

  • (틀림)
    • 런타임 에러
    • + 카멜 표기법인 경우 틀림

 

 

 

 

import re
import sys
n, string = sys.stdin.readline().split()

# 첫 번째 단어의 가장 첫 글자
firstWord = [string[0]] 

# 표기법 번호에 따라 단어 나누기
# 카멜 표기법
if n == '1':
    variables = re.findall('[A-Z][a-z]*', string)
    # 소문자로 이뤄진 단어 하나 분리
    for i in range(1,len(string)):
        if string[i].isupper():
            break
        else:
            firstWord[-1] += string[i]
    variables = firstWord + variables
# 스네이크 표기법
elif n == '2':
    variables = string.split('_')
# 파스칼 표기법
elif n == '3':
    variables = re.findall('[A-Z][a-z]*', string)

# 다른 표기법으로 변환
# 파스칼 표기법: 가장 첫 글자도 대문자, 나머지도 각 단어의 첫 글자를 대문자로
for i in range(len(variables)):
    variables[i] = variables[i].title()
pascal = ''.join(variables)

# 카멜 표기법: 첫 번째 단어의 가장 첫 글자는 소문자, 나머지는 각 단어의 첫 글자를 대문자로
variables[0] = variables[0].lower()
camel = ''.join(variables)

# 스네이크 표기법: 소문자만 사용, 각 단어 사이에 언더바
for i in range(1, len(variables)):
    variables[i] = variables[i].lower()
snake = '_'.join(variables)

print(camel)
print(snake)
print(pascal)

 

 

  • (해결)
    • 카멜 표기법인 경우 틀림
      • 're.findall('[A-Z][a-z]*', string)' 은 대문자, 소문자의 순서로 분리하기 때문에 첫 번째 단어가 variables에 들어가지 않음.
      • -> 첫 번째 단어의 가장 첫 글자를 따로 분리해서 역순으로 첫 번째 단어를 다시 합쳐줌

 

 

  • string.title()
    • 모든 단어의 첫 글자를 대문자로 바꿔줌
    • cf) string.capitalize()
      • 가장 첫 번째 단어의 첫 글자만 대문자로 바꿈

 

 

 

 

 

 

https://concho.tistory.com/29

 

백준 16205 python

https://www.acmicpc.net/problem/16205 16205번: 변수명 첫째 줄에 사용한 표기법의 번호와 변수명이 주어진다. 번호가 1인 경우는 카멜 표기법, 2인 경우는 스네이크 표기법, 3인 경우는 파스칼 표기법이다.

concho.tistory.com

 

https://zephyrus1111.tistory.com/204

 

파이썬(Python) 영어 대문자, 소문자 다루기 (feat. capitalize, title, swapcase, upper, lower)

파이썬(Python)에서는 영어 문자열에 대해서 대문자 소문자를 다룰 수 있는 여러 함수를 제공한다. 이번 포스팅에서는 영어 문자열에서 대문자, 소문자를 다룰 수 있는 capitalize, title, swapcase, upper,

zephyrus1111.tistory.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!