마지막 두 원소
문제 설명
정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.
제한사항
2 ≤ num_list의 길이 ≤ 10
1 ≤ num_list의 원소 ≤ 9
입출력 예
num_list result
[2, 1, 6] [2, 1, 6, 5]
[5, 2, 1, 7, 5] [5, 2, 1, 7, 5, 10]
입출력 예 설명
입출력 예 #1
마지막 원소인 6이 그전 원소인 1보다 크기 때문에 6 - 1인 5를 추가해 return합니다.
입출력 예 #2
마지막 원소인 5가 그전 원소인 7보다 크지 않기 때문에 5의 두 배인 10을 추가해 return합니다.
내 풀이
def solution(num_list):
last = num_list[-1]
beforeLast = num_list[-2]
if last > beforeLast:
num_list.append(last - beforeLast)
else:
num_list.append(last*2)
return num_list
다른 풀이
def solution(l):
l.append(l[-1]-l[-2] if l[-1]>l[-2] else l[-1]*2)
return l
이...이게 뭐지
수 조작하기 1
문제 설명
정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.
"w" : n이 1 커집니다.
"s" : n이 1 작아집니다.
"d" : n이 10 커집니다.
"a" : n이 10 작아집니다.
위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.
제한사항
-100,000 ≤ n ≤ 100,000
1 ≤ control의 길이 ≤ 100,000
control은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.
입출력 예
n control result
0 "wsdawsdassw" -1
입출력 예 설명
입출력 예 #1
수 n은 control에 따라 다음과 같은 순서로 변하게 됩니다.
0 → 1 → 0 → 10 → 0 → 1 → 0 → 10 → 0 → -1 → -2 → -1
따라서 -1을 return 합니다.
내 풀이
def solution(n, control):
for alpa in control:
if alpa == 'w':
n += 1
elif alpa == 's':
n -= 1
elif alpa == 'd':
n += 10
elif alpa == 'a':
n -= 10
return n
다른 풀이
def solution(n, control):
key = dict(zip(['w','s','d','a'], [1,-1,10,-10]))
return n + sum([key[c] for c in control])
대부분 거의 비슷하게 작성을 하는 것 같은데 꼭 이렇게 한 두 분씩 엄청난 코드를 작성하는 분들이 있는 것 같다.
수 조작하기 2
문제 설명
정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.
"w" : 수에 1을 더한다.
"s" : 수에 1을 뺀다.
"d" : 수에 10을 더한다.
"a" : 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.
주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.
제한사항
2 ≤ log의 길이 ≤ 100,000
-100,000 ≤ log[0] ≤ 100,000
1 ≤ i ≤ log의 길이인 모든 i에 대해 |log[i] - log[i - 1]|의 값은 1 또는 10입니다.
입출력 예
log result
[0, 1, 0, 10, 0, 1, 0, 10, 0, -1, -2, -1] "wsdawsdassw"
입출력 예 설명
입출력 예 #1
result인 "wsdawsdassw"를 따라 log[0]에서부터 시작해 조작을 하면 log의 값과 순서대로 일치합니다. 따라서 "wsdawsdassw"를 return 합니다.
Hint
"수 조작하기 1" 문제의 n값이 log[0]에 해당하며, 이 문제에서 주어진 log에 따라 "수 조작하기 1" 문제의 control을 구하는 문제라고 이해할 수 있습니다.
입출력 예 #1은 "수 조작하기 1" 문제의 입출력 예 #1과 같은 예시이므로 참고하시기 바랍니다.
내 풀이
def solution(numLog):
answer = ''
for i in range(1, len(numLog)):
min = numLog[i] - numLog[i-1]
if min == 1:
answer += 'w'
elif min == -1:
answer += 's'
elif min == 10:
answer += 'd'
elif min == -10:
answer += 'a'
return answer
다른 풀이
def solution(log):
res=''
joystick=dict(zip([1,-1,10,-10],['w','s','d','a']))
for i in range(1,len(log)):
res+=joystick[log[i]-log[i-1]]
return res
해당 문제는 지문을 제대로 읽지 않아서 생각보다 오래 걸렸던 것 같다..
수열과 구간 쿼리 3
문제 설명
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.
각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
제한사항
1 ≤ arr의 길이 ≤ 1,000
0 ≤ arr의 원소 ≤ 1,000,000
1 ≤ queries의 길이 ≤ 1,000
0 ≤ i < j < arr의 길이
입출력 예
arr queries result
[0, 1, 2, 3, 4] [[0, 3],[1, 2],[1, 4]] [3, 4, 1, 0, 2]
입출력 예 설명
입출력 예 #1
각 쿼리에 따라 arr가 다음과 같이 변합니다.
arr
[0, 1, 2, 3, 4]
[3, 1, 2, 0, 4]
[3, 2, 1, 0, 4]
[3, 4, 1, 0, 2]
따라서 [3, 4, 1, 0, 2]를 return 합니다.
내 풀이
def solution(arr, queries):
for query in queries:
temp = arr[query[0]]
arr[query[0]] = arr[query[1]]
arr[query[1]] = temp
return arr
다른 풀이
def solution(arr, queries):
for a,b in queries:
arr[a],arr[b]=arr[b],arr[a]
return arr
위 코드를 보고 현타가 잠시 왔던 것 같다... 이런 방법도 있구나
수열과 구간 쿼리 2
문제 설명
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.
제한사항
1 ≤ arr의 길이 ≤ 1,000
0 ≤ arr의 원소 ≤ 1,000,000
1 ≤ queries의 길이 ≤ 1,000
0 ≤ s ≤ e < arr의 길이
0 ≤ k ≤ 1,000,000
입출력 예
arr queries result
[0, 1, 2, 4, 3] [[0, 4, 2],[0, 3, 2],[0, 2, 2]] [3, 4, -1]
입출력 예 설명
입출력 예 #1
첫 번째 쿼리의 범위에는 0, 1, 2, 4, 3이 있으며 이 중 2보다 크면서 가장 작은 값은 3입니다.
두 번째 쿼리의 범위에는 0, 1, 2, 4가 있으며 이 중 2보다 크면서 가장 작은 값은 4입니다.
세 번째 쿼리의 범위에는 0, 1, 2가 있으며 여기에는 2보다 큰 값이 없습니다.
따라서 [3, 4, -1]을 return 합니다.
내 풀이
def solution(arr, queries):
answer = []
for query in queries:
arrValue = [x for x in arr[query[0]:query[1]+1] if x > query[2]]
if not arrValue:
answer.append(-1)
else:
answer.append(min(arrValue))
return answer
이것도 arrValue에 넣는 저 문법을 몰라서 if 문으로 어떻게든 하려고 끙끙대다가
python 문법을 한번 더 보고서야 최대한 간단하게 처리할 수 있었다...
다른 풀이
def solution(arr, queries):
return list(map(lambda x: -1 if x==10**6 else x, [min(list(filter(lambda x: x > k, arr[s:e+1])) + [10**6]) for s, e, k in queries]))
정말... 다들 생각을 비슷비슷하게 하지만 유독 유니크한 분들도 계신 것 같다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
코딩 기초 트레이닝 6 (2) | 2023.09.03 |
---|---|
코딩 기초 트레이닝 5 (0) | 2023.08.04 |
코딩 기초 트레이닝 3 (0) | 2023.07.26 |
코딩 기초 트레이닝 2 (0) | 2023.07.25 |
코딩 기초 트레이닝 1 (0) | 2023.07.24 |