lincolnbro1950   2년 전

(python 3)

문제 풀고 더 좋은 코드를 찾아보려고 숏코드(아래 첨부)를 뒤져봤는데,

그대로 복사해 붙여 넣어도 제 파이썬 프로젝트에선 아무 일도 일어나지 않았습니다.

혹시 어떤 코드인지 해설해주실 수 있나요?

ai4youej   2년 전

먼저 코드를 다음과 같이 쓸 수 있습니다.

n = int(input())
L = [input() for _ in range(n)]
count = 0

for 단어 in L:
    단어를 먼저 등장한 순으로 정렬해서 얻은 단어와 원래 단어가 같으면:
        count += 1
print(count)

여기서 원래 단어와, 정렬한 단어를 리스트로 바꾸어봅시다. 먼저 원래 단어를 리스트로 바꾸겠습니다.

이를 리스트로 표현하면 매우 구현이 간단한데, [*단어]와 같이 쓸 수 있습니다. (* 에는 여러 특별한 기능들이 있기 때문이죠!)

예시로, [* 'baekjoon'] == ['b', 'a', 'e', 'k', 'j', 'o', 'o', 'n']이 됩니다.

이제 단어를 어떻게 정렬할 지가 문제입니다. x.find로 정렬하면, x에서 먼저 등장하는 알파벳이 우선 순위가 높도록 정렬됩니다.

즉, x = 'bbadcd'라 두면 sorted(x, key = x.find) == ['b', 'b', 'a', 'd', 'd', 'c]가 됩니다

그러면 아래 코드와 같이 변형됩니다.

n = int(input())
L = [input() for _ in range(n)]
count = 0

for 단어 in L:
    if [*단어] == sorted(단어, key = 단어.find):
        count += 1
print(count)

근데 파이썬에서는, True은 정수형으로 1을, False는 정수형으로 0을 리턴합니다. 따라서 아래와 같은 코드로 바꿔도 됩니다. 작성의 편리를 위해 이제부터 '단어'를 x라 쓰겠습니다.

n = int(input())
L = [input() for _ in range(n)]
count = 0

for x in L:
    count += ([*x] == sorted(x, key = x.find)
print(count)

여기서 for문과, 2번째 줄의 L을 합쳐서, 한번에 답 count가 나오게 할 수 있을까요?

새로운 리스트 M을 생각해봅시다. 그리고 [*x] == sorted(x, x.find)를 만족하면 그 단어의 인덱스에 True을, 아니라면 False을 저장합시다.

그렇다면 M은 아래와 같이 쓸 수 있습니다.

n = int(input())
L = [input() for _ in range(n)]

M = [None] * n
for i in range(n):
    x = L[i]
    M[i] = ([*x] == sorted(x, key = x.find))

여기서 잘 생각해보면, sum(M) == count가 된다는 것을 알 수 있습니다.

그렇다면 애초에, 입력을 받을 때 부터 M과 같은 형식으로 나타낼 수 있을까요? 가능합니다!

그러기 위해서는 open(0)을 시행한다면 어떻게 채점기에서 작동하는지 알아보겠습니다.

만약 채점 파일이

3
happy
new
year

라면, open(0)은 ['3', 'happy', 'new', year']을 가져옵니다. 우리는 이 리스트를 L이라고 생각할 수 있습니다!

그렇다면 위의 코드를, list comprehension을 이용해서 아래와 같이 쓸 수 있지 않을까요?

# L = open(0)
M = [[*x] == sorted(x, key = x.find) for x in open(0)]

아까 위에서 sum(M) == count라고 했지만, 여기에서는 open(0)에 '3'이 포함되어있다는 사실을 알아야합니다. '3'  또한 True을 리턴하기 때문에, 우리가 구해야하는 값은 sum(M) - 1입니다.

즉, 답은 아래와 같은 꼴이 될 것입니다.

print(sum([[*x] == sorted(x, key = x.find) for x in open(0)]) - 1)

여기서 바깥쪽의 대괄호를 빼도 작동하는데 문제가 없으므로 (자세한 원리는 저도 잘 모르겠습니다.) 아래와 같이 쓸 수 있습니다.

print(sum([*x] == sorted(x, key = x.find) for x in open(0)) - 1)

이제 숏코딩을 위해 공백을 전부 지우면, 완성입니다!

lincolnbro1950   2년 전

와 ㅋㅋ 혼자서 알아봤으면 절대 몰랐겠네요

상세한 답변 감사드립니다!!

댓글을 작성하려면 로그인해야 합니다.