백준 15649. N과 M (1)로 알아보는 .join()

파이썬 map 함수의 특징

백준 15649. N과 M (1)
https://www.acmicpc.net/problem/15649

순열 문제를 보고, dfs 복습을 다시 하고 dfs로 순열을 풀어야 겠다고 생각했다. 그런데 python 의 itertools로 한번도 permutation을 생성해보지 않은 것을 깨달았고, 이번 기회에 from itertools import permuation을 사용해서 문제를 풀어봤다.

최종 작성 코드

from itertools import permutations

n, r = map(int, input().split())

arr = []
for i in range(1, n+1):
    arr.append(str(i))

permu_list = list(map(' '.join, permutations(arr, r)))

for i in permu_list:
    print(i)

첫번째 시도

print(permutations(arr, r))

# <itertools.permutations object at 0x0000015407FBB400>

을 했고 결과는 다음과 같았다. map 함수를 그냥 출력하려고 했을 때와 비슷한 현상인것 같아, map으로 형태를 변환해주려 했다.

두번째 시도

print(list(map(int, permutations(arr, r))))

#TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'

permutation 함수 안의 값이 어떤 식으로 전해지는지를 몰랐만, tuple형식으로 나타난다는 것을 오류를 통해 알 수 있었다.

여기서 나는 예전에도 비슷한 문제가 나왔지만, join이 하는 일을 정확히 이해하지 못한채로 문제를 풀었었기 때문에, 다시join을 활용해야 할 때 하지 못하고 있다는 것을 깨달았다.

구분자.join(array)는 배열을 문자열로 바꿀 때 쓸 수 있으며, .앞의 구분자를 어떻게 지정하는가에 따라 출력값의 형태가 달라진다.

arr = ['a', 'b', 'c']
print(''.join(arr)) #abc
print(' '.join(arr)) #a b c

print('\n'.join(arr))
#a
#b
#c

그렇다면 join 해줄 arr를 숫자로 만들면 어떻게 될까?

arr_1 = ['1', '2', '3']
arr_2 = [1, 2, 3]

print(''.join(arr_1)) #TypeError: sequence item 0: expected str instance, int found
print(''.join(arr_2)) #123

문자열을 찾아 그 사이사이를 .join()앞의 구분자로 구분해주는 역할을 하기 때문에, 에러가 난다.

그래서 내가 택한 방법은

n, r = map(int, input().split())

arr = []
for i in range(1, n+1):
    arr.append(str(i))

print(arr) # ['1', '2', '3']

이 방법을 통해 문자열로 값을 넘겨주는 것이었다.

permu_list = list(map(' '.join, permutations(arr, r)))

이제는 join뒤의 값이 str인 원소들로 이루어진 arr이기 때문에, 에러가 발생하지 않는다.

같은 문제를 dfs를 활용해서도 풀어봐야겠다.

좋은 웹페이지 즐겨찾기