본문 바로가기

백준 write-up/정렬 & 그리디

[백준] A와 B : 12904번 - Python

728x90
반응형

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

 

12904번: A와 B

수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

(1) [Python] 리스트에서 마지막 원소 찾기

: my_list[-1]로 쓰면된다. 그 외에도 맨 뒤에서 n번째 원소를 찾아내려면 my_list[-n]을 쓰면 된다!!! 이런식으로 지정해서 원소들 변경도 가능.

# 마지막 원소 찾아내서 값 변경하기

my_list = [ 'one2ye', 'loves', '20s' ]
my_list[-1] = 'seonho'
print(my_list)

>>> ['one2ye', 'loves', 'seonho']


# 마지막 원소를 제거하기

my_list = [ 'one2ye', 'loves', '20s' ]
del my_list[-1]
print(my_list)

>>> ['one2ye', 'loves']

 

(2) [Python] 문자열 및 리스트 뒤집기(거꾸로 출력)

- reverse, reversed() 활용하기: 단, reverse는 리스트에서만 사용 가능함!

### reverse 활용 ###

s = 'abcd'
s = list(s)
s.reverse()

print(''.join(s))	# 리스트를 연결해서 출력

>>> dcba


### reversed 활용 ###

s = 'abcd'
s = reversed(s)

print(''.join(s))	# print(''.join(reversed(s)) 로 한번에 연결해서 사용 가능

>>> dcba

- 인덱스 슬라이싱을 활용하기

s = 'abcd'
print(s[::-1])

>>> dcba
### 만약 3번 인덱스부터 1번 인덱스까지 역순으로 출력해준다면 ###

s = 'abcd'
print(s[3:0:-1])

>>> dcb

 

 

 

문제의 접근 방법

 

문제에서 제시해 준 조건을 반대로 바꿔서 생각해보기!

 

 

 

 

내가 막혔던 부분

 

S값을 기준으로 추가해서 늘려갈 생각만 하다보니까 시간초과가 나오고 과정이 너무 복잡해져서 한참을 헤맸다. 문자열을 작은 범위에서 큰 범위로 늘려야할 때는 주어진 조건을 역으로 적용해봐야 한다는 것을 깨달았다!

 

 

 

문제 풀이 방법

 

(1) 문자열 S, T 입력받아 리스트 형태로 저장하기

(2) S와 T의 길이가 같을 때까지 반복하는 while문을 돌려서 T를 기준으로 마지막 요소 판별하기

(3) 만약 리스트 T의 마지막 요소가 A라면 제거하기

(4) 만약 리스트 T의 마지막 요소가 B라면 제거하고 뒤집기

(5) (2)~(4) 과정을 반복적으로 거쳐서 나온 결과 S와 T가 같다면 1 출력, 다르다면 0 출력하기!

 

 

 

소스코드

S = list(input())
T = list(input())

while True: # True 대신 밑에 조건문을 바로 써서 break문 없이 쓸 수도 있음.
    if len(S) != len(T):
        if T[-1] == 'A':
            T.pop()
        else:
            T.pop()
            T.reverse() # T[::-1]로도 쓸 수 있음.
    else:
        break

if S == T:
    print('1')
else:
    print('0')
# print(1 if S == T else 0)으로 간단하게 쓸 수도 있음.
728x90
반응형