[Programmers] 코딩테스트 연습문제 8
038. 최댓값과 최솟값 (연습문제 lv.2)
- 문제에서 원하는 것: 문자열 숫자 중 최솟값 최댓값 찾기
- 변수 확인
s에는 둘 이상의 정수가 공백으로 구분되어 있다
- 조건
- 모든 차량이 단속용 카메라를 한 번은 만나도록 하기
- 접근 방법: 공백 기준 문자열
split후 최소-최댓값 비교
- 풀이 전략:
-
공백 기주능로 문자열 나누기
-
문자열 리스트를 정수형으로 변환
-
min/max함수로 최솟값 최댓값 구하기
-
1
2
3
4
5
6
7
8
9
def solution(s):
### 1. 공백 기준 문자열 나누기
numbers = s.split(" ")
### 2. 정수형으로 변환
int_numbers = list(map(int, numbers))
### 3. 최솟값, 최댓값 구하기
min_val = min(int_numbers)
max_val = max(int_numbers)
return f"{min_val} {max_val}"
039. 최솟값 만들기 (연습문제 lv.2)
- 문제에서 원하는 것: 두 개의 배열의 수를 곱한 후 더한 값을 최솟값 만들기
- 변수 확인
- 자연수로 이루어진 배열
A,B
- 자연수로 이루어진 배열
- 조건
- 배열 A, B는 길이가 같음
- 각 배열에서 k번째 숫자를 뽑았다면 다음에는 k번째 숫자를 다시 뽑을 수 없음
- 접근 방법: 한 배열의 최솟값과 다른 배열의 최댓값만을 곱해 최소 만들기
- 풀이 전략:
- 최소-최대 사용 방법
- A의 길이만큼 반복
- A에서 최솟값, B에서 최댓값 찾아서 곱한 후 그 값 answer++
- 곱한 값은 배열에서
remove
⇒ 이렇게 하면 시간복잡도 O(n^2)
- 정렬을 사용한 greedy
- A는 오름차순, B는 내림차순 정렬
- 같은 인덱스끼리 곱해서 누적합
⇒ 이렇게 하면 시간복잡도 O(n log n)
- 최소-최대 사용 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
### 첫 번째 방법
def solution(A,B):
answer = 0
### 1. A의 길이만큼 반복
for i in range(len(A)):
### 2. 최솟값 최댓값 찾아 곱하기
answer += (min(A)) * (max(B))
### 3. 사용한 숫자는 제거
A.remove(min(A))
B.remove(max(B))
### 두 번째 방법
def solution(A,B):
A.sort()
B.sort(reverse=True)
return sum(a * b for a, b in zip(A, B))
040. JadenCase 문자열 만들기 (연습문제 lv.2)
- 문제에서 원하는 것: 주어진 문자열을 JadenCase로 만들기
- 변수 확인
- 문자열
s
- 문자열
- 조건
- 문자열
s는 알파벳과 숫자, 공백문자로 이루어짐 - 숫자는 단어의 첫 문자로만 나옴
- 공백문자가 연속해서 나올 수 있음
- 문자열
- 접근 방법: 문자열 전체를 소문자로 만들고 문자열을 순회하면서 공백 뒤/맨 앞이라면 대문자로 변환
- 풀이 전략:
-
문자열 전체를 소문자로 변환
-
문자열 길이만큼 순회
-
맨 앞 또는 공백 뒤라면 대문자로 변환
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(s):
answer = ''
cap_next = True
### 1. 문자열을 소문자로 변환
s = s.lower()
### 2. 문자열 길이만큼 순회
for char in s:
if cap_next and char.isalpha():
answer += char.upper()
else:
answer += char
# 공백 뒤라면 대문자로
cap_next = (char == ' ')
return answer
041. 숫자의 표현 (연습문제 lv.2)
- 문제에서 원하는 것: 연속된 자연수들로 숫자 표현하는 방법의 수 찾기
- 변수 확인
- 자연수
n
- 자연수
-
접근 방법:
x는 자연수여야 하므로(n - k(k-1)/2)가 k로 나누어 떨어져야 함n = x + (x+1) + (x+2) + ... + (x+k-1) = kx + (k(k-1))/2
- 풀이 전략:
-
k를 1부터
k(k-1)/2 < n인 동안 반복 -
(n - k(k-1)/2) / k이 값이 정수면 카운트
-
1
2
3
4
5
6
7
8
9
10
11
def solution(n):
answer = 0
k = 1
while (k * (k - 1) // 2) < n:
num = n - k * (k - 1) // 2
if num % k == 0:
answer += 1
k += 1
return answer
042. 다음 큰 숫자 (연습문제 lv.2)
- 문제에서 원하는 것: 자연수
n의 다음 큰 숫자 찾기
- 변수 확인
- 자연수
n
- 자연수
- 조건
n의 다음 큰 숫자는n보다 큰 자연수n의 다음 큰 숫자와n은 2진수로 변환했을 때 1의 갯수가 같음n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수
- 접근 방법:
n보다 큰 수 중 2진수로 변환했을 때 1의 갯수 비교
- 풀이 전략:
-
n의 2진수에서 1의 개수 먼저 계산 -
n보다 큰 수를 하나씩 증가시키면서 2진수로 변환했을 때 1의 개수 비교 -
n과 같은 1의 개수를 가지면 그 수 반환
-
1
2
3
4
5
6
7
def solution(n):
count = bin(n).count('1')
while True:
n += 1
if bin(n).count('1') == count:
return n
043. 피보나치 수 (연습문제 lv.2)
- 문제에서 원하는 것:
n번째 피보나치 수를 1234567로 나눈 나머지를 리턴
- 변수 확인
- 2 이상의 자연수
n
- 2 이상의 자연수
- 조건
- F(n) = F(n-1) + F(n-2)
- 접근 방법: 반복문으로 동적 프로그래밍
- 풀이 전략:
-
변수 2개로 이전 계산값 저장
-
F(0) = 0, F(1) = 1로 초기화
-
F(2)부터 F(n)까지 반복적으로 계산
-
계산할 때마다
%1234567연산
-
1
2
3
4
5
6
7
8
def solution(n):
if n == 0:
return 0
# F(0), F(1)
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, (a + b) % 1234567
return b
044. 귤 고르기 (연습문제 lv.2)
- 문제에서 원하는 것: 크기가 서로 다른 종류의 수의 최솟값 찾기
- 변수 확인
- 한 상자에 담으려는 귤의 개수
k - 귤의 크기를 담은 배열
tangerine
- 한 상자에 담으려는 귤의 개수
- 접근 방법: 많이 있는 크기부터 선택하기 (greedy)
- 풀이 전략:
-
귤 크기별 개수 확인
-
빈도수 내림차순
-
개수 누적하면서 k개 채우기
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from collections import Counter
def solution(k, tangerine):
### 귤 크기별 개수 세기
size_count = Counter(tangerine)
### 내림차순 정렬
sorted_sizes = sorted(size_count.values(), reverse=True)
# 고른 귤 개수
total = 0
# 종류 수
answer = 0
for count in sorted_sizes:
total += count
answer += 1
if total >= k:
break
return answer