
물 부족
문제 설명
ㅇㅇ시에서는 저수지가 하나 있는데, 도시 내에서 사용하는 모든 물은 이 저수지에 저장된 물을 끌어와 사용합니다. 이상 기후로 인해 극심한 가뭄이 예고된 상황에서, 지난 달의 물 사용량과 이번달부터 일정 기간 동안의 월별 물 사용량의 변화를 예측한 값을 이용해 몇 달 뒤 물이 부족해지는지 예측하려고 합니다.
이번달부터의 월별 물 사용량 변화를 예측한 값은 다음과 같이 리스트에 담겨 주어집니다.
- [10, -10, 10, -10, 10, -10, 10, -10, 10, -10]
- 리스트의 각 원소는 해당 월의 물 사용량이 전 달에 비해 몇 % 만큼 증가 또는 감소하는지를 나타냅니다.
- 예를 들어, 이번달의 물 사용량 (리스트의 첫 번째 원소)은 지난 달 보다 10% 증가한 값이며, 다음 달(리스트의 두 번째 원소)의 물 사용량은 이번달 사용량에서 10%만큼 감소한 값입니다.
- 자세한 값은 입출력 예시를 참고해 주세요.
현재 저수지에 저장된 물의 양을 나타내는 정수 storage와 지난 달 물 사용량을 나타내는 정수 usage, 월별 물 사용량이 전 달 대비 어떻게 변하는지 저장된 정수 리스트 change가 주어질 때 몇 달 뒤 물이 부족해지는지 return 하도록 solution 함수를 작성하려 합니다. 코드가 올바르게 작동하도록 한 줄을 수정해 solution 함수를 완성해 주세요. 가뭄이 끝날때 까지 저수지의 물이 남아 있다면 -1을 return합니다.
제한사항
- 1,000 ≤ storage ≤ 1,000,000
- 500 ≤ usage ≤ 30,000
- 1 ≤ change의 길이 ≤ 30
- -99 ≤ change[i] ≤ 500
- change[i] 가 양수일 경우 물 사용량은 전 달 보다 change[i]% 만큼 증가합니다.
- change[i] 가 음수일 경우 물 사용량은 전 달 보다 change[i]% 만큼 감소합니다.
- change[i] 가 0일 경우 물 사용량은 전 달과 동일합니다.
- 매달 물 사용량은 소수점 이하를 버린 정수로 계산합니다.
입출력 예
storage | usage | change | result |
5141 | 500 | [10, -10, 10, -10, 10, -10, 10, -10, 10, -10] | -1 |
1000 | 2000 | [-10, 25, -33] | 1 |
입출력 예 설명
입출력 예 #1
- 매월 물 사용량은 다음과 같습니다.
n개월 뒤 | 월 별 물 사용량 | 총 물 사용량 |
0 (이번 달) | 550 | 550 |
1 (다음 달) | 495 | 1045 |
2 | 544 | 1589 |
3 | 490 | 2079 |
4 | 539 | 2618 |
5 | 485 | 3103 |
6 | 533 | 3636 |
7 | 479 | 4115 |
8 | 526 | 4641 |
9 | 474 | 5115 |
- 예를 들어, 지난 달 물 사용량 usage = 500이므로, 이번달 물 사용량은 10% 증가한 550입니다. 다음 달 물 사용량은 이번달 사용량 550에서 10% 감소한 495 이며, 나머지 달도 동일하게 계산합니다. 9달 뒤까지 계산한 물 사용량은 총 5115 이며, 현재 저수지에 저장된 물의 양은 storage = 5141입니다. 따라서 물이 부족해지지 않으므로 -1을 return합니다.
입출력 예 #2
- 총 사용가능한 물의 양이 1000인데 2000 * 0.9 = 1800이 필요하므로 이번 달부터 물이 부족합니다. 따라서 0을 return합니다.
solution.py 디버깅(Debugging) 문제
def solution(storage, usage, change):
total_usage = 0
for i in range(len(change)):
usage = total_usage * change[i]/100
total_usage += usage
if total_usage > storage:
return i
return -1
def solution(storage, usage, change):
total_usage = 0
for i in range(len(change)):
usage = int(usage * (1 + change[i] / 100))
total_usage += usage
if total_usage > storage:
return i
return -1
버스
문제 설명
영진이는 약속장소에 가기 위해 버스를 타려고 합니다. 버스에는 좌석이 총 seat개만큼 있습니다. 영진이는 버스 좌석에 앉아서 갈 수 있을지 궁금해합니다. 기점에서 출발한 버스가 영진이가 기다리는 정거장에 도착하기 전에 방문하는 각 정거장에서 승/하차한 승객 정보가 주어질 때, 영진이가 버스에 탄 순간 빈 좌석은 몇 개인지 구해주세요. 영진이가 기다리는 정거장에서는 영진이가 제일 먼저 버스에 탑승하며, 이전 정거장에서 버스에 탑승한 승객들은 남는 좌석이 있다면 항상 앉는다고 가정합니다. 또, 기점에서 출발하는 버스에는 승객이 0명 타고 있습니다.
예를 들어 다음은 좌석이 5개인 버스에 각 정거장에서 승/하차한 승객 정보를 나타냅니다. 영진이는 4번 정거장에서 기다리고 있으며, "On"은 승차한 승객, "Off"는 하차한 승객을 의미합니다.
- 1번 정거장 : ["On", "On", "On"] (3명 승차, 0명 하차)
- 2번 정거장 : ["Off", "On", "-"] (1명 승차, 1명 하차)
- 3번 정거장 : ["Off", "-", "-"] (0명 승차, 1명 하차)
위와 같은 경우, 1번 정거장에서 3명이 승차하고, 2번 정거장에서 1명 승차 1명 하차, 3번 정거장에서 1명이 하차했으므로 4번 정거장에 도착한 버스에는 2명이 타고 있습니다. 4번 정거장에서는 영진이가 가장 먼저 탑승하므로, 남아있는 좌석 수는 3개입니다.
주어진 solution함수는 버스의 좌석 개수 seat, 기점에서 출발한 버스가 순서대로 방문한 정거장에서 승객이 승/하차한 정보를 담은 2차원 문자열 리스트 passengers가 주어질 때, 버스에 남아있는 좌석의 개수를 return 하는 함수입니다. solution 함수가 올바르게 작동하도록 빈칸을 채워 solution함수를 완성해 주세요.
제한사항
- 1 ≤ seat ≤ 30
- 1 ≤ passengers의 길이 ≤ 10
- 1 ≤ passengers[i]의 길이 ≤ 20
- passengers[0]은 1번 정거장, passengers[1]은 2번 정거장, … passengers[i]는 i + 1번 정거장의 정보입니다.
- passengers의 길이가 n이라면, 영진이는 n + 1번 정거장에서 기다리고 있습니다.
- passengers[i]의 길이는 모두 동일합니다.
- passengers[i]의 원소는 "On", "Off" 또는 "-"입니다.
- "-"는 배열의 가로(열) 길이를 맞추기 위한 요소로, 아무런 의미도 없습니다.
- "-"가 "On", "Off" 사이에 있는 경우는 없습니다.
입출력 예
seat | passengers | result |
5 | [["On", "On", "On"], ["Off", "On", "-"], ["Off", "-", "-"]] | 3 |
10 | [["On", "On", "On", "On", "On", "On", "On", "On", "-", "-"], ["On", "On", "Off", "Off", "Off", "On", "On", "-", "-", "-"], ["On", "On", "On", "Off", "On", "On", "On", "Off", "Off", "Off"], ["On", "On", "Off", "-", "-", "-", "-", "-", "-", "-"]] | 0 |
입출력 예 설명
입출력 예 #1
- 지문과 동일합니다
입출력 예 #2
아래와 같이 승객이 타고 내렸고 마지막으로 12명이 버스에 타고 있으므로 남은 좌석은 0개입니다.
- 1번 정거장 : ["On", "On", "On", "On", "On", "On", "On", "On", "-", "-"] (8명 승차, 0명 하차)
- 2번 정거장 : ["On", "On", "Off", "Off", "Off", "On", "On", "-", "-", "-"] (4명 승차, 3명 하차)
- 3번 정거장 : ["On", "On", "On", "Off", "On", "On", "On", "Off", "Off", "Off"] (6명 승차, 4명 하차)
- 4번 정거장 : ["On", "On", "Off", "-", "-", "-", "-", "-", "-", "-"] (2명 승차, 1명 하차)
solution.py 빈칸 채우기 문제
def func1(num):
if 0 > num:
return 0
else:
return num
def func2(num):
if num > 0:
return 0
else:
return num
def func3(station):
num = 0
for people in station:
if people == "Off":
num += 1
return num
def func4(station):
num = 0
for people in station:
if people == "On":
num += 1
return num
def solution(seat, passengers):
num_passenger = 0
for station in passengers:
num_passenger += func
num_passenger -= func
answer = func
return answer
def func1(num):
if 0 > num:
return 0
else:
return num
def func2(num):
if num > 0:
return 0
else:
return num
def func3(station):
num = 0
for people in station:
if people == "Off":
num += 1
return num
def func4(station):
num = 0
for people in station:
if people == "On":
num += 1
return num
def solution(seat, passengers):
num_passenger = 0
for station in passengers:
num_passenger += func4(station)
num_passenger -= func3(station)
answer = func1(seat - num_passenger)
return answer
닉네임 규칙
문제 설명
온라인 서비스를 이용하기 위해서 닉네임이 필요합니다. 이때 닉네임이 될 수 있는 조건은 다음과 같습니다.
- 닉네임의 길이가 4자 이상 8자 이하여야합니다.
- 닉네임에는 소문자 l과 w, 대문자 O와 W를 사용할 수 없습니다.
- 이외의 영어 대소문자와 숫자는 모두 사용이 가능합니다.
주어진 solution 함수는 사용할 수 없는 닉네임 nickname을 받아 사용할 수 있는 닉네임으로 바꿔주는 함수입니다. 이때 닉네임을 변경하는 규칙은 다음과 같으며 첫 번째 규칙부터 순서대로 적용합니다.
- 소문자 l을 대문자 I로 변경합니다.
- 소문자 w를 두 개의 소문자 v, 즉 vv로 변경합니다.
- 대문자 W를 두 개의 대문자 V, 즉 VV로 변경합니다.
- 대문자 O를 숫자 0으로 변경합니다.
- 수정된 닉네임의 길이가 4 미만일 경우 뒤에 소문자 o를 길이가 4가 될때까지 이어붙입니다.
- 수정된 닉네임의 길이가 8보다 클 경우 8번째 문자까지만 사용합니다.
주어진 solution 함수에는 위의 규칙 중 올바르게 적용되지 않는 것이 있습니다. solution 함수가 올바르게 작동하도록 한 줄을 수정해주세요.
제한사항
- 1 ≤ nickname의 길이 ≤ 10
- nickname은 영어 대소문자와 숫자로만 이루어져있습니다.
입출력 예
nickname | result |
"WORLDworld" | "VV0RLDvv" |
"GO" | "G0oo" |
입출력 예 설명
입출력 예 #1
- 닉네임 "WORLDworld"는 1, 2, 3, 4, 6 단계를 거쳐 "VV0RLDvv"가 됩니다.
"WORLDworld" -> "WORLDworId" -> "WORLDvvorId" -> "VVORLDvvorId" -> "VV0RLDvvorId" -> "VV0RLDvv"
입출력 예 #2
- 닉네임 "GO"는 4, 5 단계를 거쳐 "G0oo"가 됩니다.
"GO" -> "G0" -> "G0oo"
solution.py 디버깅(Debugging) 문제
def solution(nickname):
answer = ""
for letter in nickname:
if letter == "l":
answer += "I"
elif letter == "w":
answer += "vv"
elif letter == "W":
answer += "VV"
elif letter == "O":
answer += "0"
else:
answer += letter
if len(answer) < 3:
answer += "o"
if len(answer) > 8:
answer = answer[:8]
return answer
def solution(nickname):
answer = ""
for letter in nickname:
if letter == "l":
answer += "I"
elif letter == "w":
answer += "vv"
elif letter == "W":
answer += "VV"
elif letter == "O":
answer += "0"
else:
answer += letter
if len(answer) < 3:
answer += "o" * (4 - len(answer))
if len(answer) > 8:
answer = answer[:8]
return answer
지폐 접기
문제 설명
민수는 다양한 지폐를 수집하는 취미를 가지고 있습니다. 지폐마다 크기가 달라 지갑에 넣으려면 여러 번 접어서 넣어야 합니다. 예를 들어 지갑의 크기가 30 * 15이고 지폐의 크기가 26 * 17이라면 한번 반으로 접어 13 * 17 크기로 만든 뒤 90도 돌려서 지갑에 넣을 수 있습니다. 지폐를 접을 때는 다음과 같은 규칙을 지킵니다.
- 지폐를 접을 때는 항상 길이가 긴 쪽을 반으로 접습니다.
- 접기 전 길이가 홀수였다면 접은 후 소수점 이하는 버립니다.
- 접힌 지폐를 그대로 또는 90도 돌려서 지갑에 넣을 수 있다면 그만 접습니다.
지갑의 가로, 세로 크기를 담은 정수 리스트 wallet과 지폐의 가로, 세로 크기를 담은 정수 리스트 bill가 주어질 때, 지갑에 넣기 위해서 지폐를 최소 몇 번 접어야 하는지 return하도록 solution함수를 완성해 주세요.
지폐를 지갑에 넣기 위해 접어야 하는 최소 횟수를 구하는 과정은 다음과 같습니다.
1. 지폐를 접은 횟수를 저장할 정수 변수 answer를 만들고 0을 저장합니다.
2. 반복문을 이용해 bill의 작은 값이 wallet의 작은 값 보다 크거나 bill의 큰 값이 wallet의 큰 값 보다 큰 동안 아래 과정을 반복합니다.
2-1. bill[0]이 bill[1]보다 크다면
bill[0]을 2로 나누고 나머지는 버립니다.
2-2. 그렇지 않다면
bill[1]을 2로 나누고 나머지는 버립니다.
2-3. answer을 1 증가시킵니다.
3. answer을 return합니다.
- 위의 의사코드와 작동방식이 다른 코드를 작성해도 상관없습니다.
제한사항
- wallet의 길이 = bill의 길이 = 2
- 10 ≤ wallet[0], wallet[1] ≤ 100
- 10 ≤ bill[0], bill[1] ≤ 2,000
입출력 예
wallet | bill | result |
[30, 15] | [26, 17] | 1 |
[50, 50] | [100, 241] | 4 |
입출력 예 설명
입출력 예 #1
- 지문과 동일합니다.
입출력 예 #2
- 지폐를 접으면 다음과 같이 크기가 줄어듭니다. 따라서 4번 접으면 지갑에 넣을 수 있습니다.
- [100, 241] -> [100, 120] -> [100, 60] -> [50, 60] -> [50, 30]
solution.py
def solution(wallet, bill):
answer = 0
while not ((bill[0] <= wallet[0] and bill[1] <= wallet[1]) or (bill[1] <= wallet[0] and bill[0] <= wallet[1])):
if bill[0] >= bill[1]:
bill[0] //= 2
else:
bill[1] //= 2
answer += 1
return answer
복잡도 분석
긴 쪽을 계속 반으로 나누는 연산의 시간복잡도는 O(log n)입니다.
입력으로 주어진 리스트의 공간복잡도는 O(1)입니다.
따라서 최종 시간 복잡도와 공간 복잡도는 O(log n)입니다.
공원
문제 설명
지민이는 다양한 크기의 정사각형 모양 돗자리를 가지고 공원에 소풍을 나왔습니다. 공원에는 이미 돗자리를 깔고 여가를 즐기는 사람들이 많아 지민이가 깔 수 있는 가장 큰 돗자리가 어떤 건지 확인하려 합니다. 예를 들어 지민이가 가지고 있는 돗자리의 한 변 길이가 5, 3, 2 세 종류이고, 사람들이 다음과 같이 앉아 있다면 지민이가 깔 수 있는 가장 큰 돗자리는 3x3 크기입니다.

지민이가 가진 돗자리들의 한 변의 길이들이 담긴 정수 리스트 mats, 현재 공원의 자리 배치도를 의미하는 2차원 문자열 리스트 park가 주어질 때 지민이가 깔 수 있는 가장 큰 돗자리의 한 변 길이를 return 하도록 solution 함수를 완성해 주세요. 아무런 돗자리도 깔 수 없는 경우 -1을 return합니다.
제한사항
- 1 ≤ mats의 길이 ≤ 10
- 1 ≤ mats의 원소 ≤ 20
- mats는 중복된 원소를 가지지 않습니다.
- 1 ≤ park의 길이 ≤ 50
- 1 ≤ park[i]의 길이 ≤ 50
- park[i][j]의 원소는 문자열입니다.
- park[i][j]에 돗자리를 깐 사람이 없다면 "-1", 사람이 있다면 알파벳 한 글자로 된 값을 갖습니다.
입출력 예
mats | park | result |
[5, 3, 2] | [["A", "A", "-1", "B", "B", "B", "B", "-1"], ["A", "A", "-1", "B", "B", "B", "B", "-1"], ["-1", "-1", "-1", "-1", "-1", "-1", "-1", "-1"], ["D", "D", "-1", "-1", "-1", "-1", "E", "-1"], ["D", "D", "-1", "-1", "-1", "-1", "-1", "F"], ["D", "D", "-1", "-1", "-1", "-1", "E", "-1"]] | 3 |
입출력 예 설명
입출력 예 #1
- 지문과 동일합니다.
문제 분석
의사 코드(pseudo code)
1 mats 리스트와 park 2차원 문자열 리스트 입력
2 mats 내림차순 정렬
3 각 돗자리 크기 k에 대해 반복
a 돗자리를 깔 수 있는 모든 시작 좌표(i, j) 탐색
b 해당 좌표 (i, j)에서 k * k 영역이 공원을 벗어나면 다음 위치로 건너뛰기
c k * k 영역의 모든 칸 확인
d 모든 칸이 "-1"이면 k 반환
4 모든 크기를 시도했지만 깔 수 있는 돗자리가 없으면 -1 반환
solution.py
def solution(mats, park):
m, n = len(park[0]), len(park)
mats.sort(reverse=True) # 큰 것부터 시도
for size in mats:
for i in range(n - size + 1):
for j in range(m - size + 1):
can_place = True
for x in range(i, i + size):
for y in range(j, j + size):
if park[x][y] != "-1":
can_place = False
break
if not can_place:
break
if can_place:
return size
return -1
복잡도 분석
4중 중첩 루프의 시간복잡도는 O(k * n * m * s²)입니다.
단일 변수, 반복문의 공간복잡도는 O(1)입니다.
따라서 최종 시간 복잡도와 공간 복잡도는 O(k * n * m * s²)입니다.
'코딩테스트' 카테고리의 다른 글
프로그래머스 12903 파이썬 (0) | 2025.05.27 |
---|---|
프로그래머스 12901 파이썬 (0) | 2025.05.26 |
프로그래머스 PCCE 기출문제 파이썬 3/4 (1) | 2025.05.24 |
프로그래머스 PCCE 기출문제 파이썬 2/4 (1) | 2025.05.23 |
프로그래머스 PCCE 기출문제 파이썬 1/4 (0) | 2025.05.22 |