코딩 기초 트레이닝에 있는 배열 문제를 정리해봤다.
https://school.programmers.co.kr/learn/courses/30/lessons/181861
sol1
def solution(arr):
answer = []
# 입력된 숫자는 크기만큼 곱하기..?
for i in arr:
num = i
while(num):
answer.append(i)
num -= 1
return answer
sol2
def solution(arr):
answer = []
for i in arr:
for j in range(i):
answer.append(i)
return answer
sol3
def solution(arr):
return [i for i in arr for _ in range(i)]
https://school.programmers.co.kr/learn/courses/30/lessons/181879
sol1
def solution(num_list):
answer = 0 # 길이가 11이상이면 합 // 길이가 10이하이면 곱
num = len(num_list)
if num >= 11:
for i in num_list:
answer += i
else:
answer = 1
for i in num_list:
answer *= i
return answer
sol2
def solution(num_list):
lennum = len(num_list)
answer = 0
if lennum >= 11:
answer = sum(num_list)
else:
answer =1
for i in num_list:
answer *= i
return answer
sol1
def solution(my_strings, parts):
answer = ''
for i in range(len(my_strings)):
n , m = parts[i][0], parts[i][1]
result = ''.join(my_strings[i][n:m+1])
## result = (my_strings[i][n:m+1]) 해도 됨
answer += result
return answer
sol2
def solution(my_strings, parts):
answer = ""
for i in range(len(parts)):
string = my_strings[i]
p = parts[i]
answer += str(string[p[0]:p[1]+1])
return answer
sol3
def solution(my_strings, parts):
return ''.join(s[n:m+1] for s, (n, m) in zip(my_strings, parts))
슬라이싱 결과는 이미 문자열
zip ()을 이용해서 두 리스트를 함께 순회하는 방법도 있다.
문자열파트에 있는건데 또 틀렸다.
def solution(myString):
result = myString.rstrip('x')
result = result.lstrip('x')
result = result.split('x')
result.sort()
return result
if i 이 부분이 중요!! 빈문자 거르기 def solution(myString):
result = [i for i in myString.split('x') if i]
result.sort()
return result
def solution(board, k):
answer = 0
for i in board:
for j in i:
if j <= k:
answer += j
return answer
def solution(board, k):
answer = 0
for i in range(len(board)):
for j in range(len(board[i])):
if i+j <= k :
answer += board[i][j]
return answer
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
[
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]
]
shape 은 (3,3)
def solution(n):
answer = []
# 1. for문으로 n개만큼의 list를 담는다.
# 2. i == j 일때 1 나머지는 0
for i in range(n):
result = []
for j in range(n):
if i == j:
result.append(1)
else:
result.append(0)
answer.append(result)
return answer
def solution(arr):
answer = 1
for i in range(len(arr)): #4
for j in range(len(arr[i])) : #4
if arr[i][j] != arr[j][i]:
answer =0
return answer

shape = (4,3)
len(arr)이라고 하니까, 2차원배열 안에 있는 1차원 배열의 개수가 출력되었다.
len(arr[i]) 로 하니까 3이 출력됨.
def solution(arr, flag):
answer = [] # true면 뒤에 arr[i]를 arr[i]*2번 추가.
# false면 arr[i]개 삭제
for i in range(len(flag)):
if flag[i]== True:
for j in range(arr[i]):
answer.append(arr[i])
answer.append(arr[i])
else:
for j in range(arr[i]):
answer.pop()
return answer

def solution(arr, queries):
#queries 안에 있는 s <= i <= e 에 값들을 +1 하자.
for i in queries:
n,m = queries[i]
for j in range(n,m+1):
arr[j] = arr[j]+1
return arr
틀린 이유 :
- for i in queries:
n,m = queries[i] // i 는 queries의 요소가 된다.
i는 (n,m)로 이뤄져있는데 이걸 또 인덱스로 접근하니까 문제- 그냥 for n,m in queries:라고 하면. 된다.
sol1
def solution(arr, queries):
#queries 안에 있는 s <= i <= e 에 값들을 +1 하자.
for n,m in queries:
for j in range(n,m+1):
arr[j] = arr[j]+1
return arr
sol2
def solution(arr, queries):
answer = [] # queries 구간에 있는 값에 +1
for i in queries:
a = i[0]
b = i[1]
for j in range(a,b+1):
arr[j] += 1
return arr

def solution(my_string, indices):
# indices에 해당하는 원소 지우고 이어붙이기!!
indices.sort()
for i in indices:
my_string.pop(i)
return my_string
sol1 # list 변환해서 pop
def solution(my_string, indices):
my_string = list(my_string)
indices.sort(reverse=True) # 뒤에서부터 pop()해야 인덱스 밀림 방지
for i in indices:
my_string.pop(i)
return ''.join(my_string)
sol2 # 새로운 문자열 만들기
def solution(my_string, indices):
return ''.join([ch for idx, ch in enumerate(my_string) if idx not in indices])
sol1
sol2
find와rfind
- find 문자열 왼쪽부터 검색해서 처음등장하는 인덱스 반환
- rfind 문자열 오른쪽부터 검색해서 처음등장하는 인덱스 반환
sol1
def solution(myString, pat):
answer = ''
myString = myString[::-1]
pat = pat[::-1] # 거꾸로 만들어서 find하기
pat_index = myString.find(pat)
answer = myString[pat_index:]
answer = answer[::-1]
return answer
sol2
def solution(num_list):
answer = 0
# 짝수면 반 나누고 홀수면 1 빼고 반 나누기
#모든 원소를 1로 만들기위한 연산횟수 구하기
a= 1
for i in num_list:
while(a):
if i == 1:
a=False
else:
if i % 2 == 0:
answer += 1
i = i//2
else:
answer += 1
i = i-1
i = i//2
return answer
def solution(num_list):
answer = 0
# 짝수면 반 나누고 홀수면 1 빼고 반 나누기
#모든 원소를 1로 만들기위한 연산횟수 구하기
for i in num_list:
while i > 1:
if i % 2 == 0:
answer += 1
i = i//2
else:
answer += 1
i = i-1
i = i//2
return answer
오답 원인: a=1(True)라는 값이 for문 밖에있다. (변수초기화 ❌)
즉 초기화를 시켜 다음 i 로 넘어가야 하는데 첫번째 계산만 하고 넘어간 것.
cf.또, 굳이 a라는 원소를 넣어서 조건을 만들 필요 없다.
그냥 i>1 인 동안 루프가 돌아가면 되는 것...
def solution(arr):
answer = []
#2로 시작해서 2로 끝나기
#idea : 2가 있는 Index를 찾기
# 1) arr에 2가 없는 경우 -1 리턴
for i in arr:
if i==2:
a = True
break
else:
a = False
# 2) 조건에 따라 answer반환
if a == False:
answer.append(-1)
else:
start = arr.index(2)
end = arr[::-1].index(2)
answer = arr[start:len(arr)-end]
return answer
find() -> 문자열 / 없으면 -1 반환
index() -> sequence 자료형 / 없으면 valueError
def solution(arr, query):
answer = []
# 짝수 인덱스 : arr에서 query[i] 뒤부터 인덱스 부분 잘라서 버리기
# 홀수 인덱스 : arr에서 query[i] 앞부분 잘라서 버리기
for idx, i in enumerate(query):
if idx % 2 ==0:
arr = arr[:i+1]
else:
arr = arr[i:]
return arr