👉 사용 언어 : PYTHON3
이상한 문자 만들기
✅ Solution
def solution(s):
result = []
for word in s.split(' '):
answer = ''
for i in range(len(word)):
if i % 2 == 0:
answer += word[i].upper()
else:
answer += word[i].lower()
result.append(answer)
answer = ' '.join(result)
return answer
👉 대소문자 변환 upper() 및 lower() 사용
👉 문자열 구분자 기준 분리 split() 사용
👉 문자리스트 원소값을 문자열로 합치는 join() 사용 _ ~.join()은 각 문자리스트의 원소값 사이에 ~를 함께 넣어서 문자열을 만들어준다.
👉 사실 좋은 코드는 아닌 것 같다. 좀 더 공부가 필요할 듯 하다.
✅ 다른 사람 풀이 참고
def toWeirdCase(s):
return " ".join(map(lambda x: "".join([a.lower() if i % 2 else a.upper() for i, a in enumerate(x)]), s.split(" ")))
👉 어떻게 한 줄로 풀이하셨지..
푸드파이트 대회
✅ Solution
def solution(food):
answer = ''
for i in range(len(food)):
answer += str(i) * (food[i]//2)
answer += ('0' + ''.join(list(answer)[::-1]))
return answer
👉 문자열 슬라이싱 [::-1] 및 join() 사용
👉 문자열[:] 을 하면 문자열[시작:끝] 과 같으며, 이것은 문자열을 앞에서부터 하나씩 슬라이싱 해서 새로운 문자열을 만드는 것
👉 문자열[시작:끝:규칙]에서 규칙은 슬라이싱을 하는 규칙을 의미한다.
👉 규칙의 디폴트값은 1이며 1이 들어가게 되면 문자열을 앞에서부터 하나씩 잘라서 새로운 문자열을 만드는 것이다.
( 2가 들어가게 되면 앞에서부터 한 칸씩 띄워서 2씩 잘라주어 새로운 문자열을 만드는 것이다. [0],[2],[4],[6],...)
👉 -1이 들어가게 되면 역순으로 하나씩 잘라서 문자열을 생성한다. [-1],[-2],[-3],[-4],...
( -2가 들어가게 되면 역순으로 하나씩 자르되 한 칸씩 띄워서 자르게 된다. [-1],[-3],[-5],...
2016년
✅ Solution
from datetime import date
def solution(a, b):
day = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
return day[date(2016, a, b).weekday()]
👉 datetime 패키지 사용
👉 날짜와 시간을 함께 저장하는 datetime 클래스 / 날짜만 저장하는 date 클래스 / 시간만 저장하는 time 클래스 / 시간 구간 정보를 저장하는 timedelta 클래스 - 제공한다.
👉 datetime 객체 속성
- year : 연도
- month : 월
- day : 일
- hour : 시
- minute : 분
- second : 초
- microsecond : 마이크로초(micro seconds, 백만분의 일초)
👉 여러가지 메서드
- weekday : 요일 반환 (0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일) / isoweekday (1:월, 2:화, 3:수, 4:목, 5:금, 6:토, 7:일)
- strftime : 날짜와 시간 정보를 문자열로 반환
- date : 날짜 정보만 가지는 date 클래스 객체 반환
- time : 시간 정보만 가지는 time 클래스 객체 반환
- 날짜 및 시간 지정 문자열 참고
✅ 다른 사람 풀이 참고
def getDayName(a,b):
month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
day = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU']
return day[(sum(month[:a-1])+b-1)%7]
👉 별도의 패키지 임포트 안하고 풀 수 있는 방법 !
카드뭉치
✅ Solution
def solution(cards1, cards2, goal):
answer = []
for word in goal:
if len(cards1) != 0 and cards1[0] == word:
answer.append(cards1.pop(0))
elif len(cards2) != 0 and cards2[0] == word:
answer.append(cards2.pop(0))
else:
break
if (answer == goal):
return "Yes"
else:
return "No"
👉 저번 문제처럼 sort 사용하면 간단히 풀릴 줄 알았는데 순서 조건이 있어서 다시 생각해보았다 ..
👉 len(cards1) != 0 및 len(cards2) != 0 조건을 써주지 않으면 IndexError가 발생한다.
👉 문제에 제한사항이 까다롭기 때문에 여러가지 경우의 수를 고려하여 코드를 작성해야한다.
👉 고려하지 못했던 경우의 수
입력값 〉 ["list", "length", "important"], ["are", "very"], ["are", "very"]
기댓값 〉 "Yes"
👉 이러한 경우때문에 "Yes"/"No"를 반환할 조건을 따로 만들고, answer 문자리스트까지 사용했는데 밑의 참고 풀이를 보면 굳이 사용하지 않고 간결하게 코드를 구현할 수 있는 문제였다. 좀 더 분발하도록 ..
✅ 다른 사람 풀이 참고
def solution(cards1, cards2, goal):
for g in goal:
if len(cards1) > 0 and g == cards1[0]:
cards1.pop(0)
elif len(cards2) >0 and g == cards2[0]:
cards2.pop(0)
else:
return "No"
return "Yes"
두 개 뽑아서 더하기
✅ Solution
def solution(numbers):
answer = []
sort_num = sorted(numbers) # 없어도 되는 코드(의미없는 정렬)
for i in range(len(sort_num)):
for j in range(i+1, len(sort_num)):
answer.append(sort_num[i]+sort_num[j])
return sorted(list(set(answer)))
👉 set() 사용하여 중복 제거 및 sorted() 사용하여 리스트 원소 오름차순 정렬
👉 아래의 참고 풀이를 확인 후, 정렬은 반환할 때 1번만 실행해도 되는 것을 알 수 있었다.
: set() 사용하면 중복 원소가 제거되고 정렬이 되어 반환되는데 이것을 다시 리스트 타입으로 변환하면 순서가 뒤죽박죽되어 반환되므로
맨 마지막에 sorted()를 사용하여 오름차순 정렬된 리스트를 반환해주는 것이 맞다.
✅ 다른 사람 풀이 참고
def solution(numbers):
answer = []
for i in range(len(numbers)):
for j in range(i+1, len(numbers)):
answer.append(numbers[i] + numbers[j])
return sorted(list(set(answer)))
폰켓몬
✅ Solution
def solution(nums):
nums_set = list(set(nums))
if len(nums)/2 > len(nums_set):
return len(nums_set)
else:
return len(nums)/2
👉 경우의 수를 (1) 중복제거한 리스트의 길이가 N/2보다 작을 경우 , (2) ~가 N/2보다 크거나 같을 경우로 나누어 풀이하였다.
(1)의 경우 > 나올 수 있는 최대 종류수는 중복제거한 리스트의 길이다.
(2)의 경우 > 나올 수 있는 최대 종류수는 N/2이다. ( N/2 개를 뽑으므로 종류가 그보다 많을 수는 없다. )
✅ 다른 사람 풀이 참고
def solution(ls):
return min(len(ls)/2, len(set(ls)))
👉 요렇게 간결하게 나타낼 수 있다니.. 더 분발하자
( min 사용해서 풀이할 수 있을 줄은 생각도 못했던 부분 )
.크기가 작은 부분 문자열
✅ Solution
def solution(t, p):
answer = 0
for i in range(len(t)-len(p)+1):
if int(t[i:i+len(p)]) <= int(p):
answer += 1
return answer
👉 처음엔 3개씩 뽑아서 만든 모든 조합 중에 p보다 크기가 작거나 같은 문자열을 찾는 줄 알고 combinations 패키지를 사용하려고 했다.
👉 문제를 다시 살펴보니 연속된 문자열 중 찾는 것이었고 그러므로 p의 길이만큼 슬라이싱하여 비교하면 되는 것이었다.
👉 결론 : 문자열 슬라이싱 을 사용하여 문제 풀이
( 반복문 범위 및 슬라이싱 인덱스를 잘 맞게 설정해야 한다. )
✅ 다른 사람 풀이 참고
def solution(t, p):
return len([t[i: i+len(p)] for i in range(len(t)-len(p)+1) if int(t[i: i+len(p)]) <= int(p)])
👉 코드의 간결성이 좋은건지? 가독성이 좋은건지?
한 줄 코드는 가독성이 안좋을 것 같은데 이렇게 풀이하는게 더 좋은건지? 궁금하다.
'알고리즘풀이 > 프로그래머스' 카테고리의 다른 글
| [11/16] Lv1. (0) | 2023.11.10 |
|---|---|
| [11/8] Lv1. (0) | 2023.11.04 |
| [10/22] Lv1. (0) | 2023.10.19 |
| [9/30] Lv1. (0) | 2023.09.27 |
| [9/21] Lv1. (0) | 2023.09.15 |