알고리즘/백준
[python] 백준 8892번 팰린드롬
펄찌
2022. 3. 10. 20:09
문제 풀이
내가 생각한 방법은 itertools라이브러리의 permutations(순열) 함수를 이용하는 것이었다.
permutations에 대한 자세한 설명은 밑에 있다.
간단히 요약하자면 aaba, ba, ababa, bbaa, baaba 총 5개의 단어가 입력으로 들어왔을 때
1. 5개의 단어 중에서 2개 단어를 합친다.
2. 합친 단어들 중에 *팰린드롬 단어를 찾는다.
*팰린드롬 - 어느 방향으로 읽어도 항상 같음. ex) 소주만 병만 주소, madam
1, 2 과정을 통해 결과값을 반환해주면 된다.
출력 조건은 가능한 팰린드롬이 여러 가지라면 그중 아무거나 출력, 팰린드롬이 없다면 0을 출력
1번 과정에서 permutations를 써서 5개의 단어 중 2개 단어를 합쳐주고
2번 과정에서 팰린드롬인지를 판별하여 set()에 값을 넣어준다. set()을 쓴 이유는 팰린드롬이 중복될 수도 있어서 set()으로 걸러주었다.
처음 짰던 코드다.
import sys
from itertools import permutations
test_case = int(input())
for _ in range(test_case):
word_num = int(input())
words = []
word_set = set()
for _ in range(word_num):
words.append(sys.stdin.readline().rstrip())
for val in permutations(words, 2):
rs = ''.join(val)
if rs[:] == rs[::-1]: word_set.add(rs)
print(''.join(word_set)) if word_set else print(0)
예제에 있던대로 팰린드롬이 한 개라면 예제 출력과 같이 한 개만 나오겠지만 팰린드롬이 여러 가지라면 그중 하나만 출력해야 되는 걸 생각하지 못해서 삽질을 꽤 많이 했다.
아래에 출력 조건을 생각한 완성된 코드와 주석을 달아놓았으니 차근차근 해보시면 될 것 같다.
완성된 코드!!👍😊
import sys
from itertools import permutations
# 테스트 케이스 개수
test_case = int(input())
for _ in range(test_case):
# 단어의 수 k
word_num = int(input())
# k개의 단어를 담는 배열 words
words = []
# 만들어진 팰린드롬수 중 중복된 값이 있으면 제거를 위해 set() 사용
word_set = set()
rs_list = []
for _ in range(word_num):
words.append(sys.stdin.readline().rstrip())
# 순열을 뽑기 위해 이용하는 permutations 자기 자신을 제외한 순열이 만들어짐
# 5개중 2개, 5x4 = 20가지의 순열이 만들어짐
for val in permutations(words, 2):
rs = ''.join(val)
# 혹시 모를 중복값에 대비해 set()으로 걸러줌
# 팰린드롬인지 아닌지는 해당 단어와 거꾸로 읽었을 때의 단어가 같으면 된다.
if rs[:] == rs[::-1]: word_set.add(rs)
# 출력시 여러가지 팰린드롬수가 있다면 그 중 아무거나 출력하고 팰린드롬수가 없다면 0을 출력
print(word_set.pop()) if word_set else print(0)