본문 바로가기

Univ/Python Programming

[문제 17] 두 문자열의 공통 문자 찾기 - Python 풀이

두 개의 문자열이 주어지면 두 문자열에 공통으로 포함된 문자를 찾아서 출력하는 프로그램을 작성한다. 각 문자열의 길이는 최대 100이다. 두 번째 문자열의 각 문자는 한 번만 사용할 수 있으며, 첫 번째 문자열을 순서대로 보면서 두 번째 문자열에서 아직 사용되지 않은 같은 문자가 있으면 결과에 포함한다.

입력 예시

첫째 줄에 첫 번째 문자열이 주어진다. 둘째 줄에 두 번째 문자열이 주어진다.

출력 예시

두 문자열의 공통 문자를 첫 번째 문자열의 순서를 기준으로 이어서 출력한다. 두 번째 문자열의 같은 위치 문자는 한 번만 사용할 수 있다.

예제 테스트케이스

예제 1

입력 예시
출력 예시
hello
world
lo

예제 2

입력 예시
출력 예시
apple
plane
aple

예제 3

입력 예시
출력 예시
mississippi
impossible
missip

정답 코드

s1 = input()
s2 = list(input())

result = []

for ch in s1:
    if ch in s2:
        result.append(ch)
        s2.remove(ch)

print("".join(result))

1. 코드 설명

이 코드는 첫 번째 문자열을 앞에서부터 한 글자씩 보면서, 그 문자가 두 번째 문자열에도 아직 남아 있으면 결과에 넣고, 두 번째 문자열에서는 그 문자를 한 번 사용한 것으로 처리하는 방식이다.
즉, 첫 번째 문자열의 순서를 기준으로 공통 문자를 찾되, 두 번째 문자열의 각 문자는 한 번만 사용할 수 있다는 조건을 그대로 구현한 코드이다.

먼저 첫 번째 문자열과 두 번째 문자열을 입력받는다.

s1 = input()
s2 = list(input())

여기서 중요한 점은 두 번째 문자열을 그냥 문자열이 아니라 list(input())로 리스트로 바꿨다는 점이다.
이 문제에서는 두 번째 문자열의 문자를 한 번 사용하면 없애야 하므로, 나중에 remove()를 쓰기 위해 리스트로 만들어 둔 것이다.
문자열은 수정할 수 없지만, 리스트는 원소를 지울 수 있다.

그다음 공통 문자를 차례대로 저장할 result 리스트를 만든다.

result = []

이제 첫 번째 문자열을 앞에서부터 한 글자씩 확인한다.

for ch in s1:

for문은 문자열의 문자를 앞에서부터 하나씩 꺼내 반복하는 문법이다.
즉 ch에는 첫 번째 문자열의 각 문자가 순서대로 들어간다.

현재 문자 ch가 두 번째 문자열에 아직 남아 있는지 확인하는 부분은 다음과 같다.

if ch in s2:

in은 어떤 값이 리스트 안에 포함되어 있는지 검사하는 표현이다.
여기서는 첫 번째 문자열의 현재 문자 ch가 두 번째 문자열 리스트 s2 안에 남아 있는지 확인한다.

만약 있으면 그 문자는 공통 문자이므로 결과에 넣는다.

result.append(ch)

append()는 리스트 맨 뒤에 값을 추가하는 메서드이다.
따라서 공통 문자를 발견할 때마다 result에 순서대로 쌓이게 된다.

그다음 바로 이 문자를 두 번째 문자열에서 제거한다.

s2.remove(ch)

remove()는 리스트에서 같은 값을 하나 찾아 지우는 메서드이다.
이 줄이 중요한 이유는 문제에서 두 번째 문자열의 각 문자는 한 번만 사용할 수 있다고 했기 때문이다.
즉 한 번 공통 문자로 사용한 문자는 다시 쓰면 안 되므로, 사용 즉시 지워야 한다.

예를 들어 첫 번째 문자열이 apple, 두 번째 문자열이 plane이라고 하자.

처음 상태는 다음과 같다.

s1 = "apple"
s2 = ['p', 'l', 'a', 'n', 'e']

이제 s1을 앞에서부터 보면,

  • a는 s2에 있으므로 결과에 넣고 s2에서 제거
  • p는 s2에 있으므로 결과에 넣고 제거
  • 다음 p는 이제 s2에 없으므로 넣지 않음
  • l은 있으므로 넣고 제거
  • e는 있으므로 넣고 제거

이 과정을 거치면 결과는 ['a', 'p', 'l', 'e']가 된다.

마지막에는 리스트에 모아 둔 문자들을 하나의 문자열로 이어서 출력한다.

print("".join(result))

"".join(result)는 리스트 안의 문자열들을 공백 없이 이어 붙이는 표현이다.
예를 들어 ['a', 'p', 'l', 'e']를 "aple"로 만들어 준다.

따라서 최종적으로 문제에서 요구한 형식대로 공통 문자를 이어 붙여 출력할 수 있다.


2. 실수하기 쉬운 부분

두 번째 문자열을 문자열 그대로 두는 경우

# 잘못된 코드
s1 = input()
s2 = input()

for ch in s1:
    if ch in s2:
        s2.remove(ch)

문자열에는 remove()를 사용할 수 없으므로, 두 번째 문자열은 리스트로 바꿔야 한다.

공통 문자를 찾고도 두 번째 문자열에서 지우지 않는 경우

# 잘못된 코드
s1 = input()
s2 = list(input())
result = []

for ch in s1:
    if ch in s2:
        result.append(ch)

print("".join(result))

이렇게 하면 두 번째 문자열의 같은 문자를 여러 번 다시 사용할 수 있어서 조건에 어긋난다.

remove()를 먼저 호출하는 경우

# 잘못된 코드
for ch in s1:
    s2.remove(ch)
    result.append(ch)

현재 문자가 s2에 없는 경우 오류가 나므로, 반드시 if ch in s2:로 확인한 뒤 제거해야 한다.

결과 리스트를 그대로 출력하는 경우

# 잘못된 코드
print(result)

이렇게 하면 ['l', 'o']처럼 리스트 형태로 출력되므로, "".join(result)로 문자열로 바꿔 출력해야 한다.


3. 핵심 정리

이 문제는 첫 번째 문자열을 순서대로 보면서, 현재 문자가 두 번째 문자열에 남아 있으면 결과에 넣고 두 번째 문자열에서는 바로 제거하는 방식으로 해결할 수 있다.
핵심은 첫 번째 문자열의 순서는 유지하고, 두 번째 문자열의 문자는 remove()로 한 번만 사용되도록 처리하는 것이다.