여니의 취준 준비/코딩테스트 (Python)

[n17413] 단어 뒤집기 2 (in python)

여니's 2021. 5. 25. 12:30

[2022.02.28 다시 품]

s=input()
button=False
answer='' # 최종값
temp='' # 뒤집어야하는 단어
for i in range(len(s)):
    if s[i]=="<": # <를 만나면
        if len(temp)!=0: # 만약 temp에 뒤집어야하는 단어가 있었다면?
            answer+=temp[::-1] # answer에 Temp를 뒤집어서 넣어준다.
            temp='' # temp값은 초기화
        button=True # 만약 Temp가 비어있다면?
        answer+='<' # 태그가 시작된다는 거! 근데 태그는 뒤집기 할 필요 없으므로 그냥 추가해줌
        continue
    if button: # 만약 지금 해당 위치가 태그에 해당한다면?
        if s[i]==">": # >를 만나면?
            button=False # 태그를 나타내는 값을 Off 시켜줌
            answer+='>' # > 추가
            continue
        answer+=s[i] # >를 아직 못 만난 경우엔 태그 속 단어이므로 그대로 추가해줌
        continue 
    if s[i]!=' ': # 만약 태그에 해당하지 않고 현재 공백이 아닌 경우라면?
        temp+=s[i] # 뒤집어야할 단어에 속하므로 Temp에 넣는다.
    else:
        answer+=temp[::-1] # 공백을 만나기 전 단어를 뒤집어서 넣어줄 차례
        answer+=' ' # 현재 위치에 있는 공백도 넣어줘야함
        temp='' # Temp는 초기화
    if i == len(s) - 1 and len(temp)!=0: # 만약 문자열의 끝에 다다르고 뒤집어야할 단어가 존재한다면?
        answer+=temp[::-1] # 뒤집어서 추가해줌
print(answer)

 

 

 

 

2021.08.26

'''

알파벳 소문자, 공백, 숫자, 특수문자
태그
    길이가 3이상인 부분 문자열
    < > 사이에 소문자, 공백만 가능
단어
    소문자, 숫자
연속하는 두 단어
    공백으로 구분
태그와 단어
    사이에 공백이 없음

단어만 뒤집는다.

'''
sentence = input()
state = True
answer = ''
word = ''

for i in range(len(sentence)):
    if sentence[i] == '<': # <일 경우
        if word != '': # 만약 단어일경우
            answer += word[::-1]
            answer += '<'
            state = False
            word = ''
            continue
        state = False
        answer += '<'
        continue

    if sentence[i] == '>': # >일 경우
        state = True
        answer += word[::-1] 
        answer += '>'
        word = ''
        continue

    if sentence[i] == ' ': # 공백일 경우
        answer += word[::-1]
        answer += sentence[i]
        word = ''
        continue

    if not state:  # 태그
        answer += sentence[i]

    else:  # 단어
        if i == len(sentence) - 1:
            word += sentence[i]
            answer += word[::-1]
            break
        word += sentence[i]

print(answer)
string = input().replace('>', '<').split('<')
# replace("찾을 값","바꿀 값",바꿀횟수)

result = ""
for i in range(len(string)):
    if i % 2 == 1:  # 소괄호 안에 있는 단어는 항상 2의 배수가 아님!
        result += '<' + string[i] + ">"
    else:
        temp = string[i].split()
        result += ' '.join([word[::-1] for word in temp])
print(result)​

> 좋은 방법인 것 같아서 스크랩..

replace를 통해 <를 >로 바꿔주고. split('<')을 해준다.

그러면 소괄호는 사라지고

소괄호가 있던 자리를 기준으로 문자열을 나눌 수 있다.

 

우리가 뒤집어야 하는 단어의 인덱스는 항상 2의 배수!

 

<open>tag<close>
['', 'open', 'tag', 'close', '']

 

소괄호가 있던 자리는 ''로 대체되었다!

 

그래서 만약 인덱스가 2의 배수가 아닌 경우는

소괄호 안에 있던 단어에 속하므로

뒤집어서는 안된다!

 

뒤집는 과정은 [::-1]을 통해서 역순으로 출력이 가능하다.

 '구분자'.join(리스트)

join을 이용해서 문자열을 합치기

 

# [::-1] > 전체 문자열 역순으로 출력
# [4::-1] > 4번 인덱스부터 0번 인덱스까지 역순으로 출력

 

import sys

ex_word = ''
answer = ''
state = False

word = list(sys.stdin.readline().strip())

for i in word:
    if state == False:
        if i == "<":
            state = True
            ex_word += i

        elif i == " ":
            ex_word += i
            answer += ex_word
            ex_word = ''
        else:
            ex_word = i+ex_word
    else:
        ex_word += i
        if i == '>':
            state = False
            answer += ex_word
            ex_word = ''

print(answer+ex_word)

 

아래 코드는 처음에 생각했던 코드

enumerate로 해서 하려고 했는데

뭔가 더 비효율적인 방식인 듯 해서 

더 좋은 방법으로 알아왔따!

# if word.count("<") == 0:  # 꺽새가 없을 경우
#     array = word.split()
#     print(array)
#     for i in range(len(array)):
#         print(array[i], end=' ')
#
# else:  # 꺽새가 하나라도 있는 경우 ㅎ
#     i = 0
#     array = []
#     while i<len(word):
#         if word[i]=="<":
#             i+=1while

# idx_array1 = [i for i, key in enumerate(word) if key == "<"]
# idx_array2 = [i for i, key in enumerate(word) if key == ">"]
# print(idx_array1, idx_array2)

 

'여니의 취준 준비 > 코딩테스트 (Python)' 카테고리의 다른 글

[n16926] 배열 돌리기 (python)  (0) 2021.05.26
[n2615] 오목 (in python)  (0) 2021.05.26
[n20436] ZOAC 3 in python  (0) 2021.05.21
[n20291] 파일 정리  (0) 2021.05.21
[n10994] 별 찍기 - 19  (0) 2021.05.21