ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 17413번 파이썬
    알고리즘 자료구조 2021. 9. 17. 01:51
    728x90

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

     

    17413번: 단어 뒤집기 2

    문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

    www.acmicpc.net

    [<]여기부터 [>] 여기까지는 그대로 두고 다른텍스트들은 다 뒤집으면되는데

    내가 멍청한건지 처음에 봤을때 어떻게 구현하지?? 이생각만 20분정도 했던거같음

     

    3개의 함수를 만들었음 

    S(input)를 배열에 담아서 리턴해주는 함수와

    텍스트를 거꾸로 뒤집어주는함수

    그리고 <  이게 들어있으면

    그대로 냅두고 그렇지않으면 뒤집어주는 함수

     

    Reverse_string

    def Reverse_string(msg):
            sum = "" #뒤집은거 담아줄 변수
            text = list(msg.split(' ')) #띄어쓰기 기준으로 나눠줌
            count = 0 #띄어쓰기 몇번 해야하는지 세는거
            space = len(text) - 1 # 만약에 띄어쓰기가 4개면 len(list) 하면 5 출력되니까 -1
            for i in text: 
                count = count + 1
                for j in reversed(range(len(i))): #거꾸로 뒤집어야하니까 마지막 인덱스부터 셈
                    sum += i[j] #마지막 인덱스에서 첫번쨰 인덱스까지 sum에 담아줌
                if count <= space: 
                    sum = sum + " " #뒤집어서 그대로 리턴해야해서 띄어쓰기까지 해줌
    
            return sum

    솔직히 직접 안짜고 파이썬에 뒤집어주는 함수가 있어서 그거 써도 상관없음

     

    Split_Text

    def Split_Text(text):
        arr = []
        op_state = False # 
        opsum = "" #태그인 텍스트 담을거
        resum = "" #그냥 텍스트 담을거
        for i in text:
            if i == "<": #<이게 나오면  > 이게 나올때까지 opsum에 넣어야하니까 op_state를 True로 만들어줌
                opsum = opsum + i #자기자신 넣어주고
                arr.append(resum) #태그가아닌 텍스트들을 배열에 넣어줌 
                resum = "" #초기화해주는데 안하면 전에있던 값 + 새로들어온 값 같이박힘
                op_state = True #true로 만들어주고
                continue 
            elif i == ">": #>이게나오면 태그인 텍스트들은 opsum에 있을거니까
                opsum = opsum + i
                arr.append(opsum) #배열에 넣어주고
                opsum = "" #여기서 초기화
                op_state = False #이것도
                continue
            if op_state: #True면 > 이게 나올때까지 opsum에 넣어줌
                opsum = opsum + i
            else: # false면 그냥 텍스트니까 resum에 넣어줌
                resum = resum + i
        arr.append(resum) #남은것들도 넣어줌
        return arr

    주석 진짜 이상하게 달았네요

    그냥 [<] 이게 나오면 [>]이게 나올때까지 opsum에 넣어주고

    닫는 태그가 나오면 opsum을 arr에 담아주는거에요

    Return 값

    <int><max>2147483647<long long><max>9223372036854775807 이걸

    ['', '<int>', '', '<max>', '2147483647', '<long long>', '', '<max>', '9223372036854775807']

     

     

    reverced_return

     

     

    def reverced_return(arr):
            
        sum = ""
        for i in range(len(arr)): 
            if arr[i].find("<") > -1: # < 이게 존재하는지 안하는지 확인
                sum = sum + arr[i] #없으면 그냥 그대로 sum에 넣어줌
                continue
            else: #없으면 뒤집어야 할 텍스트니까
                sum = sum + Reverse_string(arr[i]) #뒤집어서 넣어줌
    
        return sum

    ['', '<int>', '', '<max>', '2147483647', '<long long>', '', '<max>', '9223372036854775807'] 여기서

    뒤집어야 할 텍스트는 뒤집고 아니면 냅둠

    제대로됨

     

    제출한 코드

    def Reverse_string(msg):
            sum = ""
            text = list(msg.split(' '))
            count = 0
            space = len(text) - 1
            for i in text:
                count = count + 1
                for j in reversed(range(len(i))):
                    sum += i[j]
                if count <= space: 
                    sum = sum + " "
    
            return sum
    
    def splittext(text):
        arr = []
        op_state = False
        opsum = ""
        resum = ""
        for i in text:
            if i == "<":
                opsum = opsum + i
                arr.append(resum)
                resum = ""
                op_state = True
                continue
            elif i == ">":
                opsum = opsum + i
                arr.append(opsum)
                opsum = ""
                op_state = False
                continue
            if op_state:
                opsum = opsum + i
            else:
                resum = resum + i
        arr.append(resum)
        for i in arr:
            if i == "":
                arr.remove("")
        return arr
    def reverced_return(arr):
            
        sum = ""
        for i in range(len(arr)):
            if arr[i].find("<") > -1:
                sum = sum + arr[i]
                continue
            else:
                sum = sum + Reverse_string(arr[i])
    
        return sum
    
    text = input()
    
    arr = splittext(text)
    
    print(reverced_return(arr))
    728x90

    '알고리즘 자료구조' 카테고리의 다른 글

    백준 5622번 다이얼 Python  (0) 2021.12.07
    백준 11399번  (0) 2021.12.05
    백준 1931번 회의실  (0) 2021.12.04
    백준 11047번 그리디 알고리즘  (0) 2021.12.04
    백준 4673번 셀프넘버 Python  (0) 2021.09.15
Designed by Tistory.