-
[1일차](문제 번호 : 1316, 그룹 단어 체커) 도전백준 문제 풀이 2023. 7. 18. 02:08
1. 문제 요약
첫 째줄에 정수 N을 입력받는다.
그 다음 줄부터 단어를 한 줄에 하나씩 총 N번 제공한다.
그 단어들중 그룹 단어가 몇 개인지 출력하면 된다.
( 그룹 단어란 aaabbbc와 같이 같은 알파벳이 떨어지지않은 단어이다. 반례로는 aabbaa가 있다.)
예시.
입력
5 ab aa aca ba bb
출력
4
2. 풀어보기
가장 먼저 생각이든 방법은 단어를 입력받아 단어를 복제해놓는다. 그리고 한 글자씩 앞에서부터 불러온다.
그리고 그 글자를 하나 삭제시킨다.
그 후, 복제되누단어를 뒤집고 불러온 글자를 하나 삭제시킨다. 그 후, 단어를 다시 뒤집어 복제된 단어와 단어가 일치하는 지 알아본다.
예를 들어 단어가 word = aabccbaabb라고 하자.
복제본 단어는 word2 = aabccbaabb이다.
첫 글자는 a이다. 따라서, word = abccbaabb가 된다.
복제본 단어는 word2 = aabccbabb가 된다.
복제본 단어와 단어가 다르므로 이 단어는 그룹 단어가 아니다.
두 번째 예시로는 word = aaaabbbccc이다.
word2 = aaaabbbccc이다.
위와 같은 방식으로 첫 글자는 a이므로,
word = aaabbbccc
word2 = aaabbbccc이므로 같은 단어이다. 이를 word가 비어졌을 때까지 반복하여 그룹 단어가 아닌 것이 아니게 되면 통과한다.
따라서 코드를 다음과 같이 작성했다.
N = int(input())
count = 0
for _ in range(N):
word = input()
dupword = word
for i in word:
word = word.replace(i,'',1)
rev_dupword = dupword[::-1]
rev_dupword = rev_dupword.replace(i,'',1)
dupword = rev_dupword[::-1]
if word == dupword:
if word == '':
count += 1
else:
continue
else:
break
print(count)word는 문자열이므로 remove가 아닌 replace를 활용하였다.
바로 정답을 맞혔다.. 기분이 좋다.
따라서 최종 코드는 위의 코드와 같다.
3. 개선방안
맞힌 사람들의 정답을 봐보니 모두 다 sorted라는 함수를 쓰고 있었다.
sorted(word ,key=word.find) 라는 식을 다들 이용하고 있었다.
나도 수업때 sorted 함수에 대해 들어본 적은 있었지만, key = 부분이나 .find에 대해 잘 몰라서 먼저, 구글링을 해본 후,
해결이 되지 않아, 카카오톡 오픈채팅에 질문을 해보았다.
예를 들어, word = 'banana' 라면 위의 sorted 함수는 baaann을 리스트로 반환한다.
(즉, 앞에서 부터 순서대로 글자를 기준으로 삼고, 정렬.)
따라서 list(word) == sorted(word ,key=word.find) 라면 그룹 단어가 되는 것이다.
4. 얻어가는 것
1. str.replace()는 str 자체를 변환시키는 것이 아니라, str을 변환시킨 것을 반환한다.
2. sorted 함수와 key = , 그리고 .find 에 대하여.
'백준 문제 풀이' 카테고리의 다른 글
[5일차](문제 번호 : 2536, 색종이) 도전 (0) 2023.07.22 [4일차](문제 번호 : 2566, 최댓값) 도전 (0) 2023.07.21 [3일차](문제 번호 : 10798, 세로읽기) 도전 (0) 2023.07.20 [2일차](문제 번호 : 2738, 행렬 덧셈) 도전 (0) 2023.07.19 [0일차](문제 번호 : 2941, 크로아티아 알파벳) 도전 (0) 2023.07.17