[코딩 기초 트레이닝] Day11 리스트(배열)
🔪문자 개수 세기
문제 설명
알파벳 대소문자로만 이루어진 문자열 my_string
이 주어질 때, my_string
에서 ‘A’의 개수, my_string
에서 ‘B’의 개수,…, my_string
에서 ‘Z’의 개수, my_string
에서 ‘a’의 개수, my_string
에서 ‘b’의 개수,…, my_string
에서 ‘z’의 개수를 순서대로 담은 길이 52의 정수 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤
my_string
의 길이 ≤ 1,000
solution
def solution(my_string):
answer=[0]*52
for x in my_string:
if x.isupper():
answer[ord(x)-65]+=1
else:
answer[ord(x)-71]+=1
return answer
입출력 예
my_string | result |
---|---|
“Programmers” | [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0] |
이 문제는 틀렸습니다. 그래서 제 것으로 만들기 위해 하나하나 뜯어보고 사용된 개념을 정리하면서 공부하고 반복해서 풀어 볼 겁니다.
def solution(my_string):
answer=[0]*52
for x in my_string:
if x.isupper():
answer[ord(x)-65]+=1
else:
answer[ord(x)-71]+=1
return answer
------------------------------------
[같은 방식을 사용한 다른 풀이]
def solution(my_string):
answer = [0 for i in range(52)]
for string in my_string:
if string.isupper(): k = 65
else: k = 71
answer[ord(string)-k] += 1
return answer
우선 리스트의 곱에 대해서 보겠습니다.
answer = [0] * 52
예를 들어서 단순한 리스트 하나를 만들어 보겠습니다.
a = [1,2,3]
print(a*3)
여기서 출력해보면 결과는 아래와 같습니다.
[123, 123, 123]
이를 통해 리스트에 곱을 하면 원소의 값에 곱을 하는것이 아니라 원소의 개수에 곱하기 되는 것을 알 수 있습니다.
알파벳의 개수는26개 입니다. answer는 대문자와 소문자 모두 출력해야하기 때문에 26*2=52 입니다.
그렇기 때문에 answer=[0]*52
은 0으로 구성된 원소 개수가 52인 answer라는 리스트가 생성된다는 것을 알 수 있습니다.
조건문으로 가보겠습니다.
for x in my_string:
if x.isupper():
answer[ord(x)-65]+=1
else:
answer[ord(x)-71]+=1
문자열 my_string을 차례대로 가져오는 x가 대문자라면 리스트answer에 [ord(x)-65]번째에 1을 더해줍니다. ord(문자)는 하나의 문자를 인자로 받고 해당 문자에 해당하는 아스키코드 정수를 반환합니다.
ord('a')를 넣으면 정수97을 반환합니다.
대문자는 65부터 90까지 입니다.
ord(x)-65 += 1
이라면 들어온 수가 P일때 P의 아스키코드 번호는 80이고, 80-65는 15입니다. answer에 인덱스가 15인 값에 +1을 해주는 겁니다.
소문자는 97부터122 까지 입니다.
ord(x)- 71 += 1
이라면 r을 예로 들었을때, 114-71 = 41입니다. 대문자와 같이 인덱스가 41인 값에 1을 더해주는 겁니다.
ord(문자)
하나의 정수를 인자로 받고 해당 정수에 해당하는 아스키코드 문자를 반환합니다.
chr(정수)
하나의 정수를 인자로 받고 해당 정수에 해당하는 아스키코드 문자를 반환합니다.
인자(정수)의 유효 범위는 0 ~ 1,114,111(16진수 0x10 FFFF)까지 입니다.
chr(97)을 하면 문자 'a'를 반환합니다.
아스키코드에는 영어만 존재합니다. 그래서 등장한 것이 유니코드(Unicode)입니다.
배열 만들기
문제 설명
정수 n
과 k
가 주어졌을 때, 1 이상 n
이하의 정수 중에서 k
의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
제한사항
- 1 ≤
n
≤ 1,000,000 - 1 ≤
k
≤ min(1,000, n)
solution
def solution(n, k):
a = []
for i in range(1, n+1):
if i % k == 0:
a.append(i)
return a
------------------------------
[다른 풀이]
def solution(n, k):
return [i for i in range(k,n+1,k)]
입출력 예
n | k | result |
---|---|---|
10 | 3 | [3, 6, 9] |
15 | 5 | [5, 10, 15] |
글자 지우기
문제 설명
문자열 my_string
과 정수 배열 indices
가 주어질 때, my_string
에서 indices
의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤
indices
의 길이 <my_string
의 길이 ≤ 100 my_string
은 영소문자로만 이루어져 있습니다- 0 ≤
indices
의 원소 <my_string
의 길이 indices
의 원소는 모두 서로 다릅니다.
solution
def solution(my_string, indices):
new = ''
for i in range(len(my_string)):
if i not in indices:
new += my_string[i]
return new
입출력 예
my_string | indices | result |
---|---|---|
“apporoograpemmemprs” | [1, 16, 6, 15, 0, 10, 11, 3] | “programmers” |
카운트 다운
문제 설명
정수 start_num
와 end_num
가 주어질 때, start_num
에서 end_num
까지 1씩 감소하는 수들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤
end_num
≤start_num
≤ 50
solution
def solution(start, end_num):
answer=[]
for i in range(start, end_num-1,-1):
answer.append(i)
return answer
----------------------------------
다른 풀이
def solution(start, end):
return list(range(start,end-1,-1))
입출력 예
start_num | end_num | result |
---|---|---|
10 | 3 | [10, 9, 8, 7, 6, 5, 4, 3] |
가까운 1 찾기
문제 설명
정수 배열 arr
가 주어집니다. 이때 arr
의 원소는 1 또는 0입니다. 정수 idx
가 주어졌을 때, idx
보다 크거나 같으면서 배열의 값이 1인 가장 작은 인덱스를 찾아서 반환하는 solution 함수를 완성해 주세요.
단, 만약 그러한 인덱스가 없다면 -1을 반환합니다.
solution
def solution(arr, idx):
for i in range(len(arr)):
if i >= idx and arr[i] == 1 :
return i
if i < idx or arr[i] != 1:
return -1
-----------------------------------
다른 풀이
def solution(arr, idx):
for i in range(idx, len(arr)):
if arr[i] == 1:
return i
return -1
------------------------------------
def solution(arr, idx):
answer = 0
try:
answer = arr.index(1, idx)
except:
answer = -1
return answer
제한사항
- 3 ≤
arr
의 길이 ≤ 100’000arr
의 원소는 전부 1 또는 0입니다.
입출력 예
arr | idx | result |
---|---|---|
[0, 0, 0, 1] | 1 | 3 |
[1, 0, 0, 1, 0, 0] | 4 | -1 |
[1, 1, 1, 1, 0] | 3 | 3 |
입출력 예 3번에서 실행 실패했는데, 처음에 주어진 조건문을 읽어보면 idx보다 크거나 라고 되어있습니다. 그렇게 되면 3번 테스트케이스는 -1이 출력되어야하는데 result가 3으로 나와있습니다.
댓글남기기