단순 구현 문제였다!
하지만 파이썬의 복사와 관련해서 배운 것이 많이 있어서 블로그를 작성하러 왔습니당!
처음에는 set
으로 만들어서 비슷한 단어에 속하는지 확인하려고 했었지만
두 개의 단어가 같은 종류의 문자로 이루어져 있음
같은 문자는 같은 개수 만큼 있음
위 두 조건을 고려해줘야 했기 때문에 문자열 리스트를 하나하나 비교하며 확인했다.
N-1
개의 단어가 입력될 때마다 비교의 대상이 되는 문자열 target
을 복사한다.
이 때 처음에는 cmp = target
을 그대로 사용해 줬다가 원하는대로 실행되지 않았었다.
cmp = target[:]
위 코드는 target
리스트의 얕은 복사본을 만들어 cmp
에 할당한다.
[:]
로 리스트의 전체 범위를 슬라이싱해 저장하며, 이 결과값으로 target
의 모든 요소를 포함하는 새로운 리스트 객체가 생성된다.
즉 생성된 새로운 리스트 객체가 cmp
에 할당된다.
이후에 cmp
리스트를 수정하더라도 원본 target
리스트에는 영향을 주지 않는다. 즉, cmp
와 target
은 서로 독립적인 메모리 위치에 존재하는 별개의 객체가 된다.
cmp = target
위 코드는 target
객체에 대한 참조를 cmp
에 할당한다.
즉, cmp
와 target
은 메모리상에서 같은 객체를 가리키게 된다.
따라서 cmp
리스트를 수정하면, 이 변경사항이 target
에도 반영된다.
N-1개의 word
가 입력될 때마다 위의 얕은 복사 방식으로 이루어진 cmp
에 target
의 문자열이 저장된다. 입력받은 word
를 한 문자씩 순회하며 cmp에 포함되어 있는지 확인한 뒤, 있을 경우 remove
없을 경우 cnt
를 갱신한다.
word
순회를 마치면 cnt
변수에는 target
에 포함되어 있지 않은 word
의 문자 개수가 남아있게 되고, cmp
에는 word
에 포함되지 않은 문자가 남아있게 된다.
이 cnt
와 cmp
의 길이가 1 이하인 경우 조건을 만족하기에 ans의 값을 +1 해준다.
import sys
input = sys.stdin.readline
N = int(input().rstrip())
target = list(input().rstrip())
ans = 0
for _ in range(N-1):
cmp = target[:]
word = input().rstrip()
cnt = 0
for w in word:
if w in cmp:
cmp.remove(w)
else:
cnt += 1
if cnt < 2 and len(cmp) < 2:
ans += 1
print(ans)