본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 동일한 단어 그룹화하기 : 16499번 - Python

728x90
반응형

https://www.acmicpc.net/problem/16499

 

16499번: 동일한 단어 그룹화하기

첫째 줄에 단어의 개수 N이 주어진다. (2 ≤ N ≤ 100) 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 소문자로만 이루어져 있고, 길이는 10을 넘지 않는다.

www.acmicpc.net

 

 

 

문제의 접근 방법

 

단어를 알파벳 단위로 분리해서 정렬한 후 비교하기

-> 먼저 입력받은 문자를 알파벳 단위로 분리해서 정렬하여 저장한 후, 그 분리된 알파벳들을 합쳐서(join) 미리 선언해 둔 빈 리스트 arr에 없다면 추가해주기

( 이미 입력받은 문자열을 정렬했기 때문에 만약 값이 같다면 arr에 추가하지 않고 넘어가게 되므로, 각기 다른 문자열들만 저장되게 된다 = 단어가 arr의 개수만큼의 그룹으로 나뉜다. )

 

 

 

내가 막혔던 부분

 

결과값은 같게 나왔지만 오답이었다.

 

 

 

나의 문제 풀이 방법 (오답)

 

N = int(input())

arr = []
for _ in range(N):
    word = list(input())	# 단어를 알파벳 단위로 쪼개서 저장
    arr.append(word)	# 그 결과를 arr에 2차원 배열로 저장

count = 0
for i in range(len(arr)):
    for j in range(i+1,len(arr)):
    	# 두 리스트가 다른 알파벳이면서 정렬했을 때 같은 알파벳이라면 count += 1
        if arr[i] != arr[j] and sorted(arr[i]) == sorted(arr[j]):
            count += 1
        elif len(arr[i]) == 1 and arr[i] == arr[j]:
        # 두 리스트의 길이가 1이면서 같다면 count += 1
            count += 1
            
print(count)

 

 

 

정답 소스코드

n = int(input())

arr = []
for _ in range(n):
    word = sorted(list(input()))	# 입력받은 문자열들을 알파벳 단위로 잘라서 리스트에 저장 후 정렬
    word = ''.join(word)	# 정렬한 문자열을 다시 합치기
    if word not in arr:	
        arr.append(word)	# arr에 해당 단어가 없다면 추가하기

print(len(arr))	# 앞의 과정을 통해 추출된 단어들이 담긴 리스트의 개수 = 나눌 수 있는 그룹의 수
728x90
반응형