2023. 5. 28. 14:46ㆍAlgorithm
1. 컨트롤 제트
(문제 설명, 제한사항, 입출력 예)
숫자와 "Z"가 공백으로 구분되어 있는 문자열이 주어진다.
문자열에 있는 숫자들을 차례대로 더하려고 하는데, 만약 "Z"가 나오게 되는 경우에는 "Z" 이전에 있는 숫자를 계산 값에서 뺄 것이다.
위에 주어진 규칙에 따라 반환되는 올바른 값을 구하라는 문제이다.
(내가 생각한 풀이 과정)
우선, 문자열 안에 있는 숫자와 "Z" 알파벳은 공백으로 구분되어 있기에 split(" ") 함수를 이용해서 리스트에 담아주었다.
입력 문자열이 "1 2 Z 3"인 경우에는 ["1", "2", "Z", "3"]의 형태로 리스트에 담기게 된다.
"Z" 앞에 있는 숫자를 처리하는 방법은 우선 두 가지가 떠올랐다.
첫째는 "Z" 앞에 있는 숫자를 따로 조치하지 않고 그냥 함께 더했다가 나중에 다시 빼주는 방법이 있을 것이고, 둘째는 처음부터 연산에서 제거하는 방법이 있을 것이다. 나의 경우에는 두 번째 방법으로 문제를 풀기로 했다.
"Z" 앞에 있는 숫자는 따로 해당 인덱스를 파악했다.
인덱스를 파악하기 위해서는 리스트를 enumerate 형태로 바꾸어 1를 빼서 "Z" 앞에 있는 숫자의 인덱스를 구했다.
그리고, 반복을 시키면서 해당 인덱스에 있는 숫자를 공백("")으로 바꿔주었다.
이제 마지막으로, 처음부터 끝까지 리스트를 반복하면서 "Z"가 아닌경우에 한해 정수형으로 바꿔 모든 숫자를 더했다.
(코드)
💡 내 코드
def solution(s):
lists = s.split(" ")
indexes = [i-1 for i, c in enumerate(lists) if c == "Z"]
for num in indexes: lists[num] = ""
return sum([int(i) for i in lists if i not in "Z"])
💡 다른 사람의 풀이 코드
":="라는 처음보는 연산이 있는데, 이는 대입 연산자, 바다코끼리 연산자라고 불리는 녀석이다.
역할은 할당과 반환을 동시에 진행한다. ("변수 = 표현식"의 역할)
즉, 아래 코드를 살펴보자면 s 변수에 split(" ") 연산을 포함한 결과를 할당한 후, len 함수에 포함시켰다고 이해하면 되겠다.
아래 식은 내가 위해서 말한 첫 번째 방법 ("Z" 앞에 있는 숫자를 따로 조치하지 않고 그냥 함께 더했다가 나중에 다시 빼주는 방법)을 사용한 코드이다.
def solution(s):
answer = 0
for i in range(len(s := s.split(" "))):
answer += int(s[i]) if s[i] != "Z" else -int(s[i-1])
return answer
2. 배열 원소의 길이
(문제 설명, 제한사항, 입출력 예)
문자열이 들어있는 배열이 주어질 때, 각 원소 문자열의 길이를 담은 배열로 반환하라는 문제이다.
(내가 생각한 풀이 과정)
len() 함수와 리스트 컴프리헨션으로 쉽게 풀 수 있는 문제이다.
(코드)
💡 내 코드
def solution(strlist):
return [len(i) for i in strlist]
3. 중복된 문자 제거
(문제 설명, 제한사항, 입출력 예)
문자열이 주어질 때, 중복된 문자를 제거하고 앞에 있는 하나의 문자만 남긴 문자열을 반환하라는 문제이다.
대문자와 소문자는 구분되며, 공백(" ")도 하나의 문자로 구분되어 중복을 제거해줘야 한다.
(내가 생각한 풀이 과정)
마찬가지로 반복문과 in 이라는 키워드를 사용하면 쉽게 구할 수 있는 문제이니, 이제 이 정도 문제는 풀이 과정 생략 ^_^
(코드)
💡 내 코드
def solution(my_string):
answer = ""
for i in my_string:
if i not in answer: answer += i
return answer
4. 삼각형의 완성조건 (1)
(문제 설명, 제한사항, 입출력 예)
세 변의 길이가 담겨 있는 배열이 주어진다.
가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 삼각형을 만들 수 있을 때, 주어진 세 변으로 삼각형을 만들 수 있는지 판단해 보라는 문제이다.
(내가 생각한 풀이 과정)
배열을 크기 순대로 정렬한 후, 가장 큰 원소와 남은 두 원소 합의 크기를 비교하면 해결할 수 있다.
(코드)
💡 내 코드
def solution(sides):
sides.sort()
return 1 if sides[2] < sides[0]+sides[1] else 2
💡 다른 사람의 풀이 코드
sort() 라는 정렬 함수가 무거운 작업을 요구하기 때문에, 정렬을 하지 않고도 문제를 해결할 수 있다.
바로 max() 와 sum() 함수를 이용하는 방법인데,
특히 나에게 인상적이었던 것은, max를 제외한 나머지 두 원소의 합을 "sum(모든 원소의 합)-max(최대 원소)" 식을 이용해서 구할 수 있었다는 것이었다.
def solution(sides):
return 1 if max(sides) < (sum(sides) - max(sides)) else 2
'Algorithm' 카테고리의 다른 글
[Programmers/Lv. 0] 코딩테스트 입문 Day 15 - 문자열, 해시, 배열, 수학 (Python) (0) | 2023.05.30 |
---|---|
[Programmers/Lv. 0] 코딩테스트 입문 Day 14 - 조건문, 반복문, 시뮬레이션, 문자열 (Python) (0) | 2023.05.29 |
[Programmers/Lv. 0] 코딩테스트 입문 Day 12 - 문자열, 정렬, 사칙연산, 수학 (Python) (0) | 2023.05.28 |
[Programmers/Lv. 0] 코딩테스트 입문 Day 11 - 수학, 반복문 (Python) (0) | 2023.05.27 |
[Programmers/Lv. 0] 코딩테스트 입문 Day 10 - 조건문, 배열, 수학, 시뮬레이션 (Python) (0) | 2023.04.30 |