Baekjoon/IM Level

[백준] 17413 단어 뒤집기2 (실버3) / 스택, isalnum(), join(), split() 함수

hellosonic 2023. 3. 23. 14:01

문제요약

나의 코드 및 설명

  • 역순으로 출력하는 경우는 두 가지 경우이다. 
    1. <> 밖의 띄어쓰기를 만날 경우
    2. <를 만날 경우
  • 그대로 출력하는 경우는 한 가지 경우이다.
    1. >를 만날 경우
  • <> 밖의 띄어쓰기와 <> 안의 띄어쓰기를 따로 구분해주어야 하는데 check 변수를 통해 구분해주었다.
string = list(input())
string += " "
ans = []

#<>안의 띄어쓰기인지 체크하기 위함
#-1 : <> 밖의 띄어쓰기, 1 : <> 안의 띄어쓰기
check = -1

for i in range(len(string)):
    #띄어쓰기를 만나면
    if string[i] == " ":
        #만약 <>안의 띄어쓰기가 아니면
        if check == -1:
            #ans안의 요소들을 역순으로 출력
            while ans:
                print(ans.pop(),end="")
            #현재 글자(string[i]:띄어쓰기)는 출력이 안되었으므로
            #따로출력
            print(" ",end="")
        #만약 <>안의 띄어쓰기라면
        else:
            #그냥 ans에 현재 글자(띄어쓰기)를 저장
            ans.append(string[i])
    #만약 < 를 만나면
    elif string[i] == "<":
        #우선 이제 만나는 띄어쓰기는 그냥 단순 ans에 저장
        check = 1
        #< 는 여태까지 저장된 ans를 역순으로 출력해주는 역할도 함
        while ans:
            print(ans.pop(),end="")
        #ans를 다 비우고 ans에 다시 < 를 저장
        ans.append(string[i])
    #만약 > 를 만나면
    elif string[i] == ">":
        #현재 저장된 ans를 출력
        for j in range(len(ans)):
            print(ans[j],end="")
        #ans를 다 출력했으니 초기화
        ans.clear()
        #현재 글자 (>)는 저장이 안되어있으므로 따로 출력
        print(string[i],end="")
        #<>를 탈출 했으므로 -1 저장(이제부터 만나는 띄어쓰기는 역순으로 출력하는 역할)
        check = -1
    #띄어쓰기, <, >를 제외한 글자를 만나면 단순 ans에 저장을한다
    else:
        ans.append(string[i])
print()

다른 코드 및 설명 01 - isalnum()

  • 입력한 문자열 s의 길이만큼 반복이 수행된다.
  • 만약 문자가 "<"이라면, 다음 인덱스로 이동하기 위해 i+1을 수행하고, ">"을 만나기 전까지 i+1을 수행한다.
    ">"를 만나서 while문을 탈출하게 된다면, i+1을 한번 더 수행하여, 다음 인덱스부터 체크한다. 
  • 만약 문자가 숫자나 알파벳이라면,(s[i].isalnum()) 시작점을 현재 인덱스인 i로 설정하고, 전체 문자열의 길이를 초과하지 않고, 문자가 숫자나 알파벳인 범위동안 i+1을 수행한다. 
    전체 문자열의 길이를 초과하거나, 문자가 숫자나 알파벳이 아닌 다른 문자를 만난다면, 저장된 start 인덱스부터, 현재 인덱스까지의 값들을 temp에 저장하고, reverse()함수를 통해 리스트를 역순으로 뒤집는다. 뒤집고 나서, 다시 문자열 s를 뒤집은 문자열로 재정의한다.
  • 만약 공백을 만난다면 인덱스만 증가시키고(i+=1) 그냥 통과한다.
s = list(input())

i = 0
start = 0
while i < len(s):
    if s[i] == "<":
        i+=1
        while s[i] != ">":
            i+=1
        i+=1
    elif s[i].isalnum():
        start = i
        while i < len(s) and s[i].isalnum():
            i+=1
        temp = s[start:i]
        temp.reverse()
        s[start:i] = temp
    else:
        i+=1

for j in range(len(s)):
    print(s[j],end="")
    if j == len(s)-1:
        print()

다른 코드 및 설명 01 - 스택 활용

  • 자료구조-스택을 활용한 문제풀이 방법이다.
import sys

string = sys.stdin.readline().rstrip()
tag = False
ans = ""
stack = ""
for s in string:
    if s == "<":
        #원래대로 출력
        tag = True
        ans += stack[::-1]
        stack = ""
        ans += s
        continue
    elif s == ">":
        tag = False
        ans += s
        continue
    elif s == " ":
        ans += stack[::-1] + " "
        stack = ""
        continue

    if tag:
        ans += s
    else:
        stack += s
print(ans + stack[::-1])

문자열 합치기 : "구분자".join(리스트)

  • 아래의 두 코드는 문자열을 출력할 때, join()함수를 통해 간단히 코드를 작성하고 똑같은 결과를 출력하는 코드이다.
s = list(input())
>> baekjoon online judge


for j in range(len(s)):
    print(s[j],end="")
    if j == len(s)-1:
        print()
>> noojkeab enilno egduj

print("".join(s))
>> noojkeab enilno egduj

문자열 나누기 : 문자열.split(구분자)

  • 참고로, 문자열을 나누는 코드는 다음과 같다.
    split() 함수 안의 파라미터에 구분자를 주면, 구분자를 기준으로 문자열을 잘라 리스트 형식으로 반환한다.
    만약 파라미터에 아무것도 주지 않으면, 공백을 기준으로 문자열을 자른다.
    (ex. input().split() : 공백을 기준으로 입력값을 받겠다.)
str = "Hi my name is mino"
splited_str = str.split()
print(splited_str)

>>['Hi', 'my', 'name', 'is', 'mino']

isalpha() : 문자열이 알파벳으로만 이루어져 있는지 확인하는 함수

print( 'ab'.isalha() )
>> True

isalnum() : 문자열이 알파벳+숫자로만 이루어져 있는지 확인하는 함수

print( 'ab123'.isalnum() )
>> False

isdigit() : 문자열이 숫자처럼 생긴 문자로 이루어져 있는지 확인하는 함수

  • isnumeric()과 비교해봤을 때, '½'은 False를 출력하는 차이가 있다.
    거듭제곱은 숫자로 치고, 분수형태, 음수, float 형태는 False로 출력한다.
number = ['123', '-1', '0.5', '½', '3²', '50%']

for i in number:
    print(i, i.isdigit())
> 123 True
  -1  False
  0.5 False
  ½   False
  3²  True
  50% False

isnumeric() : 문자열이 숫자처럼 생긴 문자로 이루어져 있는지 확인하는 함수

  • 최근에 알게된 방법으로 number이 숫자값이니? 라고 묻는 것. 
    isnumeric() 함수는 숫자값 표현에 해당하는 문자열까지 True로 반환한다.
    (제곱근, 분수, 거듭제곱 형태의 특수문자 → True)
number = ['123', '-1', '0.5', '½', '3²', '50%']

for i in number:
    print(i, i.isnumeric())
> 123 True
  -1  False
  0.5 False
  ½   True
  3²  True
  50% False