[프로그래머스][Python][Lv0] 코딩 기초 트레이닝 (3)
이어서 진행
1. 배열 만들기2
정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.
def solution(l, r):
answer = []
for num in range(l, r + 1):
if not set(str(num)) - set(['0', '5']):
answer.append(num)
return answer if answer else [-1]
💡set()
파이썬의 내장함수로 집합을 선언한다.
for num in range(l, r + 1):
if not set(str(num)) - set(['0', '5']):
answer.append(num)
범위 내에서 모든 집합을 만든 다음, '0'과 '5'가 들어가지 않는 경우를 제외한 후 리스트에 추가한다.
2. 수열과 구간 쿼리2
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.
def solution(arr, queries):
answer = []
tmp = []
for s, e, k in queries:
tmp = list(filter(lambda x: x > k, sorted(arr[s:e+1])))
if len(tmp) > 0:
answer.append(tmp[0])
else:
answer.append(-1)
return answer
💡filter()
여러 개의 데이터로부터 일부 데이터만 추려낼 때 사용
for s, e, k in queries:
tmp = list(filter(lambda x: x > k, sorted(arr[s:e+1])))
s부터 e까지의 리스트 중 k보다 큰 리스트만 추려낸다.
sorted로 오름차순 정렬을 했기 때문에, 추려낸 리스트의 첫번째가 가장 작은 arr[i] 값이 된다.
3. 코드 처리하기
문자열 code가 주어집니다.code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.
mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.
✔mode가 0일 때
code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.
✔mode가 1일 때
code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.
문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.
단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.
def solution(code):
mode = False
ret = ''
for index, char in enumerate(code):
if char == '1': mode = not mode
else: ret += char if index%2 == int(mode) else ''
return ret if len(ret) else 'EMPTY'
mode = False
for index, char in enumerate(code):
if char == '1': mode = not mode
mode가 0일 경우는 False, mode가 1일 경우는 True로 둔다.
else: ret += char if index%2 == int(mode) else ''
mode0일땐 idx가 짝수인 경우, mode1일땐 idx가 홀수인 경우만 추가하는데
int(False)가 0이고 int(True)가 1이기 때문에 각 모드에 맞춰 짝수랑, 홀수인 경우가 추가된다.
return ret if len(ret) else 'EMPTY'
조건에 맞에 ret에 값이 있으면 ret을 리턴하고 빈 문자열이면 'EMPTY'를 리턴한다.
아래는 다른 사람의 풀이
def solution(code):
return "".join(code.split("1"))[::2] or "EMPTY"
[::2] 는 문자열에서 한 칸씩 띄워져서 문자열이 생성된다.
즉, 1을 기준으로 문자열을 분리한 후 한칸씩 띄운 후 합친다.
4. 전국 대회 선발 고사
0번부터 n - 1번까지 n명의 학생 중 3명을 선발하는 전국 대회 선발 고사를 보았습니다.
등수가 높은 3명을 선발해야 하지만, 개인 사정으로 전국 대회에 참여하지 못하는 학생들이 있어 참여가 가능한 학생 중 등수가 높은 3명을 선발하기로 했습니다.
각 학생들의 선발 고사 등수를 담은 정수 배열 rank와 전국 대회 참여 가능 여부가 담긴 boolean 배열 attendance가 매개변수로 주어집니다.
전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번이라고 할 때 10000 × a + 100 × b + c를 return 하는 solution 함수를 작성해 주세요.
def solution(rank, attendance):
dic = dict(zip(rank, attendance))
lst = sorted([[idx, k] for idx, (k, v) in enumerate(dic.items()) if v == True], key=lambda x : x[1])
return 10000 * lst[0][0] + 100 * lst[1][0] + lst[2][0]
dic = dict(zip(rank, attendance))
먼저 key: value (dictionary) 형태로 rank와 attendance를 묶는다.
lst = sorted([[idx, k] for idx, (k, v) in enumerate(dic.items()) if v == True], key=lambda x : x[1])
enumerate로 딕셔너리의 idx와 key, value값을 순회하면서 value(attendance)값이 True인 idx와 key(rank)값을
리스트 컴프리헨션으로 이중리스트로 초기화한다.
그 후 sorted를 사용해 key(rank) 값을 기준으로 오름차순 정렬한다.
return 10000 * lst[0][0] + 100 * lst[1][0] + lst[2][0]
이중 리스트의 idx값으로 연산을 한다.
5. 무작위로 K개의 수 뽑기
랜덤으로 서로 다른 k개의 수를 저장한 배열을 만드려고 합니다. 적절한 방법이 떠오르지 않기 때문에 일정한 범위 내에서 무작위로 수를 뽑은 후, 지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식으로 만들기로 합니다.
이미 어떤 수가 무작위로 주어질지 알고 있다고 가정하고, 실제 만들어질 길이 k의 배열을 예상해봅시다.
정수 배열 arr가 주어집니다. 문제에서의 무작위의 수는 arr에 저장된 순서대로 주어질 예정이라고 했을 때, 완성될 배열을 return 하는 solution 함수를 완성해 주세요.
단, 완성될 배열의 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 return 합니다.
def solution(arr, k):
lst = []
for i in arr:
if i not in lst:
lst.append(i)
if len(lst) >= k:
return lst[:k]
elif len(lst) < k:
while len(lst) < k:
lst.append(-1)
return lst
lst = []
for i in arr:
if i not in lst:
lst.append(i)
새로운 빈 리스트를 초기화 한 후 for문을 통해 리스트의 중복을 제거한다.
⚠ set을 사용해서 중복 제거를 하면, 리스트가 정렬되기때문에 의도한 결과와 다르게 나올 수도 있다.
if len(lst) >= k:
return lst[:k]
elif len(lst) < k:
while len(lst) < k:
lst.append(-1)
return lst
그 후 리스트의 길이가 k보다 크거나 같으면 lst[:k] 까지 슬라이싱 한 후 리스트를 반환한다.
리스트의 길이가 k보다 작으면 k만큼 리스트에 -1를 추가한 후 리스트를 반환한다.
6. 정사각형으로 만들기
이차원 정수 배열 arr이 매개변수로 주어집니다.
arr의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
def solution(arr):
if len(arr) == len(arr[0]):
return arr
elif len(arr) > len(arr[0]):
while len(arr) > len(arr[0]):
for i in range(len(arr)):
arr[i].append(0)
return arr
elif len(arr) < len(arr[0]):
while len(arr) < len(arr[0]):
arr.append([0*i for i in range(len(arr[0]))])
return arr
이차원 리스트에서 len(arr)는 행의 개수 len(arr[0])은 열의 개수다.
elif len(arr) > len(arr[0]):
while len(arr) > len(arr[0]):
for i in range(len(arr)):
arr[i].append(0)
return arr
행의 수가 더 많은 경우, 열의 수와 같아지도록 행의 끝에 0 을 추가한다.
elif len(arr) < len(arr[0]):
while len(arr) < len(arr[0]):
arr.append([0*i for i in range(len(arr[0]))])
return arr
열의 수가 더 많은 경우, 각 열의 끝에 행의 수만큼 0으로 이루어진 리스트를 추가한다.
아래는 다른 사람의 풀이
def solution(arr):
n=len(arr)
m=len(arr[0])
if n>m:
for i in range(n):
for j in range(n-m):
arr[i].append(0)
else:
for i in range(m-n):
arr.append([0]*m)
return arr
행의 수와 열의 수를 비교하여 range로 추가한게 훨씬 깔끔해보인다.
참고 : https://morningcoding.tistory.com/entry/Python-41-2
7. 그림 확대
직사각형 형태의 그림 파일이 있고, 이 그림 파일은 1 × 1 크기의 정사각형 크기의 픽셀로 이루어져 있습니다. 이 그림 파일을 나타낸 문자열 배열 picture과 정수 k가 매개변수로 주어질 때, 이 그림 파일을 가로 세로로
k배 늘린 그림 파일을 나타내도록 문자열 배열을 return 하는 solution 함수를 작성해 주세요.
def solution(picture, k):
answer = []
for i in picture:
char = ""
for j in i:
char += j*k
for count in range(k):
answer.append(char)
return answer
picture 리스트의 각 문자열을 i에 저장 후 빈 문자열 char를 생성한다.
그 후에 문자열의 요소를 j에 저장 후 k만큼 곱한다음에 빈문자열 char에 더한다.
for i in picture:
char = ""
for j in i:
char += j*k
k의 범위만큼 빈리스트 answer에 char를 더한다.
for count in range(k):
answer.append(char)
return answer
결과값
['..xxxx......xxxx..',
'..xxxx......xxxx..',
'xx....xx..xx....xx',
'xx....xx..xx....xx',
'xx......xx......xx',
'xx......xx......xx',
'..xx..........xx..',
'..xx..........xx..',
'....xx......xx....',
'....xx......xx....',
'......xx..xx......',
'......xx..xx......',
'........xx........',
'........xx........']
8. 주사위게임3
1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.
네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.
주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
def solution(a, b, c, d):
nums = [a, b, c, d]
counts = [nums.count(i) for i in nums]
if max(counts) == 4:
return a * 1111
elif max(counts) == 3:
p = nums[counts.index(3)]
q = nums[counts.index(1)]
return (10 * p + q) ** 2
elif max(counts) == 2:
if min(counts) == 2:
return (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b)
else:
p = nums[counts.index(2)]
return (a * b * c * d) / p**2
else:
return min(nums)
네 주사위를 굴렸을 때 나온 숫자 a, b, c, d를 리스트로 정의한 후
nums.count() 함수를 통해 nums에 속해있는 숫자의 개수가 몇개인지 센 후 counts라는 변수에 저장한다.
counts리스트의 max수가 4면 같은 숫자가 4개라는 말이므로, 문제의 조건대로 a * 1111 를 반환한다.
nums = [a, b, c, d]
counts = [nums.count(i) for i in nums]
if max(counts) == 4:
return a * 1111
counts의 max가 3이면 같은 숫자가 3개라는 말이므로, count.index(3)으로 숫자가 3인곳의 인덱스 위치를 찾은 후 p에 저장한다.
다른 하나의 숫자의 인덱스 위치를 찾아 q에 저장한다. 그 후 조건식을 반환한다.
elif max(counts) == 3:
p = nums[counts.index(3)]
q = nums[counts.index(1)]
return (10 * p + q) ** 2
두개의 숫자가 같은 경우엔, 2개씩 같은 경우와 2개가 같고 나머지가 다른 경우를 나누어 계산한다.
✔2개씩 같은 경우
a와 b가 같다면 a와 c를 연산한 경우를 반환하고, a와 b가 다르면 a와 b를 연산한 경우를 반환한다.
elif max(counts) == 2:
if min(counts) == 2:
return (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b)
✔2개가 같고 나머지가 다른 경우
같은 수를 p에 저장한 후, 제곱하여 a*b*c*d의 값에서 나누면,
서로 다른 두개의 값의 곱을 알 수 있다.
else:
p = nums[counts.index(2)]
return (a * b * c * d) / p**2
모두 다르면 가장 작은 숫자를 반환한다.
else:
return min(nums)
'🧾 Codetest > 프로그래머스' 카테고리의 다른 글
[프로그래머스][Python][Lv0] 코딩테스트 입문 (2) (0) | 2023.09.04 |
---|---|
[프로그래머스][Python][Lv0] 코딩테스트 입문 (1) (0) | 2023.09.02 |
[프로그래머스][Python][Lv0] 코딩 기초 트레이닝 (2) (0) | 2023.08.20 |
[프로그래머스][Python][Lv0] 코딩 기초 트레이닝 (1) (0) | 2023.07.27 |
[SQL] 코딩 테스트 연습 (3) (0) | 2023.06.26 |