Algorithms/LeetCode 80

[LeetCode] 443. String Compression

1. 문제 이해문자들의 리스트가 주어진다.빈 문자열 s로 시작한다.주어진 리스트에서 연속으로 반복되는 문자 그룹을 확인한다.그룹의 길이가 1이면 해당 문자를 s에 추가한다.그룹의 길이가 2 이상이면 해당 문자와 그룹의 길이를 s에 추가한다.(그룹의 길이가 10 이상이면 길이를 여러 문자로 나누어 추가한다.)압축된 문자열 s를 입력 문자 리스트에 저장한다.수정된 리스트의 길이를 리턴한다.  2. 풀이 과정반복문으로 주어진 리스트를 돈다.만약 현재 문자와 리스트의 다음 문자가 같다면 카운트 변수를 1 증가시킨다.만약 다르다면 현재 문자를 빈 문자열 s에 더하고 카운트가 1보다 크다면 카운트도 s에 더한다.s =""cnt = 1for i in range(0, len(chars)-1): if chars[i..

Algorithms/LeetCode 2024.10.29

[LeetCode] 334. Increasing Triplet Subsequence

1. 문제 이해정수 리스트 nums가 주어진다.i 그러한 인덱스가 존재하면 true를, 존재하지 않는다면 false를 리턴한다.  2. 풀이 과정처음부터 i번째 인덱스까지의 최솟값을 구한다.i번째 인덱스부터 마지막까지의 최댓값을 구한다.만약 i번째 인덱스의 값과 최솟값이 다르고 i번째 인덱스의 값과 최댓값이 다르다면 만족하는 세 개의 인덱스가 존재하는 것이다. 리스트의 슬라이싱은 실행 시간 문제로 사용하지 않는다.각 인덱스까지의 최솟값과 최댓값을 저장한 리스트를 필요한 크기만큼 미리 만들고 계산하여 값을 넣는다.# 각 인덱스까지의 최소값을 저장할 리스트min_till = [0]*nmin_till[0] = nums[0] for i in range(1, n): min_till[i] = mi..

Algorithms/LeetCode 2024.10.27

[LeetCode] 151. Reverse Words in a String

1. 문제 이해 주어진 문자열 s에서 단어의 순서를 반대로 배치해야 한다. 단어는 공백이 없는 문자들의 연속된 부분으로 정의된다.문자열에서는 각 단어가 하나의 공백으로만 구분되어야 한다.  2. 풀이 과정공백을 기준으로 문자열을 분리한다.분리한 문자들의 문자열을 뒤집는다.하나의 문자열로 합친다.  3. 전체 코드class Solution: def reverseWords(self, s: str) -> str: s2 = s.split() s2.reverse() return ' '.join(s2)  4. 생각할 점- 투 포인터로 풀이할 수 있을까?  5. 출처- https://leetcode.com/problems/reverse-words-in-a-string/?en..

Algorithms/LeetCode 2024.09.22

[LeetCode] 345. Reverse Vowels of a String

1. 문제 이해문자열이 주어진다.모음에 해당하는 문자의 순서를 뒤집어서 문자열을 리턴한다.ex). Input: "leetcode", Output: "leotcede"  2. 풀이 과정set을 사용하여 모음을 정의한다.vowels = set('aeiouAEIOU') Python에서 str(문자열)은 불면이므로 가변인 리스트로 변환한다.s = list(s) 문자의 순서를 뒤집기 위해 투 포인터를 사용한다.left, right = 0, len(s)-1while left   3. 전체 코드class Solution: def reverseVowels(self, s: str) -> str: vowels = set('aeiouAEIOU') s = list(s) left, r..

Algorithms/LeetCode 2024.09.21

[LeetCode] 605. Can Place Flowers

1. 문제 이해화단 리스트에는 일부 자리가 이미 꽃으로 채워져 있다.인접한 곳에 꽃을 심을 수 없다는 규칙이 있다.0은 비어 있는 자리, 1은 이미 꽃이 심어진 자리를 뜻한다.n개의 꽃을 새로 심을 수 있는지 확인한다.가능하다면 True를 리턴하고 불가능하다면 False를 리턴한다.  2. 풀이 과정빈 자리(0)를 찾기 위해 flowerbed 리스트를 순회한다.현재 위치가 0이고, 왼쪽과 오른쪽이 비어 있으면 그 자리에 꽃을 심는다.flowerbed 리스트에서 해당 자리를 1로 바꾼다.꽃을 심을 때마다 cnt를 증가시킨다. cnt가 n과 같거나 많아지면 True를 반환한다.끝까지 순회했는데도 n개를 다 심지 못했다면 False를 반환한다.  3. 전체 코드class Solution: def canP..

Algorithms/LeetCode 2024.09.21

[LeetCode] 1431. Kids With the Greatest Number of Candies

1. 문제 이해candies 리스트가 주어진다.(길이가 n)candies[i]는 i번째 아이가 가지고 있는 사탕의 수를 의미한다.리스트에 포함되지 않은 엑스트라 사탕의 수도 주어진다. 길이가 n인 boolean 리스트를 리턴해야 한다.i번째 아이에게 모든 엑스트라 사탕을 준다.그 아이가 모든 아이들 중 가장 많은 사탕을 가지게 될 경우 리스트의 i번째 값은 True가 되고, 그렇지 않을 경우 False가 된다.  2. 풀이 과정반복문으로 i번째 아이에게 엑스트라 사탕을 준다.Python의 index 함수를 이용하여 i번째 아이가 모든 아이들 중 가장 많은 사탕을 가지게 되었는지 확인한다.class Solution: def kidsWithCandies(self, candies: List[int], e..

Algorithms/LeetCode 2024.09.19

[LeetCode] 1071. Greatest Common Divisor of Strings

1. 문제 이해str1과 str2를 동시에 나눌 수 있는 가장 긴 문자열 x를 구한다.( "t가 s를 나눈다"고 말하는 것은 s가 t를 여러 번 이어붙인 형태일 때이다.)  2. 풀이 과정str1, str2 문자열 길이의 최대공약수는 x의 길이와 같다.str1, str2 문자열 길이의 최대공약수를 구한다.l1 = len(str1)l2 = len(str2)k = math.gcd(l1, l2) str1과 str2를 앞에서부터 k만큼 파싱한다.만약 파싱한 문자열이 다르다면 x는 존재하지 않으므로 빈 문자열을 리턴한다.파싱한 문자열이 같다면 str1과 str2가 파싱한 문자열로 이루어져 있는지 확인한다.a = l1//kb = l2//ks1 = str1[:k]s2 = str2[:k]if s1 == s2 and s..

Algorithms/LeetCode 2024.09.15

[LeetCode] 1768. Merge Strings Alternately

1. 문제 이해두 문자열 word1과 word2가 주어진다.두 문자열을 merge한다.word1부터 merge한다.문자열이 서로 다른 길이를 가진 경우, 더 긴 문자열의 남은 부분을 merge한 문자열의 끝에 추가한다.word1, word2, word1... 교차로 merge하고 남은 부분은 끝에 붙인다.  2. 풀이 과정재귀를 사용한다.word1을 병합할 차례인지, word2를 병합할 차례인지 구분하기 위해 flag 변수를 만든다.class Solution: def mergeAlternately(self, word1: str, word2: str) -> str: ans = "" flag = 0 #재귀 def merge(w1: str, w2: str..

Algorithms/LeetCode 2024.09.14

[LeetCode] 461. Hamming Distance

1. 문제 이해Hamming distance를 구한다.즉, 두 정수에서 몇 비트가 다른지 계산한다.  2. 풀이 과정몇 비트가 다른지 계산해야 한다.XOR 비트 연산을 이용한다. 비트 연산 ^을 하면 10진수가 나온다.bin 함수를 사용해 2진수로 변환한다.count 함수를 사용해 1의 개수를 센다.  3. 전체 코드class Solution: def hammingDistance(self, x: int, y: int) -> int: return bin(x ^ y).count('1')  4. 생각할 점- 비트 연산 ^을 하면 10진수가 나온다.  5. 출처- https://leetcode.com/problems/hamming-distance/- 박상길, 파이썬 알고리즘 인터뷰, 책만, 2..

Algorithms/LeetCode 2024.09.11

[LeetCode] 136. Single Number

1. 문제 이해non-empty인 리스트가 주어진다.리스트의 하나의 요소는 한 번 나온다.리스트의 나머지 요소들은 모두 두 번 나온다.'한 번 나오는 리스트의 요소'를 찾는다.  2. 풀이 과정collections 모듈을 사용하여 딕셔너리에 각 요소의 개수를 저장한다.dict = collections.Counter(nums) 딕셔너리를 순회하면서 개수가 1개일 때, key 값을 리턴한다.for key, value in dict.items(): if value == 1: return key 두 번째 방법은 XOR을 이용하는 것이다.리스트의 모든 값을 XOR 하면, 한 번 나오는 요소만 그 값이 남게 된다.for num in nums: result ^= num  3. 전체 코드(첫 번..

Algorithms/LeetCode 2024.09.10