행동대장
1. 뭔가.. 주어진 숫자만큼 값을 맞춰야되면 일단 정렬을 하자!, 뭔 소린지 모르겠으면 아래 7번 보셈
1. k번째 수

나의 풀이
def solution(array, commands):
answer = []
for i in commands:
sort_array = []
# 문제 1: append를 쓰면 [[5, 2, 6, 3]] 처럼 리스트 안에 리스트가 들어가요.
sort_array.append(array[i[0]:i[1]])
# 문제 2: 리스트 안에 리스트가 하나뿐이라 sort()를 해도 아무 변화가 없어요.
sort_array.sort()
# 문제 3: i[2]는 '번째' 숫자인데 인덱스는 0부터 시작하므로 범위를 벗어날 수 있어요.
answer.append(sort_array[i[2]])
return answer
오답: 리스트를 새로 안 만들어도 됨. 그냥 변수 하나 선언하고 그 안에 리스트 넣으면 됨
새로운 풀이
def solution(array, commands):
answer = []
for i in commands:
sort_array = array[i[0]-1:i[1]]
sort_array.sort()
answer.append(sort_array[i[2]-1])
return answer
주의할 점: -1을 꼭 해줘야됨!!!! 리스트는 인덱스를 조심해..
다른 풀이
def solution(array, commands):
answer = []
for command in commands:
i,j,k = command
answer.append(list(sorted(array[i-1:j]))[k-1])
return answer
command 안에 있는 값 하나씩 변수로 읽어올 수 있음..
2. 숫자 문자열과 영단어

풀이
def solution(s):
data = {
"zero" : 0,
"one" : 1,
"two" : 2,
"three" : 3,
"four" : 4,
"five" : 5,
"six" : 6,
"seven" : 7,
"eight" : 8,
"nine" : 9
}
answer, string = '', ''
for i in s:
if i.isdigit():
answer += str(i)
else:
string += i
if (string in data) :
answer += str(data[string])
string=''
return int(answer)
저렇게 하나하나씩 매칭?해주는 것을 '딕셔너리'라고 함!
쓸거면 왼쪽값으로 써줘야함 안 그러면 에러 ex)data[zero]
문자열에 숫자 더하는건 안 됨!!! 쓸거면 str로 형변환하고 써줘야함
replace 함수
text = "Hello World, Hello Python!"
new_text = text.replace("Hello", "Good", 1)
print(new_text) # 출력: "Good World, Hello Python!"
Hello를 Good으로 1번 바꾼다, 세 번째 인자는 안 써도 됨. 안 쓰면 다 바뀜
다른 풀이
def solution(s):
words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
for i in range(len(words)):
s = s.replace(words[i], str(i))
return int(s)
어떻게 이런 생각을..
3. 푸드 파이트 대회

풀이
def solution(food):
answer = ""
for i in range(1, len(food)):
if food[i] % 2 == 0 or food[i] % 2 == 1:
answer += str(i) * (food[i] // 2)
elif food[i] == 1:
continue;
new_answer = answer + "0" + answer[::-1]
return new_answer
ㅂㄹ 어렵진 않다.. 새롭게 알게 된 사실은 문자열에 [::-1]을 하면 뒤집어진다는 것!
[::숫자]가 간격이라서 마지막부터 1간격으로 계속 더해주면 됨
4. 문자열 내 마음대로 정렬하기

풀이
def solution(strings, n):
s=[]
answer = []
strings.sort()
for i in strings:
s.append(i[n]) # ["u", "e", "a"]
s.sort() # ["a", "e", "u"]
# strings의 n번째가 s와 같다면 추가
for i in s:
for j in strings:
if j[n] == i and j not in answer:
answer.append(j)
return answer
미리 strings를 정렬하기. 왜냐하면 같은 값이면 또 정렬하기 귀찮으니까.. 미리 정렬해놓기
s의 순서를 따라야하기 때문에 s를 위에 놓는다!
5. 추억 점수
문제
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
너무 길어서.. 대충 이거로..
풀이
def solution(name, yearning, photo):
data=dict(zip(name, yearning)) # { "may" : 5, "kein" : 10 ... }
answer = []
for i in photo:
sum = 0
for j in i:
sum += data.get(j, 0)
answer.append(sum)
return answer
dict: 딕셔너리로 만들어 줌, 두 쌍을 넣으면 됨.. zip는 name과 yearning을 튜플로 묶은 것
data.get(j, 0): dict 함수로 key 값이 없으면 0을 반환
6. 같은 숫자는 싫어
문제

풀이
def solution(arr):
new = []
for i in arr:
if len(new) == 0 or new[-1] != i:
new.append(i)
return new
연속된 것 중 하나 제거, 순서대로 순회 -> 바로 스택 사용하기
스택은 맨 끝의 원소가 어떠냐에 따라 뺄지 말지 정하기 때문에 s[-1]처럼 맨 끝 배열을 잘 사용하면 좋다
7. 예산
문제 너무 길어서 링크로 대체..
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
def solution(d, budget):
answer = 0
moneysum = 0
d.sort() # [1, 2, 3, 4, 5]
for i in d:
moneysum += i
if moneysum > budget: # ex) 10 됨..
break;
else:
answer += 1
return answer
최소 숫자 기준을 맞추는 문제가 나오면 일단 정렬을 하
8. 최소공배수, 최대공약수
문제

풀이
def solution(n, m):
minvalue=[]
answer = []
for i in range(1, min(n, m)+1):
if n % i == 0 and m % i == 0:
minvalue.append(i)
answer.append(max(minvalue))
answer.append(answer[0] * (n//answer[0]) * (m//answer[0]))
return answer
min, max 함수를 잘 사용하자!
최대공약수는 제일 작은 애가 될 수 있으니까 범위를 제일 작은 애로 정하고 돌아
유클리드 호제법..? 몰라용...
9. 삼총사
문제

나의 풀이
# 일단 두 수를 더하고 그 합이 배열에 포함돼있는지 확인하기
def solution(number):
answer = 0
two_sum = 0
for i in range(len(number)-1):
for j in range(i+1, len(number)):
two_sum=(number[i] + number[j])
if -(two_sum) in number:
answer += 1
return answer
나는 일단 두 수를 더하고 그 수의 음수값이 있는지 확인하고 있으면 +1을 해주는거였는데..
문제점이 내가 앞에서 이미 사용한 숫자?도 확인하기 때문에 카운트가 +1 된다.
그래서 중복계산이 돼서 수가 커지는 거였음..
정답
# 일단 두 수를 더하고 그 합이 배열에 포함돼있는지 확인하기
def solution(number):
answer = 0
two_sum = 0
for i in range(len(number)-1):
for j in range(i+1, len(number)):
two_sum=(number[i] + number[j])
target=-two_sum
answer += number[j + 1:].count(target)
return answer
내가 이미 사용한 앞 말고 뒤쪽 배열에서만 값이 있는지 확인해야함.
그래서 j 다음값부터 따져야하기 때문에 number[j + 1:]이라고 쓴 것임.
또 number[j+1:]가 '있다' 라고만 하면 안 됨. 왜냐하면 개수를 세는 것이기 때문에 count 함수를 써야함
만약에 [-1, -2, 0, 3, 3]이 있다고 하자 그럼 target은 3이 되는데 in을 쓰면 3이 있긴하니까 1만 더해짐.
하지만 count를 쓰면 개수를 나타내는 것이니까 2가 더해질 것임
다른 풀이
def solution(number):
answer=0
for i in range(len(number)):
for j in range(i+1, len(number)):
for k in range(j+1, len(number)):
if number[i] + number[j] + number[k] == 0:
answer +=1
return answer
그냥 완전 직관적인 풀이
다른 풀이
def solution (number) :
from itertools import combinations
cnt = 0
for i in combinations(number,3) :
if sum(i) == 0 :
cnt += 1
return cnt
combinations(배열, 뽑을 숫자)를 사용해서 합이 0이면 +1..
근데 쓸거면 from itertools import combinations 이거 선언해야 하는듯?
10. 가장 가까운 글자
계속 시도했지만 못 풀었다.. 그래서 일단 제미니의 힘을 빌림.. 근데 저 방법은 생각도 못한 것이긴 했다!
문제

풀이
def solution(s):
answer = []
last_seen = {}
for i in range(len(s)):
char = s[i]
if char not in last_seen:
answer.append(-1)
else:
answer.append(i - last_seen[char])
last_seen[char] = i
return answer
last_seen 이라는 이름의 '딕셔너리'를 선언한다.
왜 딕셔너리인가? -> 어떤 문자가 몇 번 인덱스에 있는지 딱 알려줘야 하기 때문에 배열로는 한계가 있다..!
그리고 같은 문자가 들어오면 최신 인덱스로 반환해야하는데 이걸 다시 배열을 돌면서 업데이트하기 힘들기때문에..