2024년 1월에 푼 프로그래머스 코딩문제("코딩테스트 공부 목적")
본 글은 프로그래머스 코딩테스트 문제에서 푼 문제를 정리한 글입니다.
1. [Lv0] 분수의 덧셈(정답률 61%)
첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
[입출력 예]
numer1 | denom1 | numer2 | denom2 | result |
1 | 2 | 3 | 4 | [5, 4] |
9 | 2 | 1 | 3 | [29, 6] |
def solution(numer1, denom1, numer2, denom2):
i = 0
while True:
i += 1
if denom1 <= denom2:
## 최소공배수 구하기
if (denom1*i) % denom2 == 0:
n1 = (denom1*i) // denom1; n2 = (denom1*i) // denom2
## 기약분수가 아닌 경우에 대해서 고려하기
denom = []; numer = []
for l in range(1,denom1*i+1):
if denom1*i % l == 0:
denom.append(l)
for j in range(1, (numer1*n1 + numer2*n2 + 1)):
if (numer1*n1 + numer2*n2) % j == 0:
numer.append(j)
for k in numer:
if k in denom:
n = k
return [(numer1*n1+numer2*n2)/n, (denom1*i)/n]
break
elif denom1 > denom2:
## 최소공배수 구하기
if (denom2*i) % denom1 == 0:
n1 = (denom2*i) // denom1; n2 = (denom2*i) // denom2
## 기약분수가 아닌 경우에 대해서 고려하기
denom = []; numer = []
for l in range(1,denom2*i+1):
if denom2*i % l == 0:
denom.append(l)
for j in range(1, (numer1*n1 + numer2*n2 + 1)):
if (numer1*n1 + numer2*n2) % j == 0:
numer.append(j)
for k in numer:
if k in denom:
n = k
return [(numer1*n1+numer2*n2)/n, (denom2*i)/n]
break
[해설]
먼처 최소 공배수를 구하고 기약분수가 아닌 경우에 대해서 고려하였습니다.
2. [Lv0] 연속된 수의 합(정답률 62%)
연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요
[입출력 예]
num | total | result |
3 | 12 | [3,4,5] |
5 | 15 | [1,2,3,4,5] |
4 | 14 | [2,3,4,5] |
5 | 5 | [-1,0,1,2,3] |
def solution(num, total):
start = -100
while True:
start += 1
result = sum([i for i in range(start, start+num)])
if result==total:
answer = [i for i in range(start, start+num)]
return answer
break
[해설]
연속된 num 개의 정수를 더해 total 값이 될 때까지 무한루프가 되도록 만들어 주었습니다.
3. [Lv0] 다음에 올 숫자(정답률 63%)
등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.
common | result |
[1, 2, 3, 4, 5] | 5 |
[2, 4, 8] | 16 |
def solution(common):
if (common[-1]-common[-2]) == (common[-2]-common[-3]):
return common[-1] + (common[-1]-common[-2])
else:
return common[-1] * (common[-1]//common[-2])
[해설]
만약, 두 수의 차이가 같으면 등차수열, 아니면 등비수열로 판단해서 풀었습니다.
4. OX퀴즈
덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열 quiz가 매개변수로 주어집니다. 수식이 옳다면 "O"를 틀리다면 "X"를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.
quiz | result |
["3 - 4 = -3", "5 + 6 = 11"] | ["X", "O"] |
["19 - 6 = 13", "5 + 66 = 71", "5 - 15 = 63", "3 - 1 = 2" | ["O", "O","X","O"] |
▶ [제한사항]
- 연산 기호와 숫자 사이는 항상 하나의 공백이 존재합니다. 단, 음수를 표시하는 마이너스 기호와 숫자 사이에는 공백이 존재하지 않습니다.
- 연산자는 +와 - 중 하나입니다.
def solution(quiz):
answer = []
for cal in quiz:
result = cal.split()
if result[1]=="+":
if int(result[0]) + int(result[2]) == int(result[-1]):
answer.append("O")
else:
answer.append("X")
else:
if int(result[0]) - int(result[2]) == int(result[-1]):
answer.append("O")
else:
answer.append("X")
return answer
4. [Lv0] 배열 조각하기(정답률 68%)
정수 배열 arr와 query가 주어집니다.
query를 순회하면서 다음 작업을 반복합니다.
- 짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.
- 홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.
위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.
arr | query | result |
[0, 1, 2, 3, 4, 5] | [4, 1, 2] | [1, 2, 3] |
def solution(arr, query):
for i,j in enumerate(query):
if i%2==0:
arr = arr[:(j+1)]
else:
arr = arr[j:]
return arr
5. [Lv0] 최빈값 구하기(정답률 68%)
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
array | result |
[1, 2, 3, 3, 3, 4] | 3 |
[1,1,2,2] | -1 |
[1] | 1 |
def solution(array):
answer = {}
for i in array:
if i not in answer.keys():
answer[i] = 0
else:
answer[i] += 1
max_num = max(answer.values())
result = []
for j,k in answer.items():
if k==max_num:
result.append(j)
if len(result ) >= 2:
return -1
else:
return result[0]
6. [Lv0] 다항식 더하기(정답률 71%)
한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.
polynomial | result |
"3x + 7 + x" | "4x + 7" |
"x + x + x" | "3x" |
** 주의 **
- 계수 1은 생략합니다.
- 결괏값에 상수항은 마지막에 둡니다.
- 0으로 시작하는 수는 없습니다.
- 문자와 숫자 사이의 곱하기는 생략합니다.
- 항과 연산기호 사이에는 항상 공백이 존재합니다.
def solution(polynomial):
## 항과 연산기호에 공백이 존재하기 때문에 " + "를 기준으로 split
answer = polynomial.split(" + ")
num1 = 0; num2=0
for i in answer:
if "x" in i:
if len(i)==1:
num1 += 1 ## "1x"의 경우 "x"로 반환해주어야 함
else:
num1 += int(i[:-1])
else:
num2 += int(i)
if (num1 !=0) and (num2 !=0):
if (num1==1):
return "x + " + str(num2)
else:
return str(num1) + "x + " + str(num2)
elif (num1 !=0) & (num2 == 0):
if (num1 ==1 ):
return "x"
else:
return str(num1) + "x"
elif (num1 == 0) & (num2 != 0):
return str(num2)
elif (num1 == 0) & (num2 == 0):
return str(0)
7. [Lv0] 특이한 정렬(정답률 72%)
정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.
numlist | n | result |
[1, 2, 3, 4, 5, 6] | 4 | [4, 5, 3, 6, 2, 1] |
[10000,20,36,47,40,6,10,7000] | 30 | [36, 40, 20, 47, 10, 6, 7000, 10000] |
def solution(numlist, n):
numlist.sort()
dict_ = {}
for i in numlist:
if i>=n:
dict_[i-n] = i
else:
dict_[abs(i-n)+0.5] = i ## n보다 작은 숫자에 대해서는 차에 대하여 0.5씩 더해준다.
## n으로부터 거리가 같은 경우 더 큰 수가 앞에 와야하기 때문
answer = []
key = [k for k in dict_.keys()]
key.sort()
for i in key:
answer.append(dict_[i])
return answer
8. [Lv0] 배열 만들기2(정답률 72%)
정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.
l | r | result |
5 | 555 | [5, 50, 55, 500, 505, 550, 555] |
10 | 20 | [-1] |
def solution(l, r):
answer = []
for i in range(l,r+1):
boolen = 0
for k in str(i):
if k in ["0","5"]:
boolen += 1
if boolen == len(str(i)):
answer.append(i)
if answer:
return answer
else:
return [-1]
9. [Lv0] 문자열 밀기(정답률 72%)
문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
[입출력 예]
A | B | result |
"hello" | "ohell" | 1 |
"apple" | "elppa" | -1 |
"atat" | "tata" | 1 |
"abc" | "abc" | 0 |
[solution.py]
def solution(A, B):
word1 = [i for i in A]
word2 = []
for i in range(len(word1)):
word2.append(''.join(word1))
## 맨 마지막의 원소를 0번째 자리에 추가해줍니다.
word1.insert(0, word1[-1])
## 맨 마지막 원소를 삭제합니다.
del word1[-1]
answer = 0
## 모든 가능한 경우의 수가 저장된 word2를 통해 B가 몇 번째에 나오는지 answer에 저장합니다.
for i in word2:
if i==B:
break
answer += 1
## B가 되는 경우가 없는 경우는 -1을 리턴하도록 설정해줍니다.
if answer >= len(A):
return -1
else:
return answer
10. [Lv0]. 저주의 숫자 3(정답률 73%)
3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.
10진법 | 3x 마을에서 쓰는 숫자 | 10진법 | 3x 마을에서 쓰는 숫자 |
1 | 1 | 6 | 8 |
2 | 2 | 7 | 10 |
3 | 4 | 8 | 11 |
4 | 5 | 9 | 14 |
5 | 7 | 10 | 16 |
정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.
[입출력 예]
n | result |
15 | 25 |
40 | 76 |
[solution.py]
def solution(n):
answer = 0
for i in range(1,n+1):
## answer에 1씩 계속 더줍니다.
answer += 1
## 만약, answer가 3의 배수이거나 숫자 3이 존재할 경우
if answer%3==0 or "3" in str(answer):
## answer가 3의 배수나 숫자 3이 존재하지 않을 때까지 계속 1을 더해줍니다.
while answer%3==0 or "3" in str(answer):
answer += 1
return answer
11. [Lv0] 유한소수 판별하기(정답률 73%)
소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
- 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.
[입출력 예]
a | b | result |
7 | 20 | 1 |
11 | 22 | 1 |
12 | 21 | 2 |
[코드]
def solution(a, b):
## 1. a/b가 기약분수인지 확인
## a와 b의 최대공약수 구하기
num1 = set([i for i in range(1,a+1) if a%i==0])
num2 = set([j for j in range(1,b+1) if b%j==0])
## 기약분수인 경우
if len(num1 & num2)==0:
num3 = []
for k in num2:
num4 = [l for l in range(1,k+1) if k%l==0]
if len(num4)==2: ## b의 약수 중 소인수인 경우
num3.append(k)
## 기약분수가 아닌 경우 -> 기약분수로 만들어주기
else:
k = max(num1 & num2)
a = a//k
b = b//k
num1 = set([i for i in range(1,a+1) if a%i==0])
num2 = set([j for j in range(1,b+1) if b%j==0])
num3 = []
for k in num2:
num4 = [l for l in range(1,k+1) if k%l==0]
if len(num4)==2: ## b의 약수 중 소인수인 경우
num3.append(k)
## 소인수가 2,5가 제외한 경우가 있는 경우
if len(set(num3) - set([2,5])) > 0:
return 2
else:
return 1
12. [Lv0]. 전국 대회 선발 고사(정답률 73%)
0번부터 n - 1번까지 n명의 학생 중 3명을 선발하는 전국 대회 선발 고사를 보았습니다. 등수가 높은 3명을 선발해야 하지만, 개인 사정으로 전국 대회에 참여하지 못하는 학생들이 있어 참여가 가능한 학생 중 등수가 높은 3명을 선발하기로 했습니다.
각 학생들의 선발 고사 등수를 담은 정수 배열 rank와 전국 대회 참여 가능 여부가 담긴 boolean 배열 attendance가 매개변수로 주어집니다. 전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번이라고 할 때 10000 × a + 100 × b + c를 return 하는 solution 함수를 작성해 주세요.
[입출력 예]
rank | attendance | result |
[3, 7, 2, 5, 4, 6, 1] | [false, true, true, true, true, false, false] | 20403 |
[1, 2, 3] | [true, true, true] | 102 |
[6, 1, 5, 2, 3, 4] | [true, false, true, false, false, true] | 50200 |
[코드]
def solution(rank, attendance):
## 참여가 가능한 학생 중 등수가 높은 3명 선발
answer = {}
for value,key in enumerate(attendance):
if key:
answer[rank[value]] = value
rank = list(answer.keys())
rank.sort()
a = answer[rank[0]]; b=answer[rank[1]]; c=answer[rank[2]]
return 10000*a + 100*b + c
13. [Lv0]. 치킨 쿠폰(정답률 73%)
프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
[입출력 예]
chicken | result |
100 | 11 |
1,081 | 120 |
[코드]
def solution(chicken):
answer = 0
while True:
a,b = divmod(chicken, 10)
chicken = a+b
answer += a
if chicken < 10:
break
return answer
## chicken=1081
## a = 108 , b = 1 -> 서비스 치킨을 108개 먹을 수 있음.
## chicken = 109로 업데이트
## a = 10, b = 9 -> 서비스 치킨을 10개 먹을 수 있음.
## chicken = 19으로 업데이트
## a = 1, b = 9 => 서비스 치킨 1개를 먹을 수 있음.
## chicken = 10으로 업데이트
## a = 1, b =0 => 서비스 치킨 1개를 먹을 수 있음.
'Coding Study' 카테고리의 다른 글
[## 프로그래머스 coding study ##: 2024.04] (0) | 2024.04.01 |
---|---|
[## 프로그래머스 coding study ##: 2024.03] (0) | 2024.03.13 |
[## 프로그래머스 coding study ##: 2024.02] (2) | 2024.02.19 |
[## 프로그래머스 coding study ## : 2023.12] (0) | 2023.12.02 |
[## 프로그래머스 coding study ## : 2023.11] (2) | 2023.11.06 |