본문 바로가기
HackerRank

Special Palindrome Again

by 스빠시빠 2019. 5. 12.
def substrCount(n, s):
    l = []
    count = 0
    cur = None

		# 각 문자의 개수를 카운팅해서 리스트에 추가, 연속되는 문자처리
    for i in range(n):
        if s[i] == cur:
            count += 1
        else:
            if cur is not None:
                l.append((cur, count))
            cur = s[i]
            count = 1

    # 마지막 문자 카운팅 처리
    l.append((cur, count))

    ans = 0
        
		# 모두 같은 회문 찾기
   	# 단일 회문을 포함한 모든 경우의 회문 개수 구하는 것
    for i in l:
        ans += (i[1] * (i[1] + 1)) // 2

		# 가운데 대칭 회문 찾기
    for i in range(1, len(l) - 1):
        if l[i - 1][0] == l[i + 1][0] and l[i][1] == 1:
            ans += min(l[i - 1][1], l[i + 1][1])

    return ans

 

처음에는 문제를 잘못 읽어서 모든 대칭의 회문을 구하려고 했었다.

하지만 문제가 원하는 회문은 기준이 되는 가운데 문자 하나를 기점으로 양쪽이 같은 대칭 회문을 찾아야 하는 것이었다.

 

그래서 모든 부분 집합의 문자열을 구한 후에 찾는 방식으로 하려고 하니 로직이 너무 지저분해지고 문제가 원하는 정답이 아닐거라고 생각했다.

 

그래서 문제를 차근차근히 푸는 방식으로 접근 했다.

  1. 먼저 모든 문자가 같은 회문을 찾기
  2. 가운데 기준 대칭 회문 찾기

 

따로 놓고 보면 로직이 복잡하지 않다.

'HackerRank' 카테고리의 다른 글

Triple sum  (0) 2019.05.12
Greedy Florist  (0) 2019.05.12
Sherlock and the Valid String  (0) 2019.05.11
Frequency Queries  (0) 2019.05.11
Merge Sort: Counting Inversions  (0) 2019.05.11

댓글