[Algorithm] 2607. 비슷한 단어

유지민·2024년 2월 4일
0

Algorithm

목록 보기
23/75
post-thumbnail

2607. 비슷한 단어

2607 문제 보기

접근 방식

단순 구현 문제였다!
하지만 파이썬의 복사와 관련해서 배운 것이 많이 있어서 블로그를 작성하러 왔습니당!

처음에는 set으로 만들어서 비슷한 단어에 속하는지 확인하려고 했었지만

두 개의 단어가 같은 종류의 문자로 이루어져 있음
같은 문자는 같은 개수 만큼 있음

위 두 조건을 고려해줘야 했기 때문에 문자열 리스트를 하나하나 비교하며 확인했다.
N-1개의 단어가 입력될 때마다 비교의 대상이 되는 문자열 target을 복사한다.
이 때 처음에는 cmp = target을 그대로 사용해 줬다가 원하는대로 실행되지 않았었다.


python의 복사 방식

cmp = target[:]

위 코드는 target 리스트의 얕은 복사본을 만들어 cmp에 할당한다.
[:]로 리스트의 전체 범위를 슬라이싱해 저장하며, 이 결과값으로 target의 모든 요소를 포함하는 새로운 리스트 객체가 생성된다.
즉 생성된 새로운 리스트 객체가 cmp에 할당된다.
이후에 cmp 리스트를 수정하더라도 원본 target 리스트에는 영향을 주지 않는다. 즉, cmptarget은 서로 독립적인 메모리 위치에 존재하는 별개의 객체가 된다.

cmp = target

위 코드는 target 객체에 대한 참조를 cmp에 할당한다.
즉, cmptarget은 메모리상에서 같은 객체를 가리키게 된다.
따라서 cmp 리스트를 수정하면, 이 변경사항이 target에도 반영된다.


N-1개의 word가 입력될 때마다 위의 얕은 복사 방식으로 이루어진 cmptarget의 문자열이 저장된다. 입력받은 word를 한 문자씩 순회하며 cmp에 포함되어 있는지 확인한 뒤, 있을 경우 remove 없을 경우 cnt를 갱신한다.

word 순회를 마치면 cnt 변수에는 target에 포함되어 있지 않은 word의 문자 개수가 남아있게 되고, cmp에는 word에 포함되지 않은 문자가 남아있게 된다.
cntcmp의 길이가 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)

배운점

▶️ 문자열 치환 관련 메소드가 정리된 URL
▶️ 집합(set)의 차집합 연산

profile
끊임없이 도전하며 사고하는 주니어 Web 개발자 유지민입니다.

0개의 댓글