아주 구차한 변명이지만 2025/11/01 ~ 2026/01월 까지
부트캠프에서 진행한 메인프로젝트 / 합동프로젝트로 인해 매우 바빠서
지속적으로 코딩테스트를 진행하지 못했었음
2026/01/25 ~ 2026/02/09 (2주정도)
2026/01/25
2562
- 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
- 첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.
li = []
for _ in range(9):
li.append(int(input()))
a=max(li)
print(a)
print(li.index(a)+1)
max_value = 0
max_index = 0
for i in range(9):
current_num = int(input())
if current_num > max_value:
max_value = current_num
max_index = i + 1
print(max_value)
print(max_index)
2475
- 첫째 줄에 고유번호의 처음 5자리의 숫자들이 빈칸을 사이에 두고 하나씩 주어진다.
- ex. 고유번호의 처음 5자리의 숫자들이 04256이면
- 각 숫자를 제곱한 수들의 합 0+16+4+25+36 = 81 을 10으로 나눈 나머지인 1이 검증수
number = list(map(int, input().split()))
li=[]
for i in number:
a=i*i
li.append(a)
b=sum(li)
print(b%10)
[표현식 for 항목 in 반복가능객체] 형태
numbers = [int(i)**2 for i in input().split()]
print(sum(numbers) % 10)
total = 0
numbers = map(int, input().split())
for n in numbers:
total += n ** 2
print(total % 10)
ans = sum(map(lambda x: int(x)**2, input().split()))
print(ans % 10)
2741
- 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성
- 첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.
- 첫째 줄부터 N번째 줄 까지 차례대로 출력한다.
n = int(input())
li = list(range(1,n+1))
for i in li:
print(i)
메모리 효율화 (리스트 생성 없이 출력)
- range는 숫자를 미리 다 만들어두는 게 아니라,
- 필요할 때마다 하나씩 생성하는 '제너레이터' 역할
- 따라서 리스트를 만들 때보다 메모리를 훨씬 적게 사용
n = int(input())
for i in range(1, n + 1):
print(i)
속도 최적화
- print()를 N번 호출하는 것보다, 큰 문자열 하나를 만들어 딱 한 번 출력하는 것이 훨씬 빠름
- join은 문자열 리스트를 하나로 합쳐주는 함수
- input() 대신 sys.stdin.readline()을 쓰는 습관을 들이는 것이 좋음
import sys
n = int(sys.stdin.readline())
print('\n'.join(map(str, range(1, n + 1))))
언팩 연산자 활용 (*)
- '언팩(Unpack)'을 사용하면 반복문 없이도 출력이 가능
n = int(input())
print(*range(1, n + 1), sep='\n')
31403

li=[]
for _ in range(3):
a= int(input())
li.append(a)
print(li[0]+li[1]-li[2])
b=str(li[0])
c=str(li[1])
d=str(li[2])
e=int(b+c)
print(e-li[2])
변수 할당과 문자열 포매팅
- 처음부터 A, B, C라는 변수에 담으면 가독성이 훨씬 좋아짐
- f-string이나 문자열 더하기를 활용하면 e를 만드는 과정이 단순해짐
A = input()
B = input()
C = input()
print(int(A) + int(B) - int(C))
combined_AB = int(f"{A}{B}")
print(combined_AB - int(C))
한 줄 입력을 활용한 방식
- 문자열끼리는 + 연산자를 쓰면 바로 이어 붙여짐 (예: "10" + "20"은 "1020"이 됨)
- 굳이 f-string을 안 써도 A + B만으로 충분히 효율적
import sys
A, B, C = [sys.stdin.readline().strip() for _ in range(3)]
print(int(A) + int(B) - int(C))
print(int(A + B) - int(C))
2026/01/26
10250(re)
- 프로그램은 표준 입력에서 입력 데이터를 받는다.
- 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다.
- 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며
- 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다
- (1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W)
- ex
# 6 12 10
402호
# 30 50 72
1203
t = int(input())
for _ in range(t):
h, w, n = map(int, input().split())
floor = 0
room = 1
while n > h:
n -= h
room += 1
floor = n
print(f"{floor}{room:02d}")
import sys
t = int(sys.stdin.readline())
for _ in range(t):
h, w, n = map(int, sys.stdin.readline().split())
floor = n % h
room = (n // h) + 1
if floor == 0:
floor = h
room -= 1
print(f"{floor}{room:02d}")
2577
- 첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다.
- 첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다.
- 마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에
- 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력
li=[]
for _ in range(3):
a=int(input())
li.append(a)
b=li[0]*li[1]*li[2]
for i in range(0,10):
c=str(b).count(str(i))
print(c)
- 방법 1: 산술 연산(Modulo)을 이용한 풀이
A = int(input())
B = int(input())
C = int(input())
result = A * B * C
counts = [0] * 10
while result > 0:
digit = result % 10
counts[digit] += 1
result //= 10
for count in counts:
print(count)
A = int(input())
B = int(input())
C = int(input())
result_str = str(A * B * C)
counts = [0] * 10
for char in result_str:
counts[int(char)] += 1
for n in counts:
print(n)
2920
- 첫째 줄에 8개 숫자가 주어진다. 이 숫자는 문제 설명에서 설명한 음이며, 1부터 8까지 숫자가 한 번씩 등장
- 첫째 줄에 ascending, descending, mixed 중 하나를 출력한다.
number = list(map(int,input().split()))
a = [1,2,3,4,5,6,7,8]
b = [8,7,6,5,4,3,2,1]
if number == a :
print("ascending")
elif number == b:
print("descending")
else:
print("mixed")
numbers = list(map(int, input().split()))
if numbers == sorted(numbers):
print("ascending")
elif numbers == sorted(numbers, reverse=True):
print("descending")
else:
print("mixed")
numbers = list(map(int, input().split()))
ascending = True
descending = True
for i in range(7):
if numbers[i] < numbers[i+1]:
descending = False
elif numbers[i] > numbers[i+1]:
ascending = False
if ascending:
print("ascending")
elif descending:
print("descending")
else:
print("mixed")
8958
- 첫째 줄에 테스트 케이스의 개수가 주어진다.
- 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다.
- 문자열은 O와 X만으로 이루어져 있다.
- 각 테스트 케이스마다 점수를 출력한다.
N = int(input())
for _ in range(N):
a=str(input())
T = 0
C = 0
for i in a:
if i == 'O':
C+=1
T+=C
else:
C=0
print(T)
import sys
n = int(sys.stdin.readline())
for _ in range(n):
ox_list = sys.stdin.readline().strip()
total_score = 0
current_score = 0
for char in ox_list:
if char == 'O':
current_score += 1
total_score += current_score
else:
current_score = 0
print(total_score)
2026/01/27
4153
- 입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다.
- 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.
- 각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다.
while True:
nums = list(map(int, input().split()))
if sum(nums) == 0:
break
nums.sort()
if nums[0]**2 + nums[1]**2 == nums[2]**2:
print("right")
else:
print("wrong")
while True:
A, B, C = map(int, input().split())
if A == 0 and B == 0 and C == 0:
break
max_side = max(A, B, C)
if max_side == A:
if A**2 == B**2 + C**2: print("right")
else: print("wrong")
elif max_side == B:
if B**2 == A**2 + C**2: print("right")
else: print("wrong")
else:
if C**2 == A**2 + B**2: print("right")
else: print("wrong")
2026/01/26
1436
- N은 최대 10,000
- 숫자를 1부터 1씩 더해가며 모든 숫자를 검사해버리는게 나음
- 브루트 포스
def shom(n):
count = 0
num = 666
while True:
if '666' in str(num):
count += 1
if count == n:
return num
num += 1
n = int(input())
print(shom(n))
2026/01/29
10814
- 첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
- 둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다.
- 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고,
- 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
- 첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순
- 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
data = input().split() → ['21', 'Junkyu'] (둘 다 문자열 상태)
age = int(data[0]) → 21 (정수로 변환)
name = data[1] → 'Junkyu' (문자열 그대로 사용)
age, name = input().split()
age = int(age)
member_list.append((age, name))
import sys
def solve():
n = int(input())
members = []
for _ in range(n):
age, name = input().split()
members.append((int(age), name))
members.sort(key=lambda x: x[0])
for member in members:
print(member[0], member[1])
solve()
import sys
def solve_fast():
input_func = sys.stdin.readline
n = int(input_func())
members = []
for _ in range(n):
data = input_func().split()
members.append((int(data[0]), data[1]))
members.sort(key=lambda x: x[0])
for age, name in members:
print(f"{age} {name}")
solve_fast()
2026/01/31
1920
- 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다.
- 다음 줄에는 N개의 정수
A[1], A[2], …, A[N]이 주어진다.
- 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데,
- 이 수들이 A안에 존재하는지 알아내면 된다.
- 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.
- M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.
원하는 결과값은 출력하지만 "시간초과" 되어버림
- 원인
- Python 리스트에서 in 연산을 사용하면,
- 최악의 경우 리스트의 처음부터 끝까지 다 훑어야 합니다.
- 이를 선형 탐색(Linear Search)이라고 하며, 시간 복잡도는 O(N)입니다.
N = int(input())
li=list(map(int,input().split()))
M = int(input())
li2=list(map(int,input().split()))
for i in range(N):
a = li2[i]
if a in li:
print(1)
else:
print(0)
import sys
input = sys.stdin.read
data = input().split()
N = int(data[0])
li = set(data[1:N+1])
M = int(data[N+1])
li2 = data[N+2:]
for a in li2:
if a in li:
print(1)
else:
print(0)
이분 탐색 (Binary Search)
- 원리: 정렬된 데이터에서 중간값을 확인하며 범위를 좁힙니다.
- 시간 복잡도는 O(M×logN)입니다.
- 장점: 데이터가 정렬되어 있어야 한다는 조건이 있지만, 매우 효율적입니다.
N = int(input())
li = sorted(list(map(int, input().split())))
M = int(input())
li2 = list(map(int, input().split()))
for target in li2:
start, end = 0, N - 1
found = False
while start <= end:
mid = (start + end) // 2
if li[mid] == target:
found = True
break
elif li[mid] < target:
start = mid + 1
else:
end = mid - 1
print(1 if found else 0)
2026/02/01
1181
N = int(input())
li=[]
for _ in range(N):
li.append(str(input()))
li = list(set(li))
li.sort(key=lambda x: (len(x), x))
for i in li:
print(i)
- 팁 1: input() 대신 sys.stdin.read 사용
- 입력값이 최대 20,000개이므로,
- 하나씩 input()으로 받는 것보다 한꺼번에 읽는 것이 훨씬 빠릅니다.
- 팁 2: 처음에 입력받을 때부터 set으로 받기
- 리스트에 다 넣고 나중에 set으로 바꾸는 것보다,
- 처음부터 set에 넣으면 중복 체크를 실시간으로 해서 메모리를 아낄 수 있습니다.
import sys
input_data = sys.stdin.read().splitlines()
n = input_data[0]
words = list(set(input_data[1:]))
words.sort(key=lambda x: (len(x), x))
print('\n'.join(words))
2026/02/02
10039
li=[]
for _ in range(5):
N=int(input())
if N > 40:
li.append(N)
else:
li.append(40)
print(int(sum(li)/5))
리스트 없이 누적 합 구하기
- 특징: 메모리 사용량을 O(N)에서 O(1)로 줄임.
total = 0
for _ in range(5):
score = int(input())
total += max(score, 40)
print(total // 5)
리스트 컴프리헨션 (Pythonic한 방법)
- 코드가 짧고 가독성이 좋음 (파이썬 숙련자들이 선호).
scores = [max(int(input()), 40) for _ in range(5)]
print(sum(scores) // 5)
숏코딩 (입력과 출력을 한 번에)
- print(sum(max(int(input()), 40) for _ in range(5)) // 5)
2026/02/03
2750
N = int(input())
li = []
for _ in range(N):
A = int(input())
li.append(A)
li.sort()
for i in li:
print(i)
N = int(input())
li = []
for _ in range(N):
li.append(int(input()))
for i in range(N):
for j in range(N - i - 1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
for i in li:
print(i)
N = int(input())
li = []
for _ in range(N):
li.append(int(input()))
for i in range(1, N):
key = li[i]
j = i - 1
while j >= 0 and li[j] > key:
li[j + 1] = li[j]
j -= 1
li[j + 1] = key
for i in li:
print(i)
2026/02/04
2587
- 다섯 개의 자연수가 주어질 때 이들의 평균과 중앙값을 구하는 프로그램을 작성하시오.
li=[]
for _ in range(5):
N = int(input())
li.append(N)
li.sort()
print(int(sum(li)/5))
print(li[2])
개선
- 입력 처리
- input()보다 sys.stdin.readline이 대량의 데이터 처리 시 훨씬 빠름
- 리스트 컴프리헨션
- 연산자
- int(sum(li)/5) 대신 정수 나눗셈 연산자 //를 사용하면 형변환(int()) 과정을 생략 가능
import sys
li = [int(sys.stdin.readline()) for _ in range(5)]
li.sort()
print(sum(li) // 5)
print(li[2])
import sys
import statistics
li = [int(sys.stdin.readline()) for _ in range(5)]
print(statistics.mean(li))
print(statistics.median(li))
25305
N,k = map(int,input().split())
li=list(map(int,input().split()))
li.sort(reverse=True)
print(li[k-1])
2026/02/05
2751
import sys
input = sys.stdin.readline
N = int(input())
li=[]
for _ in range(N):
A = int(input())
li.append(A)
li.sort()
for i in li:
print(i)
import sys
input = sys.stdin.readline
def solve_optimized():
try:
line = input()
if not line:
return
N = int(line)
li = []
for _ in range(N):
li.append(int(input()))
li.sort()
print('\n'.join(map(str, li)))
except ValueError:
pass
if __name__ == "__main__":
solve_optimized()
import sys
input = sys.stdin.readline
def merge_sort(arr):
if len(arr) < 2:
return arr
mid = len(arr) // 2
low_arr = merge_sort(arr[:mid])
high_arr = merge_sort(arr[mid:])
merged_arr = []
l = h = 0
while l < len(low_arr) and h < len(high_arr):
if low_arr[l] < high_arr[h]:
merged_arr.append(low_arr[l])
l += 1
else:
merged_arr.append(high_arr[h])
h += 1
merged_arr += low_arr[l:]
merged_arr += high_arr[h:]
return merged_arr
def solve_merge():
try:
N = int(input())
li = [int(input()) for _ in range(N)]
sorted_li = merge_sort(li)
print('\n'.join(map(str, sorted_li)))
except:
pass
2026/02/06
11650
import sys
input = sys.stdin.readline
def solve():
try:
line = input().strip()
if not line:
return
n = int(line)
except ValueError:
return
points = []
for _ in range(n):
x, y = map(int, input().split())
points.append((x, y))
points.sort()
for x, y in points:
print(f"{x} {y}")
if __name__ == "__main__":
solve()
import sys
input = sys.stdin.readline
def solve_explicit():
try:
line = input().strip()
if not line: return
n = int(line)
except ValueError: return
points = []
for _ in range(n):
x, y = map(int, input().split())
points.append((x, y))
points.sort(key=lambda x: (x[0], x[1]))
for x, y in points:
print(f"{x} {y}")
if __name__ == "__main__":
solve_explicit()
- sort는 리스트로 정렬해도 앞에먼저 정렬 해주고 뒤에도 정렬해줌
import sys
input = sys.stdin.readline
N = int(input())
points = []
for _ in range(N):
A, B = map(int, input().split())
points.append([A, B])
points.sort()
for i in range(N):
print(points[i][0], points[i][1])
2026/02/07
11651
- 문제 이해하기
- 파이썬의 내장 함수인 sort와 lambda 식을 활용
import sys
input = sys.stdin.readline
N = int(input())
li = []
for _ in range(N):
A,B = map(int,input().split())
li.append([A,B])
li.sort(key=lambda point: (point[1], point[0]))
for A,B in li:
print(A,B)
import sys
input = sys.stdin.readline
N = int(input())
points = []
for _ in range(N):
x, y = map(int, input().split())
points.append([y, x])
points.sort()
for y, x in points:
print(x, y)
2026/02/08
2869
- (반복문): O(V/(A−B)) - 최악의 경우 매우 느림 (오답)
A, B, V = map(int, input().split())
current_height = 0
day = 0
while True:
day += 1
current_height += A
if current_height >= V:
break
current_height -= B
print(day)
(수학): O(1) - 입력값의 크기와 상관없이 즉시 계산
import sys
import math
A, B, V = map(int, sys.stdin.readline().split())
target_height = V - A
daily_climb = A - B
days_needed = math.ceil(target_height / daily_climb)
print(days_needed + 1)
import sys
import math
A, B, V = map(int, sys.stdin.readline().split())
H = V - A
D = A - B
R = math.ceil(H/D)
print(R + 1)
2026/02/09
10872
팩토리얼
- 0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.
1676
- N! (N 팩토리얼)을 계산했을 때, 결과값의 뒤에서부터 이어지는 0의 개수를 구하는 것입니다.
- 소인수 5의 개수만 세면 그것이 곧 만들 수 있는 10(2×5)의 개수, 즉 0의 개수
N = int(input())
result = 1
for i in range(1, N + 1):
result *= i
print(result)
N = int(input())
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
print(factorial(N))