문제

 

https://leetcode.com/problems/perfect-squares/

 

Perfect Squares - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Given an integer n, return the least number of perfect square numbers that sum to n.

A perfect square is an integer that is the square of an integer; in other words, it is the product of some integer with itself. For example, 1, 4, 9, and 16 are perfect squares while 3 and 11 are not.

 

Example 1:

Input Output
n = 12 3
Explanation: 12 = 4 + 4 + 4.

Example 2:

Input Output
n = 13 2
Explanation: 13 = 4 + 9

 

 

문제풀이 코드

# Dp 풀이 방식
class Solution:
    def numSquares(self, n: int) -> int:
        dp = [inf for _ in range(10001)]
        dp[0] = 0
        ps = []
        
        i = 1
        while i*i <= n:
            ps.append(i*i)
            i += 1
        
        for i in range(1, n + 1):
            for s in ps:
                if i < s:
                    break
                dp[i] = min(dp[i], dp[i-s] + 1)  
        return dp[n]

# Bfs 풀이 방식
class Solution:
    def numSquares(self, n: int) -> int:
        if n < 2:
            return n

        perfect_square = []
        i = 1
        while i * i <= n:
            perfect_square.append(i*i)
            i += 1
        
        check = {n}
        count = 0
        while check:
            count += 1
            temp = set()
            for num in check:
                for square in perfect_square:
                    if num == square:
                        return count
                    if num < square:
                        break
                    temp.add(num - square)
            check = temp
        return count

다이나믹 프로그래밍 풀이

1. 0은 만들 수 있는 수가 없고, 1은 1로 만들 수 있고, 2는 1+1로 만들 수 있고, 3은 1+1+1로 만들 수 있고, 4는 4로 만들 수 있다.

2. 식으로 변형하면 dp[0] = 0, dp[1] = 1, dp[2] = 2, dp[3] = 3, dp[4] = 1이 된다.

3. 예를 들어 구해야되는 수가 7이면, 7 = 4 + 3(1 + 1 + 1)이 되기 때문에 dp[7-4] + 1이 되게 된다.

4. 이를통해 점화식을 구하면 dp[i] = min(dp[i], dp[i-제곱수] + 1)가 된다.

5. n 보다 작은 모든 제곱수를 담은 리스트를 만들고 1 ~ n까지 반복문을 돌면서

6. s가 i보다 작을때만 dp[i]를 초기화 해준다.(i = 3인데 제곱수가 4가나오면 계산할 수 없음)

7. 반복문이 종료되면 dp[n]을 반환한다.

 

BFS 풀이

1. 다이나믹 프로그래밍과 동일하게 n보다 작은 모든 제곱수를 리스트에 담아준다.

2. 체크할 수를 딕셔너리 형태로 저장(이 후 연산후 중복된 값이 들어가지 않도록하기위함)

3. 반복문을 돌때마다 카운트를 1씩 증가시켜준다.

4. check에 있는 수에 모든 제곱수를 빼준다.

5. 연산된 숫자들이 담긴 집합을 check에 담아준다.

6. 반복하면서 check에 제곱수가 들어가있다면 현재 count를 반환한다.

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/42895

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다.

12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5

5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다.
이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요.

 

제한사항
  • N은 1 이상 9 이하입니다.
  • number는 1 이상 32,000 이하입니다.
  • 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
  • 최솟값이 8보다 크면 -1을 return 합니다.

 

입출력 예
N number return
5 12 4
2 11 3

 

 

문제풀이 코드

def solution(N, number):
    answer = -1
    if N == number:
        return 1
    
    dp = [[] for _ in range(9)]
    
    # 최솟값이 8보다 클 수 없기때문에 1개부터 8개까지 N으로 만들 수 있는 모든 수를 구한다.
    for i in range(1, 9):
    	# 숫자 이어 붙이기
        dp[i].append(int(str(N) * i))
        for j in range(1, i):
            for num1 in dp[j]:
                for num2 in dp[i - j]:
               	    # 사칙연산
                    dp[i].append(num1 + num2)
                    dp[i].append(num1 * num2)
                    dp[i].append(num1 - num2)
                    if num2 != 0:
                        dp[i].append(num1 // num2)
        if number in dp[i]:
            answer = i
            break
    return answer

동적 계획법으로 문제 풀이

1. N = 5일 때, 5를 만들기 위해서는 5가 1개 있으면 되기 때문에  dp[1] = [5]가 된다. 

2. 5가 2개 있으면 만들 수 있는 수는 [0, 1, 10, 25, 55]이다. 

3. 5가 3개 있으면 만들 수 있는 수는[0, 2, ... 555]가 있다.

4. 이를 통해 알 수 있는 것은 dp[3] = dp[1] ㅇ dp[2], dp[2] ㅇ dp[1]이 된다. (ㅇ 는 사칙연산을 표현)

5. dp[4] = dp[1] ㅇ dp[3], dp[2] ㅇ dp[2], dp[3] ㅇ dp[1]이 되게 된다.

6. 이를 통해 점화식을 도출하면, dp[i] = dp[j] ㅇ dp[i-j] 가 된다.

7. 이제 반복문을 돌면서 1개부터 9개 까지 N으로 만들 수 있는 모든 수들을 구하여 찾고있는 수가 dp에 들어있을 때 i값을 반환하면 된다.

 

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/42898

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다.

아래 그림은 m = 4, n = 3 인 경우입니다.

가장 왼쪽 위, 즉 집이 있는 곳의 좌표는 (1, 1)로 나타내고 가장 오른쪽 아래, 즉 학교가 있는 곳의 좌표는 (m, n)으로 나타냅니다.

격자의 크기 m, n과 물이 잠긴 지역의 좌표를 담은 2차원 배열 puddles이 매개변수로 주어집니다. 오른쪽과 아래쪽으로만 움직여 집에서 학교까지 갈 수 있는 최단경로의 개수를 1,000,000,007로 나눈 나머지를 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 격자의 크기 m, n은 1 이상 100 이하인 자연수입니다.
    • m과 n이 모두 1인 경우는 입력으로 주어지지 않습니다.
  • 물에 잠긴 지역은 0개 이상 10개 이하입니다.
  • 집과 학교가 물에 잠긴 경우는 입력으로 주어지지 않습니다.
 
입출력 예
m n puddles return
4 3 [[2, 2]] 4

 

입출력 예 설명

 

 

문제풀이 코드

def solution(m, n, puddles):
    dp = [[0] * (m+1) for _ in range(n+1)]
    dp[1][1] = 1
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            if [j, i] in puddles:
                continue
            dp[i][j] += (dp[i-1][j] + dp[i][j-1]) % 1000000007
    return dp[n][m]

문제의 최단경로를 보고 bfs로 접근했다가 실패...

오른쪽과 아래로만 내려갈 수 있으면 이동할 수 있는 모든 경로가 최단거리기 때문에 동적계획법으로 풀이 변경

 

위 그림을 보고 점화식을 유추할 수 있다 

현재 위치가 dp[x][y]일 때, 점화식은

dp[x][y] = dp[x-1][y] + dp[x][y-1]가 된다.

 

 

 

 

 

 

 

 

1. dp배열을 루프돌면서 모든 위치에 값을 구해준다. 단, 길이 물에 잠겼을 때는 continue를 통해 dp[i][j]를 초기화하지 않는다.

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/42627

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다.

예를들어

- 0ms 시점에 3ms가 소요되는 A작업 요청
- 1ms 시점에 9ms가 소요되는 B작업 요청
- 2ms 시점에 6ms가 소요되는 C작업 요청

와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다.

한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다.

- A: 3ms 시점에 작업 완료 (요청에서 종료까지 : 3ms)
- B: 1ms부터 대기하다가, 3ms 시점에 작업을 시작해서 12ms 시점에 작업 완료(요청에서 종료까지 : 11ms)
- C: 2ms부터 대기하다가, 12ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 16ms)

이 때 각 작업의 요청부터 종료까지 걸린 시간의 평균은 10ms(= (3 + 11 + 16) / 3)가 됩니다.

하지만 A → C → B 순서대로 처리하면

- A: 3ms 시점에 작업 완료(요청에서 종료까지 : 3ms)
- C: 2ms부터 대기하다가, 3ms 시점에 작업을 시작해서 9ms 시점에 작업 완료(요청에서 종료까지 : 7ms)
- B: 1ms부터 대기하다가, 9ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 17ms)

이렇게 A → C → B의 순서로 처리하면 각 작업의 요청부터 종료까지 걸린 시간의 평균은 9ms(= (3 + 7 + 17) / 3)가 됩니다.

각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다)

 

제한 사항
  • jobs의 길이는 1 이상 500 이하입니다.
  • jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간] 입니다.
  • 각 작업에 대해 작업이 요청되는 시간은 0 이상 1,000 이하입니다.
  • 각 작업에 대해 작업의 소요시간은 1 이상 1,000 이하입니다.
  • 하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다.
 
입출력 예
jobs return
[[0, 3], [1, 9], [2, 6]] 9

 

 

문제풀이 코드

import heapq

def solution(jobs):
    start, end = -1, 0
    result = 0
    
    hq = []
    i = 0
    while i < len(jobs):
        for job in jobs:
        	# 요청시간이 start와 end 사이에 있는 작업을 힙에 삽입
            if start < job[0] <= end:
            	# 삽입할 때는 (작업시간, 요청시간)으로 삽입한다. 
                # 작업시간이 짧은 순으로 힙에서 뽑아야하기 때문
                heapq.heappush(hq, (job[1], job[0]))
        if hq:
            current = heapq.heappop(hq)
            start = end
            end += current[0]
            
            # 현재 작업이 요청에서 작업까지 걸린 시간을 result에 더해준다.
            result += end - current[1]
            i += 1
        else:
            end += 1
    return result // len(jobs)

힙을 사용한 문제 풀이

1. 현재 대기하고있는 작업들 중 작업시간이 가장 짧은 순서로 작업을 실행시켜야 한다.

2. 작업들 중 실행시킬 수 있는 작업들을 힙에 삽입한다.

3. 삽입할 땐, 작업시간으로 힙에서 빼올 수 있도록 (작업시간, 요청시간)으로 바꿔서 넣는다

4. 현재 실행시킬 수 있는 작업이 다 삽입되면 힙에서 작업시간이 가장 작은 작업을 pop한다

5. start, end, result를 차례대로 변경한 후 반복문을 진행한다.

6. 반복문이 종료되면 요청에서 작업까지 걸린 시간의 평균을 반환한다.

문제

 

https://leetcode.com/problems/word-search-ii/description/

 

Word Search II - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Given an m x n board of characters and a list of strings words, return all words on the board.

Each word must be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.

 

Example 1:

Input Output
board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], words = ["oath","pea","eat","rain"] ["eat","oath"]


Example 2:

Input Output
Input: board = [["a","b"],["c","d"]], words = ["abcb"] []

 

 

문제풀이 코드

# 문자열 탐색 자료구조
class Trie:
    def __init__(self):
        self.trie = {}
        
    def insert(self, word):
        current = self.trie
        for w in word:
            if w not in current:
                current[w] = {}
            current = current[w]
        current['#'] = '#'
        
    def remove(self, word):
        current = self.trie
        nodes = []
        for w in word:
            if w not in current:
                return False
            current = current[w]
            nodes.append((current, w))
        
        if '#' in current:
            remove = '#'
            for node, w in nodes[::-1]:
                if remove == '#' or len(node[remove]) == 0: del(node[remove])
                remove = w

class Solution:
    def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
        dx, dy = [0, 1, 0, -1], [1, 0, -1, 0]
        row, col = len(board), len(board[0])
        result = set()
        root = Trie()
        visited = [[False] * col for _ in range(row)]
        
        for w in words:
            root.insert(w)
		
        # 백트래킹
        def dfs(x, y, word, trie):
            if x < 0 or x >= row or y < 0 or y >= col or visited[x][y] or board[x][y] not in trie:
                return
            visited[x][y] = True
            word = word + board[x][y]
            trie = trie[board[x][y]]
            if '#' in trie:
                result.add(word)
                root.remove(word)
            for i in range(4):
                xx, yy = x + dx[i], y + dy[i]
                dfs(xx, yy, word, trie)
            visited[x][y] = False

        for i in range(row):
            for j in range(col):
                dfs(i, j, "", root.trie)
        return list(result)

백트래킹 + 문자열탐색 Trie자료구조

처음 문제를 접근할 때 Trie자료구조를 사용하지않고 모든 문자열을 비교하여 시간초과가 나옴..

다른 접근법을 참조하니 Trie자료구조를 이용하여 더 빠르게 문자열을 탐색할 수 있어 풀이 변경

1. 트라이 자료구조 구현(insert, remove)

2. 백트래킹을 사용하여 모든 알파벳 탐색

3. 일반적인 백트래킹 기법에서 조건을 하나 추가하여 탐색 진행 -> 현재 trie에 '#'이 들어있다면 현재 word는 존재하는 단어로 결과에 추가해주고 탐색한 단어는 삭제해줌으로 중복 탐색하는 경우를 제거

4. 모든 재귀호출이 종료되면 결과를 list로 반환한다.

 

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/43164

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.

항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한사항
  • 모든 공항은 알파벳 대문자 3글자로 이루어집니다.
  • 주어진 공항 수는 3개 이상 10,000개 이하입니다.
  • tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다.
  • 주어진 항공권은 모두 사용해야 합니다.
  • 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.
  • 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.

 

입출력 예
tickets return
[["ICN", "JFK"], ["HND", "IAD"], ["JFK", "HND"]] ["ICN", "JFK", "HND", "IAD"]
[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]] ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]
 
입출력 예 설명

예제 #1

["ICN", "JFK", "HND", "IAD"] 순으로 방문할 수 있습니다.

 

예제 #2

["ICN", "SFO", "ATL", "ICN", "ATL", "SFO"] 순으로 방문할 수도 있지만 ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"] 가 알파벳 순으로 앞섭니다.

 

 

문제풀이 코드

from collections import defaultdict

def solution(tickets):
    tickets_dict = defaultdict(list)
    result = []
    
    # 공항에서 출발하여 도착할 수 있는 모든 도착지를 딕셔너리 형태로 관리
    for start, end in tickets:
        tickets_dict[start].append(end)
    
    # 방문 순서는 알파벳 순으로 하기때문에 정렬해준다
    for key in tickets_dict.keys():
        tickets_dict[key].sort()
        
    def dfs(start):
        while tickets_dict[start]:
            end = tickets_dict[start].pop(0)
            dfs(end)
        
        # 출발지에서 더이상 갈곳이 없을 때 결과에 넣어준다.
        # 방문 순서가 역순으로 쌓임
        if not tickets_dict[start]:
            result.append(start)
    
    dfs("ICN")
    return result[::-1]

1. 출발지에서 갈 수 있는 모든 도착지를 딕셔너리 형태로 만든다.

2. 출발지에서 갈 수 있는 모든 도착지를 정렬한다. (방문은 알파벳순으로 해야된다.)

3. 출발지에서 갈 수 있는 모든 도착지를 순서대로 재귀호출한다.

4. 출발지에서 더 이상 갈 수 있는곳이 없다면 결과에 추가해준다.

5. 출발은 "ICN"에서 하니까 dfs("ICN")으로 호출한다.

6. 도착지가 없는 곳 부터 결과에 들어오기 때문에 result를 뒤집어서 반환한다.

문제

 

https://leetcode.com/problems/reverse-vowels-of-a-string/

 

Reverse Vowels of a String - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Given a string s, reverse only all the vowels in the string and return it.

The vowels are 'a', 'e', 'i', 'o', and 'u', and they can appear in both lower and upper cases, more than once.

 

문자열 s안에 있는 모든 모음들을 뒤집어서 반환해라, 모음은 대문자도 포함

 

Example 1:

Input Output
s = "hello" "holle"

 

Example 2:

Input Output
s = "leetcode" "leotcede"

 

 

문제풀이 코드

class Solution:
    def reverseVowels(self, s: str) -> str:
        vowels = {'a','e','i','o','u','A','E','I','O','U'}
        s = list(s)
        i, j = 0, len(s) - 1

        while i < j:
            # s[i]가 모음 집합에 들어가있고, s[j]는 안들어가있다면 j -= 1 해준다
            if s[i] in vowels and s[j] not in vowels:
                j -= 1
                continue
            # s[j]가 모음 집합에 들어가있고, s[i]는 안들어가있다면 i += 1 해준다    
            elif s[i] not in vowels and s[j] in vowels:
                i += 1
                continue
            # s[i]가 모음 집합에 들어가있고, s[j]도 들어가있다면 s[i]와 s[j]의 위치를 바꾼다
            elif s[i] in vowels and s[j] in vowels:
                s[i], s[j] = s[j], s[i]
            i += 1
            j -= 1
        return ''.join(s)

투포인터로 문제 접근

1. i = 0, j = len(s) -1 로 초기화한다

2. i번째 문자가 모음이고 j번째 문자는 모음이 아닐 때 j = j - 1을 해준다.

3. j번째 문자가 모음이고 i번째 문자는 모음이 아닐 때 i = i + 1을 해준다.

4. i번째 문자가 모음이고 j번째 문자도 모음일 때 s[i]와 s[j]의 자리를 바꿔주고 i = i + 1, j = j - 1을 해준다

5. 반복문이 종료되면 문자열로 변환하여 반환한다.

문제

 

https://leetcode.com/problems/longest-palindrome-by-concatenating-two-letter-words/

 

Longest Palindrome by Concatenating Two Letter Words - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

ou are given an array of strings words. Each element of words consists of two lowercase English letters.

Create the longest possible palindrome by selecting some elements from words and concatenating them in any order. Each element can be selected at most once.

Return the length of the longest palindrome that you can create. If it is impossible to create any palindrome, return 0.

A palindrome is a string that reads the same forward and backward.

 

Example 1:

Input Output
words = ["lc","cl","gg"] 6
Explanation: One longest palindrome is "lc" + "gg" + "cl" = "lcggcl", of length 6.
Note that "clgglc" is another longest palindrome that can be created.

 

Example 2:

Input Output
words = ["ab","ty","yt","lc","cl","ab"] 8
Explanation: One longest palindrome is "ty" + "lc" + "cl" + "yt" = "tylcclyt", of length 8.
Note that "lcyttycl" is another longest palindrome that can be created.

 

Example 3:

Input Output
words = ["cc","ll","xx"] 2
Explanation: One longest palindrome is "cc", of length 2.
Note that "ll" is another longest palindrome that can be created, and so is "xx".

 

 

문제풀이 코드

class Solution:
    def longestPalindrome(self, words: List[str]) -> int:
        counter = Counter(words)
        result = mid = 0
        string = ""
        for word in counter.keys():
            # "aa", "bb" 같은 문자열
            if word[0] == word[1]:
                # "aa"의 갯수가 짝수면 갯수, 홀수면 -1 을 더해준다
                result += counter[word] if counter[word] % 2 == 0 else counter[word] - 1
                # 모든 앞뒤가 같은 단어들 중 홀수가 하나라도있으면 mid = 1
                mid |= counter[word] % 2
            # "cl", "lc" 같은 단어 일 때 
            elif word[::-1] in counter:
                # 앞뒤로 이어붙일 수 있는 단어는 둘개의 단어를 카운트 했을 때 더 갯수가 더 작은 쪽으로 더해준다
                # Ex) ["lc", "lc", "lc", "cl", "cl"] 일 때,
                # "lclcclcl"은 되지만 "lclclcclcl"은 성립하지 않는다.
                result += min(counter[word], counter[word[::-1]])
        # 모든 단어는 2글자로 되어있으니 * 2를 해준다
        return (result+mid)*2

1. 모든 단어들을 Counter함수를 통해 갯수를 샌다.

2. 단어는 "aa" 앞뒤가 같은단어 또는 "lc" 앞뒤가 다른 단어가 올 수 있다.

3. 앞뒤가 같은 단어일 때는 짝수로 나누어지면 해당 단어의 갯수를 result에 더해주고 홀수일때는 -1을 해서 짝수만큼 더해준다

4. 같은단어가 홀수개 있을 때 mid = 1

5. 앞뒤가 다른 단어일 때는 현재 단어의 갯수와 뒤집었을 때 단어의 갯수 중 더 작은 값을 result에 더해준다

6. 모든 단어는 2글자이기 때문에 (result + mid) * 2를 반환한다

+ Recent posts