WeniVooks

검색

위니브 월드(선생님용)

직원의 승진

1. 챕터의 목표

문자열: 문자열의 특징을 파악합니다.

인덱싱: 문자열 인덱싱을 통해 문자를 호출할 수 있습니다.

슬라이싱: 문자열 슬라이싱을 통해 특정 문자를 추출할 수 있습니다.

메서드: 문자열 메서드를 통해 문자열의 형태를 다양하게 변경할 수 있습니다.

2. 스토리

작은 생선가게는 캣네생선으로 이름을 바꾸고 더 큰 성장을 위해 주식회사가 되었습니다. 라이언 타운의 귀족들은 캣네생선의 급격한 성장을 경계하며 시기와 질투를 하게 됩니다.

여기다 귀족들은 라이캣을 무너트리기 위해서 첩자까지 파견하기에 이릅니다. 라이캣은 이미 첩자가 새로 들어온 기술자 하티라는 것을 알고 있었어요. 뮤라가 라이캣에게 알려주었기 때문입니다.

“첩자를 어떻게 하실 생각이신가요?”

“내보내도 또 들어올 거다냥, 그리고 더욱 은밀히 감출 것이다냥. 차라리 가까이 두자냥!”

라이캣은 누구나 사용할 수 있는 병원을 설립한다라는 목표가 있었습니다. 그 병원은 돈이 있다고 설립할 수 있는 것이 아니라는 것을 라이캣은 알고 있었습니다. 위니브월드의 대부분의 사람들이 그의 편이 되어주어야 합니다. 심지어 적까지도요.

라이캣의 눈이 빛났습니다.

2.1 임무

아래 문자열을 입력받아 뮤라는 최고 운영 책임자로, 첩자 하티는 최고 기술 책임자로 임명해 주세요. 아래 기본 코드를 복사해 놓고 터미널에 출력 문장이 출력될 수 있도록 해주세요.

2.1.1 기본 코드
공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
2.1.2 출력
'최고 운영 책임자 뮤라, 최고 기술 책임자 하티로 임명합니다. - 대표 라이캣'
'최고 운영 책임자 뮤라, 최고 기술 책임자 하티로 임명합니다. - 대표 라이캣'
2.2 사용 코드

아래 코드들을 조합하여 문제를 풀어주세요.

mission_start()
mission_end()
'hello' + 'world'
'hello'[0]
'1, 2, 3'.replace(',', '')
'hello world'[2:6]
mission_start()
mission_end()
'hello' + 'world'
'hello'[0]
'1, 2, 3'.replace(',', '')
'hello world'[2:6]

3. 문제 풀이

3.1 문자열 자료형(str)

문자열(str, 스트링)은 양 끝이 작은따옴표나 큰따옴표로 이뤄져 있는 글자를 나타냅니다. 문자열에는 순서가 있어, 아래와 같이 위치 번호를 이용하여 특정 위치의 문자를 출력할 수 있습니다. 여기서 주의할 점은 띄어쓰기도 문자로 인식한다는 것입니다. print(s[5])에서 아무것도 출력되지 않는 것이 아니라 띄어쓰기가 출력된 것입니다.

s = 'hello world'
print(s[0]) # h
print(s[1]) # e
print(s[2]) # l
print(s[3]) # l
print(s[4]) # o
print(s[5]) #
print(s[6]) # w
print(s[7]) # o
print(s[8]) # r
print(s[9]) # l
print(s[10]) # d
s = 'hello world'
print(s[0]) # h
print(s[1]) # e
print(s[2]) # l
print(s[3]) # l
print(s[4]) # o
print(s[5]) #
print(s[6]) # w
print(s[7]) # o
print(s[8]) # r
print(s[9]) # l
print(s[10]) # d

여기서 hello만 잘라내고 싶다면 아래와 같이 사용할 수 있습니다.

s = 'hello world'
print(s[0], s[1], s[2], s[3], s[4])
print(s[0] + s[1] + s[2] + s[3] + s[4])
s = 'hello world'
print(s[0], s[1], s[2], s[3], s[4])
print(s[0] + s[1] + s[2] + s[3] + s[4])

그렇지만 이렇게 표현하는 것은 매우 번거로운 일일 것입니다.

문자열은 위치 번호를 이용하여 위치의 문자 값을 가져올 수도 있지만, 범위를 지정하여 문자열을 가져올 수도 있습니다. 따라서 hello만 잘라내는 코드는 다음과 같이 표현할 수도 있습니다.

s = 'hello world'
s[0:5]
s = 'hello world'
s[0:5]

위 코드는 0부터 5번째 전까지 잘라내는 코드입니다. 이렇게 일부분을 잘라내는 것을 슬라이싱이라고 합니다.

메서드는 해당 자료형을 보다 쉽게 다룰 수 있게 해줍니다. dir()로 확인할 수 있습니다. type()과 함께 많이 사용되는 것이니 꼭 기억해 주세요.

s = 'hello world'
print(type(s))
print(dir(s))
s = 'hello world'
print(type(s))
print(dir(s))

이렇게 하면 아래와 같이 많은 코드가 출력되는 것을 확인할 수 있습니다.

<class 'str'>
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix', 'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
<class 'str'>
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix', 'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

여기서 언더바가 2개인 것을 매직 메서드라고 하고 언더바가 없는 것을 메서드라고 합니다. 매직 메서드는 이 자료형의 특징을 정의한 것입니다. 예를 들어 __add__와 같은 경우 문자열의 더하기를 가능하게 해줍니다. 메서드는 해당 자료형을 편리하게 다루기 위해 사용합니다. 예를 들어 upper와 같은 경우 모든 문자를 대문자로 변환해 줍니다. 자주 사용되는 메서드와 메서드 정의는 아래와 같습니다.

  • count : 원하는 문자열의 개수를 셉니다.
    s = 'hello world'
    s.count('l') # l이 3개라서 3으로 출력
    s = 'hello world'
    s.count('l') # l이 3개라서 3으로 출력
  • find: 원하는 문자열의 위치를 알려줍니다. 문자열이 없는 경우 -1을 반환합니다.
    s = 'hello world'
    s.find('l') # l의 위치가 2라서 2를 반환
    s = 'hello world'
    s.find('l') # l의 위치가 2라서 2를 반환
  • index: 원하는 문자열의 위치를 알려줍니다. 문자열이 없는 경우 error를 반환합니다.
    s = 'hello world'
    s.index('l') # l의 위치가 2라서 2를 반환
    s = 'hello world'
    s.index('l') # l의 위치가 2라서 2를 반환
  • isdigit: 해당 문자열이 숫자만 들어있는지 판단해 줍니다.
    s = 'hello world'
    s.isdigit() # 숫자로 이뤄지지 않아서 False로 반환
    s = '10'
    s.isdigit() # 숫자로 이뤄져 있기 때문에 True 반환
    s = 'hello world'
    s.isdigit() # 숫자로 이뤄지지 않아서 False로 반환
    s = '10'
    s.isdigit() # 숫자로 이뤄져 있기 때문에 True 반환
  • join: 하나의 문자열로 합칩니다.
    a = 'hello'
    b = 'world'
    '-'.join([a, b]) # 앞에 있는 문자로 문자열들을 연결합니다. hello-world 출력.
    a = 'hello'
    b = 'world'
    '-'.join([a, b]) # 앞에 있는 문자로 문자열들을 연결합니다. hello-world 출력.
    join에 들어가는 값은 1개여야 합니다. 여러 개의 값을 사용하기 위해서는 대괄호([])로 값을 묶으면 됩니다. 이렇게 대괄호로 묶은 자료형을 리스트라고 합니다.
  • lower: 소문자로 만듭니다.
    s = 'Hello World'
    s.lower() # hello world
    s = 'Hello World'
    s.lower() # hello world
  • upper: 대문자로 만듭니다.
    s = 'Hello World'
    s.upper() # HELLO WORLD
    s = 'Hello World'
    s.upper() # HELLO WORLD
  • split: 원하는 단위로 쪼갭니다.
    s = 'hello world'
    s.split(' ') # ['hello', 'world']
    s = '064-000-0000'
    s.split('-') # ['064', '000', '0000']
    s = 'hello world'
    s.split(' ') # ['hello', 'world']
    s = '064-000-0000'
    s.split('-') # ['064', '000', '0000']
  • replace: 원하는 문자열로 교체합니다.
    s = 'hello world'
    s.replace('hello', 'hi')
    s = 'hello world'
    s.replace('hello', 'hi')
  • strip: 앞뒤 공백을 제거합니다.
    s = '    hello world    '
    s.strip() # hello world
    s = '    hello world    '
    s.strip() # hello world

3.2 문제풀이

이번 프로젝트는 world를 전혀 움직이지 않는 문제입니다. 문제에서 우선 공지문에서 ‘팀장’과 ‘팀 리더’를 각각 ‘최고 운영 책임자’와 ‘최고 기술 책임자’로 만들도록 하겠습니다. 이번 코드는 월드를 움직이지 않기 때문에 mission_start()가 없어도 됩니다.

공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
print(공지문.replace('팀장', '최고 운영 책임자'))
print(공지문)
공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
print(공지문.replace('팀장', '최고 운영 책임자'))
print(공지문)

위와 같이 공지문에서 replace 메서드를 사용하게 되면 출력 결과는 팀장이 최고 운영 책임자로 변경이 되지만 공지문은 변경이 되지 않습니다. 그렇기 때문에 아래와 같이 다시 한번 더 공지문에 넣는 작업이 필요합니다.

공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
공지문 = 공지문.replace('팀장', '최고 운영 책임자')
print(공지문)
공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
공지문 = 공지문.replace('팀장', '최고 운영 책임자')
print(공지문)

이 작업을 반복합니다.

공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
공지문 = 공지문.replace('팀장', '최고 운영 책임자')
공지문 = 공지문.replace('팀 리더', '최고 기술 책임자')
print(공지문)
공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
공지문 = 공지문.replace('팀장', '최고 운영 책임자')
공지문 = 공지문.replace('팀 리더', '최고 기술 책임자')
print(공지문)

앞에 대표 라이캣, 까지는 필요 없는 문자열이니 슬라이싱해서 없애고, 뒤에 - 대표 라이캣이 필요하니 아래처럼 활용합니다.

print(f'{공지문[8:]}로 임명합니다. - {공지문[:6]}')
print(f'{공지문[8:]}로 임명합니다. - {공지문[:6]}')

4. 정답 코드

공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
공지문 = 공지문.replace('팀장', '최고 운영 책임자')
공지문 = 공지문.replace('팀 리더', '최고 기술 책임자')
print(f'{공지문[8:]}로 임명합니다. - {공지문[:6]}')
공지문 = '대표 라이캣, 팀장 뮤라, 팀 리더 하티'
공지문 = 공지문.replace('팀장', '최고 운영 책임자')
공지문 = 공지문.replace('팀 리더', '최고 기술 책임자')
print(f'{공지문[8:]}로 임명합니다. - {공지문[:6]}')
2.4 지금까지 이런 맛은 없었다2.6 여기는 은행인가 생선가게인가