2026/03/01 ~
import sys
N, M = map(int, sys.stdin.readline().split())
a, b = N, M
# 최대 공약수 계산
while b != 0:
a, b = b, a % b
GCD = a
LCM = (N * M) // GCD
print(GCD)
print(LCM)

import sys
def factorial(n):
ans = 1
for i in range(2, n + 1):
ans *= i
return ans
n, k = map(int, sys.stdin.readline().split())
# 공식 적용: n! / (k! * (n-k)!)
result = factorial(n) // (factorial(k) * factorial(n - k))
print(result)


# 입력
23
3 1 4 1 5 9
5 7
# 출력
7
3 2
# 이해
펜을 7개씩 3묶음을 주무하고나면 2명의 인원은 펜을 받지 못하기 때문에 2명은 따로 1개씩 주문한다.
N = int(input())
# S,M,L,XL,XXL,XXXL
M = list(map(int,input().split()))
T,P = map(int,input().split())
num1 = 0
for i in M:
while True:
if i > 0:
num1 += 1
i -= T
else:
break
print(num1)
print(f"{int(N/P)} {int(N%P)}")
import sys
N = int(sys.stdin.readline())
# S,M,L,XL,XXL,XXXL
M = list(map(int, sys.stdin.readline().split()))
T,P = map(int, sys.stdin.readline().split())
num1 = 0
for i in M:
if i == 0:
continue
num1 += (i // T)
if i % T > 0:
num1 += 1
print(num1)
print(f"{int(N//P)} {int(N%P)}")
N = int(input())
num_li = []
for i in range(N):
A = int(input())
num_li.append(A)
num_li.sort()
for j in num_li:
print(j)
import sys
# 데이터의 최댓값이 10000이므로, 10001개의 칸을 가진 리스트를 0으로 초기화(메모리차지 최소화)
count = [0] * 10001
# 빠른 입력을 위해 sys.stdin.readline 사용
N = int(sys.stdin.readline())
for _ in range(N):
# 입력받은 숫자를 리스트에 저장하지 않고, 해당 인덱스의 카운트만 1 증가시킴
num = int(sys.stdin.readline())
count[num] += 1
# 결과 출력
for i in range(10001):
# count[i]에 기록된 횟수만큼 인덱스 i를 반복 출력
if count[i] != 0:
for _ in range(count[i]):
print(i)
소괄호 ()와 대괄호 []가 올바르게 짝을 지어야 함So when I die (the [first] I will see in (heaven) is a score list).(, [, ], ), (, ), )( 열림 ➔ [ 열림 ➔ ]가 가장 최근에 열린 [를 닫음 ➔ )가 (를 닫음 ➔ ( 열림 ➔ )가 (를 닫음 ➔ 마지막 )가 맨 처음 열린 (를 닫음.line = "A ( )"char = 'A' 'A'는 "()[]" 안에 없으므로 무시 (아무 일도 안 일어남)char = ' ' (공백) 공백은 "()[]" 안에 없으므로 무시char = '(' '('는 "()[]" 안에 있으므로 통과! ➔ brackets에 추가 "("char = ' ' (공백) char = ')' ')'는 "()[]" 안에 있으므로 통과! ➔ brackets에 추가 "()"if char in "()[]"(, ), [, ] 네 개의 문자 중 하나인지 검사brackets = "" # 1. 빈 바구니 준비
for char in line: # 2. 문자열에서 글자를 하나씩 꺼냄
if char in "()[]": # 3. 꺼낸 글자가 괄호인지 검사
brackets += char # 4. 괄호가 맞다면 바구니에 추가
import sys
while True:
N = sys.stdin.readline().rstrip()
if N == ".":
break
# 알파벳과 공백을 모두 제거하고 괄호만 남김
result = ""
for char in N:
if char in "()[]":
result += char
# "()" 나 "[]" 가 문자열 안에 존재하는 동안 계속 지워나감
while "()" in result or "[]" in result:
result = result.replace("()", "")
result = result.replace("[]", "")
# 다 지웠는데 괄호가 남아있으면 짝이 안 맞는 것
if len(result) == 0:
print("yes")
else:
print("no")
# 맞는 경우
import sys
while True:
line = sys.stdin.readline().rstrip()
# 현재 line = "[ first in ] ( first out )."
if line == ".":
break
# 알파벳과 공백을 모두 제거하고 괄호만 남김
brackets = ""
for char in line:
if char in "()[]":
brackets += char
# [for문 종료 후 결과]
# 괄호만 순서대로 추출되었으므로, brackets = "[]()" 가 됩니다.
# "()" 나 "[]" 가 문자열 안에 존재하는 동안 계속 지워나감
while "()" in brackets or "[]" in brackets:
# [while문 1번째 반복 시작] 현재 brackets = "[]()"
brackets = brackets.replace("()", "")
# "()"가 지워짐 -> brackets = "[]"
brackets = brackets.replace("[]", "")
# "[]"가 지워짐 -> brackets = "" (빈 문자열)
# [while문 2번째 반복 조건 검사]
# brackets가 "" 이므로 "()", "[]" 둘 다 없습니다. -> while문 종료!
# 다 지웠는데 괄호가 남아있으면 짝이 안 맞는 것
if len(brackets) == 0:
# 현재 len(brackets)는 0입니다. (빈 문자열이므로)
print("yes") # 결과: "yes" 출력!
else:
print("no")
# 틀린 경우
import sys
while True:
line = sys.stdin.readline().rstrip()
# 현재 line = "Help( I[m being held prisoner in a fortune cookie factory)]."
if line == ".":
break
# 알파벳과 공백을 모두 제거하고 괄호만 남김
brackets = ""
for char in line:
if char in "()[]":
brackets += char
# [for문 종료 후 결과]
# 괄호만 순서대로 추출되었으므로, brackets = "([)]" 가 됩니다.
# "()" 나 "[]" 가 문자열 안에 존재하는 동안 계속 지워나감
while "()" in brackets or "[]" in brackets:
# [while문 조건 검사] 현재 brackets = "([)]"
# 문자열 안에 완전히 붙어있는 "()" 나 "[]" 가 없습니다!
# 따라서 while문 안으로 들어가지 못하고 바로 종료됩니다.
brackets = brackets.replace("()", "")
brackets = brackets.replace("[]", "")
# 다 지웠는데 괄호가 남아있으면 짝이 안 맞는 것
if len(brackets) == 0:
print("yes")
else:
# 현재 len(brackets)는 4입니다. ("([)]"가 그대로 남아있으므로)
print("no") # 결과: "no" 출력!
import sys
while True:
line = sys.stdin.readline().rstrip()
if line == ".": # 마침표만 들어오면 종료
break
stack = []
is_balanced = True
for char in line:
if char == '(' or char == '[': # 여는 괄호는 스택에 추가
stack.append(char)
elif char == ')': # 소괄호 닫기
# 스택이 비어있거나, 짝이 맞지 않으면 불균형
if not stack or stack[-1] != '(':
is_balanced = False
break
stack.pop() # 짝이 맞으면 스택에서 제거
elif char == ']': # 대괄호 닫기
if not stack or stack[-1] != '[':
is_balanced = False
break
stack.pop()
# 문자열을 다 돌았는데 스택에 여는 괄호가 남아있다면 불균형
if is_balanced and not stack:
print("yes")
else:
print("no")

# 입력
2
1
3
2
3
# 출력
6
10
sys.stdin.read())import sys
# 사용자가 여러 줄로 2 1 3 2 3 을 입력
data = sys.stdin.read().split()
print(data)
# 출력: ['2', '1', '3', '2', '3'] (작은따옴표가 붙은 문자열)
import sys
# 읽어온 문자열 리스트를 정수로 모두 변환한 뒤 다시 리스트로 묶음
data = list(map(int, sys.stdin.read().split()))
print(data)
# 출력: [2, 1, 3, 2, 3] (계산 가능한 진짜 숫자!)
import sys
input = sys.stdin.read
def solve_apart():
data = input().split()
if not data:
return
N = int(data[0])
num = 1
for _ in range(N):
k = int(data[num]) # 층
n = int(data[num+1]) # 호
num += 2
# 0층의 거주민 리스트 (1호부터 n호까지: 1, 2, 3... n)
people = [i for i in range(1, n + 1)]
for floor in range(k):
# 2호(인덱스 1)부터 n호까지 계산
for room in range(1, n):
# 이전 호수의 사람 수 + 아래층 현재 호수의 사람 수
people[room] += people[room - 1]
# 리스트의 가장 마지막 요소(n호) 출력
print(people[-1])
solve_apart()
import sys
import math
input = sys.stdin.read
def solve_math():
data = input().split()
if not data:
return
T = int(data[0])
idx = 1
for _ in range(T):
k = int(data[idx])
n = int(data[idx+1])
idx += 2
# math.comb를 사용하여 (k+n) C (k+1) 계산
result = math.comb(k + n, k + 1)
print(result)
if __name__ == '__main__':
solve_math()
if n % 2 != 0 and n % 3 != 0 and n % n == 0:import sys
input = sys.stdin.read
def solve_decimal(n):
if n != 1:
if n == 2 or n == 3:
print(n)
else:
if n % 2 != 0 and n % 3 != 0 and n % n == 0:
print(n)
else:
pass
M, N = map(int,input().split())
for i in range(M,N+1):
solve_decimal(i)
import sys
import math
input = sys.stdin.read
def solve_decimal(n):
if n == 1:
return False
# 2부터 n의 제곱근까지만 나누어 떨어지는지 확인
for i in range(2, int(math.sqrt(n)) + 1):
# 하나라도 나누어 떨어지면 소수가 아님
if n % i == 0:
return False
return True
data = input().split()
if data:
M, N = int(data[0]), int(data[1])
for i in range(M, N + 1):
if solve_decimal(i):
print(i)
import sys
input = sys.stdin.read
data = input().split()
if data:
M, N = int(data[0]), int(data[1])
# 1. 0부터 N까지 모든 숫자를 소수(True)라고 가정한 리스트 생성
sieve = [True] * (N + 1)
sieve[0] = sieve[1] = False # 0과 1은 소수가 아님
# 2. 에라토스테네스의 체 로직 적용
for i in range(2, int(N**0.5) + 1):
if sieve[i]: # i가 소수라면
# i의 배수들을 모두 지운다(False)
for j in range(i * i, N + 1, i):
sieve[j] = False
# 3. M부터 N까지 True인 인덱스만 출력
for i in range(M, N + 1):
if sieve[i]:
print(i)
# 입력
8
4
3
6
8
7
5
2
1
# 출력
+
+
+
+
-
-
+
+
-
+
+
-
-
-
-
-

import sys
def solve_stack():
data = sys.stdin.read().split()
if not data:
return
n = int(data[0])
targets = [int(i) for i in data[1:]]
stack = []
result = []
current = 1 # 스택에 Push할 오름차순 숫자
for target in targets:
# 1. 목표 숫자에 도달할 때까지 스택에 push
while current <= target:
stack.append(current)
result.append('+')
current += 1
# 2. 스택의 맨 위(top)가 목표 숫자와 같다면 pop
if stack[-1] == target:
stack.pop()
result.append('-')
else:
# 3. 스택의 맨 위가 목표 숫자와 다르다면 수열 생성 불가
print("NO")
return
for op in result:
print(op)
solve_stack()
# 입력
3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
# 해석
1 0: 문서가 1개 있고, 궁금한 문서는 0번째(첫 번째)에 있음
4 2: 문서가 4개 있고, 궁금한 문서는 2번째(인덱스 0부터 시작)에 있음
6 0: 문서가 6개 있고, 궁금한 문서는 0번째에 있음
# 출력
1
2
5
[(1, 0), (2, 1), (3, 2), (4, 3)] (값, 원래 위치)
[(1,0), (1,1), (9,2), (1,3), (1,4), (1,5)]
for i, fruit in enumerate([1,2,3]):
print(i, fruit)
# 출력
0 1
1 2
2 3
from collections import deque
import sys
def solve_queue():
# 테스트 케이스 수
N = int(sys.stdin.readline())
for _ in range(N):
# A: 문서 개수, B: 궁금한 문서의 위치
A, B = map(int, sys.stdin.readline().split())
# (중요도, 초기 인덱스)
importance = list(map(int, sys.stdin.readline().split()))
queue = deque([(p, i) for i, p in enumerate(importance)])
count = 0 # 인쇄 순서
while queue:
# 1. 가장 앞에 있는 문서 꺼내기
current = queue.popleft()
# 2. 큐에 현재 문서보다 중요도가 높은 문서가 있는지 확인
if any(current[0] < i[0] for i in queue):
# 더 높은 게 있다면 가장 뒤로 보냄
queue.append(current)
else:
# 3. 현재 문서가 가장 중요하다면 인쇄
count += 1
# 만약 이 문서가 찾던 인덱스라면 종료
if current[1] == B:
print(count)
break
solve_queue()
# 입력
Fizz # (어떤 숫자의 위치 i)
Buzz # (위치 i + 1)
11 # (위치 i + 2)
# 출력
Fizz
.isdigit()# 28702
import sys
# strip 습관적으로 붙이기 연습
words = [sys.stdin.readline().strip() for _ in range(3)]
num = 0
for i in range(3):
# 입력값이 숫자인지 확인
if words[i].isdigit():
# 해당 위치의 숫자를 기준으로 4번째에 올 숫자 계산
num = int(words[i]) + (3 - i)
break
# FizzBuzz 판별
if num % 3 == 0 and num % 5 == 0:
print("FizzBuzz")
elif num % 3 == 0:
print("Fizz")
elif num % 5 == 0:
print("Buzz")
else:
print(num)
def solve_bee_house(N):
if N == 1:
return 1
layer = 1 # 현재 겹
max_num = 1 # 현재 겹의 마지막 방 번호
while N > max_num:
max_num += 6 * layer # 다음 겹의 마지막 번호로 갱신 (6의 배수씩 증가)
layer += 1 # 거리 증가
return layer
N = int(input())
print(solve_bee_house(N))
다항식 롤링 해시(Polynomial Rolling Hash) 함수의 구현을 요구
# 입력
5 # 길이
abcde # 입력된 문자열
# 출력
4739715
# 해석
a = 1, b = 2, c = 3, d = 4, e = 5 # 각 알파벳에 부여된 고유 번호
1 × 310 + 2 × 311 + 3 × 312 + 4 × 313 + 5 × 314 = 1 + 62 + 2883 + 119164 + 4617605 = 4739715이다.

ord()chr() (chr(97)을 입력하면 문자 'a'를 반환)# 알파벳 소문자 'a'부터 'z'까지는 97부터 122까지 순서대로 1씩 증가하는 숫자가 배정되어 있음
print(ord('a')) # 출력: 97
print(ord('b')) # 출력: 98
print(ord('A')) # 출력: 65
print(ord('0')) # 출력: 48
ascii_num = ord(s[i]) - ord('a') + 1
# 만약 문자열 s[i]가 'a'라면
ord('a') - ord('a') + 1
= 97 - 97 + 1
= 1
# 만약 문자열 s[i]가 'b'라면:
ord('b') - ord('a') + 1
= 98 - 97 + 1
= 2
# 만약 문자열 s[i]가 'z'라면
ord('z') - ord('a') + 1
= 122 - 97 + 1
= 26
import sys
def solve_hashing():
# 입력 받기
L = int(sys.stdin.readline())
s = sys.stdin.readline().strip()
answer = 0
r = 31
# 문제의 조건
M = 1234567891
for i in range(L):
# 'a'=1, 'b'=2... 로 변환
ascii_num = ord(s[i]) - ord('a') + 1
# 공식 그대로 적용하여 더하기
answer += ascii_num * (r ** i)
# 문제에 주어진 조건으로 나눔
print(answer % M)
solve_hashing()
# 입력
9788968322*73
# 출력
2

*의 가중치가 3이라면x에 3을 곱한 값의 일의 자리가 8이 되어야 함3 X * 의 끝자리가 8로 끝나는 수(x=6, 3 X 6 = 18)를 찾아야 함N = list(str(input()))
odd_num=0
even_num=0
r_li=[]
# 홀수
for i in list(range(0,13,2)):
if N[i] != '*':
odd_num += int(N[i])*1
else:
r_li.append('*')
# 짝수
for j in list(range(1,12,2)):
if N[j] != '*':
even_num += int(N[j])*3
else:
r_li.append('***')
result_sum = odd_num + even_num
if result_sum % 10 == 0:
print(0)
else:
for k in range(1,10):
if (result_sum + k) % 10 == 0:
if len(r_li[0]) == 1:
print(int(k/1))
else:
print(int(k/3))
N = list(str(input()))
odd_num=0
even_num=0
r_li=[]
# 홀수
for i in list(range(0,13,2)):
if N[i] != '*':
odd_num += int(N[i])*1
else:
r_li.append('*')
# 짝수
for j in list(range(1,12,2)):
if N[j] != '*':
even_num += int(N[j])*3
else:
r_li.append('***')
result_sum = odd_num + even_num
# '*' 길이에 따라 1 또는 3
weight = 1 if len(r_li[0]) == 1 else 3
for k in range(10):
if (result_sum + k * weight) % 10 == 0:
print(k)
break
def solve_brute_force(isbn):
total_sum = 0
star_weight = 0
# 1. '*'를 제외한 나머지 수의 합과 '*'의 가중치(1 또는 3)를 구합니다.
for i in range(13):
# 파이썬 인덱스는 0부터 시작하므로, 짝수 인덱스가 홀수 번째 자리가 됩니다.
weight = 1 if i % 2 == 0 else 3
if isbn[i] == '*':
star_weight = weight
else:
total_sum += int(isbn[i]) * weight
# 2. 0부터 9까지 직접 대입하며 10의 배수인지 확인합니다.
for x in range(10):
if (total_sum + x * star_weight) % 10 == 0:
return x
# 입력 처리
isbn_input = input().strip()
print(solve_brute_force(isbn_input))
def solve_math(isbn):
total_sum = 0
star_weight = 0
for i in range(13):
weight = 1 if i % 2 == 0 else 3
if isbn[i] == '*':
star_weight = weight
else:
total_sum += int(isbn[i]) * weight
# 현재 합에서 10의 배수를 만들기 위해 부족한 값을 구합니다.
remainder_needed = (10 - (total_sum % 10)) % 10
# 가중치가 1인 경우, 부족한 값 자체가 정답입니다.
if star_weight == 1:
return remainder_needed
# 가중치가 3인 경우, 3x ≡ remainder_needed (mod 10)을 만족하는 x를 찾습니다.
# 양변에 3의 모듈러 역원인 7을 곱해주면 x를 바로 구할 수 있습니다.
else:
return (remainder_needed * 7) % 10
# 입력 처리
isbn_input = input().strip()
print(solve_math(isbn_input))
round() 사용# 기본 사용법: round(숫자, 정밀도)
print(round(2.5)) # 결과: 2 (짝수인 2로 내림)
print(round(3.5)) # 결과: 4 (짝수인 4로 올림)
print(round(4.5)) # 결과: 4 (짝수인 4로 내림)
# 소수점 자리수 지정
print(round(3.14159, 2)) # 결과: 3.14
decimal 모듈 사용 (정밀한 사사오입)from decimal import Decimal, ROUND_HALF_UP
def traditional_round(number):
# 숫자를 Decimal 객체로 변환 후, ROUND_HALF_UP 방식으로 정수화
return int(Decimal(str(number)).quantize(Decimal('1'), rounding=ROUND_HALF_UP))
print(traditional_round(2.5)) # 결과: 3
print(traditional_round(3.5)) # 결과: 4
def manual_round(n):
return int(n + 0.5)
print(manual_round(2.5)) # 결과: 3
print(manual_round(3.4)) # 결과: 3
from collections import Counter
# 과일 바구니 (리스트)
arr = ['apple', 'banana', 'apple', 'cherry', 'apple', 'banana']
# Counter에게 개수를 세어달라고 부탁
count_result = Counter(arr)
print(count_result)
# 출력: Counter({'apple': 3, 'banana': 2, 'cherry': 1})
# 특정 원소의 개수만 따로 확인할 수도 있습니다.
print(count_result['apple']) # 출력: 3
most_common()# 가장 많이 등장한 상위 2개의 데이터를 추출
top_2 = count_result.most_common(2)
print(top_2)
# 출력: [('apple', 3), ('banana', 2)]
# 2108
from decimal import Decimal, ROUND_HALF_UP
import math
from collections import Counter
import sys
input = sys.stdin.readline
# 반올림
def traditional_round(number):
return int(Decimal(str(number)).quantize(Decimal('1'), rounding=ROUND_HALF_UP))
# 최빈값
def solve_counter(arr):
# 1. 오름차순 정렬
arr.sort()
# 2. Counter를 사용해 빈도수를 계산
counter = Counter(arr)
# 3. most_common()이라는 전용 메서드 사용
result = counter.most_common()
# 4. 최빈값이 2개 이상이고, 1위와 2위의 빈도수가 같다면 두 번째로 작은 값 반환
if len(result) > 1 and result[0][1] == result[1][1]:
return result[1][0]
else:
return result[0][0]
N = int(input())
M = [int(input()) for _ in range(N)]
# 1. 산술평균
print(traditional_round(sum(M)/N))
# 2. 중앙값
M.sort()
print(M[math.floor(N/2)])
# 3. 최빈값
print(solve_counter(M))
# 4. 범위
print(max(M)-min(M))

import sys
input = sys.stdin.readline
N = int(input())
M = [int(input()) for _ in range(N)]
# 🌟 처음에 한 번만 정렬합니다. (중앙값, 최빈값, 범위 모두에 재사용)
M.sort()
# 1. 산술평균
# (작성해주신 decimal 방식이 가장 안전하지만, 여기서는 내장 round를 사용해 봅니다)
print(int(round(sum(M) / N, 0)))
# 2. 중앙값 (몫 연산자 '//' 사용)
print(M[N // 2])
# 3. 최빈값 (기본 딕셔너리 사용)
freq_dict = {}
for num in M:
freq_dict[num] = freq_dict.get(num, 0) + 1 # 없으면 0, 있으면 +1
max_freq = max(freq_dict.values()) # 가장 높은 빈도수 찾기
modes = []
# M이 이미 오름차순 정렬되어 있으므로, 딕셔너리에도 작은 숫자부터 차례대로 쌓여 있습니다.
# (참고: Python 3.7 이상부터는 딕셔너리가 데이터 삽입 순서를 보장합니다)
for num, freq in freq_dict.items():
if freq == max_freq:
modes.append(num)
if len(modes) > 1:
print(modes[1]) # 두 번째로 작은 값
else:
print(modes[0])
# 4. 범위 (정렬된 배열의 맨 끝 값 - 맨 앞 값)
print(M[-1] - M[0])

import sys
input = sys.stdin.readline
N = int(input())
# -4000 ~ 4000을 인덱스 0 ~ 8000으로 매핑할 빈도수 배열
count_arr = [0] * 8001
total_sum = 0
max_val = -4001
min_val = 4001
# 입력을 받으면서 동시에 합계, 최대/최소, 빈도수를 기록합니다 O(N)
for _ in range(N):
num = int(input())
count_arr[num + 4000] += 1
total_sum += num
if num > max_val: max_val = num
if num < min_val: min_val = num
# 1. 산술평균
print(int(round(total_sum / N, 0)))
# 중앙값과 최빈값을 찾기 위한 변수 초기화
median = 4001
modes = []
max_freq = max(count_arr)
current_count = 0
# 빈도수 배열을 순회하며 중앙값과 최빈값 찾기 O(1) (항상 8001번만 반복)
for i in range(8001):
if count_arr[i] > 0:
# 중앙값: 누적 개수가 N // 2 + 1개째가 되는 순간의 숫자
if current_count < (N // 2 + 1):
current_count += count_arr[i]
if current_count >= (N // 2 + 1):
median = i - 4000
# 최빈값 리스트에 추가
if count_arr[i] == max_freq:
modes.append(i - 4000)
# 2. 중앙값 출력
print(median)
# 3. 최빈값 출력
if len(modes) > 1:
print(modes[1])
else:
print(modes[0])
# 4. 범위 출력
print(max_val - min_val)
클래스 2 졸업!

add xremove xcheck xtoggle xallempty# 입력
26
add 1
add 2 [1,2]
check 1 # 1
check 2 # 1
check 3 # 0
remove 2 [1]
check 1 # 1
check 2 # 0
toggle 3 [1,3]
check 1 # 1
check 2 # 0
check 3 # 1
check 4 # 0
all [1,2, ... 20]
check 10 # 1
check 20 # 1
toggle 10 [1,2, ... 9 ... 20]
remove 20 [1,2, ... 9 ... 19]
check 10 # 1
check 20 # 0
empty []
check 1 # 0
toggle 1 [1]
check 1 # 1
toggle 1 []
check 1 # 0
# 출력
1
1
0
1
0
1
0
1
0
1
1
0
0
0
1
0
# add 1 / all 이런식으로 입력받기
command = input().split()
import sys
def solve_set():
input = sys.stdin.readline
M = int(input())
s = set()
for _ in range(M):
command = input().split()
# all / empty 만 1개
if len(command) == 1:
if command[0] == "all":
s = set([i for i in range(1, 21)])
else:
s = set()
else:
op, x = command[0], int(command[1])
if op == "add":
s.add(x)
elif op == "remove":
s.discard(x)
elif op == "check":
print(1 if x in s else 0)
elif op == "toggle":
if x in s:
s.discard(x)
else:
s.add(x)
solve_set()
import sys
def solve_with_bitmask():
input = sys.stdin.readline
M = int(input())
# 0으로 초기화 (공집합)
S = 0
for _ in range(M):
command = input().split()
if len(command) == 1:
if command[0] == "all":
# 1~20번째 비트를 모두 1로 만듦
S = (1 << 21) - 1
else: # "empty"
S = 0
else:
op, x = command[0], int(command[1])
if op == "add":
S |= (1 << x) # x번째 비트를 1로 켬 (OR 연산)
elif op == "remove":
S &= ~(1 << x) # x번째 비트를 0으로 끔 (AND, NOT 연산)
elif op == "check":
if S & (1 << x): # x번째 비트가 1인지 확인 (AND 연산)
print(1)
else:
print(0)
elif op == "toggle":
S ^= (1 << x) # x번째 비트를 반전 (XOR 연산)
solve_with_bitmask()
# 입력
26 5
Bulbasaur
Ivysaur
Venusaur
Charmander
Charmeleon
Charizard
Squirtle
Wartortle
Blastoise
Caterpie
Metapod
Butterfree
Weedle
Kakuna
Beedrill
Pidgey
Pidgeotto
Pidgeot
Rattata
Raticate
Spearow
Fearow
Ekans
Arbok
Pikachu
Raichu # N = 26 끝
25 # M = 5 시작
Raichu
3
Pidgey
Kakuna
# 출력
Pikachu
26
Venusaur
16
14
A = [""] * (5) # ['', '', '', '', '']
A[1] = B # ['', 'B', '', '', '']
"""
[입력 예시 시나리오]
3 4 <-- N(포켓몬 수: 3), M(문제 수: 4)
Bulbasaur <-- 1번 포켓몬
Ivysaur <-- 2번 포켓몬
Venusaur <-- 3번 포켓몬
2 <-- 문제 1: 숫자 (2번 포켓몬 이름 출력)
Venusaur <-- 문제 2: 문자 (Venusaur의 번호 출력)
1 <-- 문제 3: 숫자 (1번 포켓몬 이름 출력)
Bulbasaur <-- 문제 4: 문자 (Bulbasaur의 번호 출력)
"""
input = sys.stdin.readline
# n = 3, m = 4 가 저장
n, m = map(int, input().split())
# 두 개의 자료구조를 사용
id_to_name = [""] * (n + 1) # 인덱스 -> 이름 (배열)
name_to_id = {} # 이름 -> 인덱스 (딕셔너리)
# 1. 포켓몬 도감 입력 받기
for i in range(1, n + 1):
name = input().rstrip()
id_to_name[i] = name
name_to_id[name] = i
# 데이터 저장 결과 (예시 기준):
# id_to_name = ['', 'Bulbasaur', 'Ivysaur', 'Venusaur']
# name_to_id = {'Bulbasaur': 1, 'Ivysaur': 2, 'Venusaur': 3}
import sys
def solve_with_hashmap():
"""
[입력 예시 시나리오]
3 4 <-- N(포켓몬 수: 3), M(문제 수: 4)
Bulbasaur <-- 1번 포켓몬
Ivysaur <-- 2번 포켓몬
Venusaur <-- 3번 포켓몬
2 <-- 문제 1: 숫자 (2번 포켓몬 이름 출력)
Venusaur <-- 문제 2: 문자 (Venusaur의 번호 출력)
1 <-- 문제 3: 숫자 (1번 포켓몬 이름 출력)
Bulbasaur <-- 문제 4: 문자 (Bulbasaur의 번호 출력)
"""
# 빠른 입력을 위해 sys.stdin.readline 사용
input = sys.stdin.readline
# 예시 기준: n = 3, m = 4 가 저장됩니다.
n, m = map(int, input().split())
# 두 개의 자료구조를 사용합니다.
id_to_name = [""] * (n + 1) # 인덱스 -> 이름 (배열)
name_to_id = {} # 이름 -> 인덱스 (딕셔너리)
# 1. 포켓몬 도감 입력 받기
for i in range(1, n + 1):
name = input().rstrip()
id_to_name[i] = name
name_to_id[name] = i
# 데이터 저장 결과 (예시 기준):
# id_to_name = ['', 'Bulbasaur', 'Ivysaur', 'Venusaur']
# name_to_id = {'Bulbasaur': 1, 'Ivysaur': 2, 'Venusaur': 3}
result = []
# 2. 문제 풀기 (총 4번 반복)
for _ in range(m):
query = input().rstrip()
# 쿼리가 숫자인지 문자열인지 판별합니다.
if query.isdigit():
# 예: query가 "2" 라면
# int(query)는 2가 되고, id_to_name[2]인 "Ivysaur"가 추가됨
result.append(id_to_name[int(query)])
else:
# 예: query가 "Venusaur" 라면
# name_to_id["Venusaur"] 값인 3이 문자열 "3"으로 변환되어 추가됨
result.append(str(name_to_id[query]))
# 최종 결과 출력 (예시 기준):
# Ivysaur
# 3
# Bulbasaur
# 1
print('\n'.join(result))
if __name__ == "__main__":
solve_with_hashmap()
import sys
def solve_pokemon():
input = sys.stdin.readline
n, m = map(int, input().split())
id_to_name = [""] * (n + 1) # ['', '', '', '', ''...]
name_to_id = {} # {'' : 1, ...}
for i in range(1, n + 1):
name = input().rstrip()
id_to_name[i] = name
name_to_id[name] = i
result = []
for _ in range(m):
ans = input().rstrip()
# 쿼리가 숫자인지 문자열인지 판별
if ans.isdigit():
result.append(id_to_name[int(ans)])
else:
result.append(str(name_to_id[ans]))
print('\n'.join(result))
solve_pokemon()
import sys
from bisect import bisect_left
def solve_with_binary_search():
input = sys.stdin.readline
n, m = map(int, input().split())
original_arr = [""] * (n + 1)
sorted_arr = []
for i in range(1, n + 1):
name = input().rstrip()
original_arr[i] = name
# (포켓몬 이름, 원래 인덱스) 형태로 저장
sorted_arr.append((name, i))
# 이름을 기준으로 오름차순 정렬 (이진 탐색을 위함)
sorted_arr.sort()
# 이진 탐색을 위한 키(이름)만 따로 분리
keys = [item[0] for item in sorted_arr]
result = []
for _ in range(m):
query = input().rstrip()
if query.isdigit():
# 번호가 주어지면 원본 배열에서 즉시 찾음
result.append(original_arr[int(query)])
else:
# 이름이 주어지면 이진 탐색으로 위치를 찾음
idx = bisect_left(keys, query)
# 찾은 위치에서 원래 인덱스를 추출
result.append(str(sorted_arr[idx][1]))
print('\n'.join(result))
if __name__ == "__main__":
solve_with_binary_search()
# 11047
import sys
input = sys.stdin.readline
N, K = map(int,input().split())
li = [int(input()) for _ in range(N)]
num=0
for i in reversed(li):
if i > K:
pass
else:
while True:
if i <= K:
K -= i
num +=1
else:
break
print(num)
for i in reversed(li):
while True:
if i <= K:
K -= i # 1. 반복적으로 뺄셈 수행
num += 1
else:
break
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
li = [int(input()) for _ in range(N)]
num = 0
for i in reversed(li):
if K == 0:
break
if i <= K:
# K원을 i원짜리 동전으로 나눈 몫이 사용되는 동전의 개수
num += K // i
# 남은 금액을 K에 다시 저장
K %= i
print(num)
# 입력
5
3 1 4 3 2
# 출력
32
# 해석
[1,2,3,4,5]
3 + 4 + 8 + 11 + 13 = 39
[2,5,1,4,3,]
1 + 3 + 6 + 9 + 13 = 32 (최소값)
import sys
input = sys.stdin.readline
N = int(input())
M = list(map(int,input().split()))
M.sort()
result = 0
for i in range(1,N+1):
result += sum(M[:i])
print(result)
sys.stdin.readline은 입력받을 때 맨 끝의 줄바꿈 문자(\n)까지 함께 읽어옴i == j[0]를 비교할 때'site.com\n' == 'site.com'이 되어 두 값이 영원히 같아질 수 없어 출력 불가# 17219
import sys
input = sys.stdin.readline
N,M = map(int,input().split())
li = [input().split() for _ in range(N)]
li_2 = [input() for _ in range(M)]
for i in li_2:
for j in li:
if i == j[0]:
print(j[1])
else:
pass
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
passwords = {}
# N개의 사이트와 비밀번호를 딕셔너리에 저장
for _ in range(N):
site, pwd = input().split()
passwords[site] = pwd
# M개의 사이트에 대한 비밀번호 출력
for _ in range(M):
# 줄바꿈 문자(\n)를 제거
target_site = input().rstrip()
print(passwords[target_site])
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
li = [input().split() for _ in range(N)]
# 이분 탐색을 위해 사이트명(알파벳) 기준으로 리스트를 정렬합니다.
li.sort(key=lambda x: x[0])
for _ in range(M):
target_site = input().rstrip()
# 이분 탐색 알고리즘
start, end = 0, N - 1
while start <= end:
mid = (start + end) // 2
if li[mid][0] == target_site:
print(li[mid][1])
break
elif li[mid][0] < target_site:
start = mid + 1
else:
end = mid - 1
# 입력
3
0
1
3
# 출력
1 0
0 1
1 2
# 해석(f())
f(0) = 0을 호출하고 끝
f(1) = 1을 호출하고 끝
f(3) = f(2) + f(1)
f(2) = f(1) + f(0)
f(2) = 0을 한번 1을 한번 호출
f(3) = 0을 한번 1을 두번 호출 = 1 2
import sys
def solve_fibonaccii():
input = sys.stdin.read
data = input().split()
T = int(data[0])
N = [int(i) for i in data[1:]]
for j in N:
count_0 = [1, 0]
count_1 = [0, 1]
if j >= 2:
for k in range(2, j + 1):
count_0.append(count_0[k-1] + count_0[k-2])
count_1.append(count_1[k-1] + count_1[k-2])
print(f"{count_0[j]} {count_1[j]}")
solve_fibonaccii()
def fibonacci_optimized():
t = int(input("테스트 케이스 수를 입력하세요: "))
for _ in range(t):
n = int(input())
# 초기 변수 설정 (N=0일 때의 0 호출 횟수, 1 호출 횟수)
zero_count = 1
one_count = 0
# N번 만큼 반복하며 값을 갱신
for _ in range(n):
# 다음 0의 횟수는 현재 1의 횟수와 같고,
# 다음 1의 횟수는 현재 0과 1의 횟수를 더한 것과 같음
zero_count, one_count = one_count, zero_count + one_count
print(f"{zero_count} {one_count}")
# 실행
# fibonacci_optimized()
N = int(input())
result = 0
while N == 1:
if N % 3==0:
N /= 3
result +=1
elif N % 2==0:
N /= 2
result +=1
else:
N -=1
result +=1
print(result)

N = int(input())
# dp 배열 초기화: 길이를 N+1로 설정하여 인덱스가 곧 해당 숫자를 의미하도록 함
# dp[i]는 i를 1로 만드는 데 필요한 최소 연산 횟수
dp = [0] * (N + 1)
# 2부터 N까지 차례대로 최소 횟수를 구해 나감
for i in range(2, N + 1):
# 1. 먼저 1을 빼는 경우의 연산 횟수를 가져옵니다. (+1은 이번 연산 횟수 추가)
dp[i] = dp[i - 1] + 1
# 2. 2로 나누어 떨어지는 경우, 기존 횟수와 2로 나누었을 때의 횟수 중 최솟값을 선택
if i % 2 == 0:
dp[i] = min(dp[i], dp[i // 2] + 1)
# 3. 3으로 나누어 떨어지는 경우, 현재까지의 최솟값과 3으로 나누었을 때의 횟수 중 최솟값을 선택
if i % 3 == 0:
dp[i] = min(dp[i], dp[i // 3] + 1)
print(dp[N])

# 솔루션 2: BFS (Queue 활용)
from collections import deque
N = int(input())
def bfs(start):
# (현재 숫자, 연산 횟수) 형태로 큐에 저장
queue = deque([(start, 0)])
visited = set([start]) # 이미 계산한 숫자는 다시 계산하지 않도록 방문 처리
while queue:
current, count = queue.popleft()
# 1에 도달하면 현재까지의 연산 횟수를 반환하고 종료
if current == 1:
return count
# 3가지 연산을 모두 큐에 넣고 탐색
# 연산 결과가 1 이상이고 아직 방문하지 않은 숫자라면 큐에 추가
if current % 3 == 0 and (current // 3) not in visited:
visited.add(current // 3)
queue.append((current // 3, count + 1))
if current % 2 == 0 and (current // 2) not in visited:
visited.add(current // 2)
queue.append((current // 2, count + 1))
if (current - 1) not in visited:
visited.add(current - 1)
queue.append((current - 1, count + 1))
print(bfs(N))
from datetime import date
print(date.today())
# 정수 및 실수 사용 예시
num1 = -10
num2 = 3.14
num3 = -5.5
print(abs(num1)) # 출력: 10
print(abs(num2)) # 출력: 3.14
print(abs(num3)) # 출력: 5.5
import sys
input = sys.stdin.readline
N,M = map(int,input().split())
print(abs(N-M))
N = str(input())
print(N.swapcase())
N = dict(zip
(
["A+","A0","A-","B+","B0","B-","C+","C0","C-","D+","D0","D-","F"],
[4.3,4.0,3.7,3.3,3.0,2.7,2.3,2.0,1.7,1.3,1.0,0.7,0.0]
)
)
M = list(N.items())
L = str(input())
for i in M:
if L == i[0]:
print(i[1])
else:
pass
기호는 @으로, A@B = (A+B)×(A-B)
# 15964
import sys
def solve_function(A,B):
N = (A+B)*(A-B)
print(N)
input = sys.stdin.readline
A, B = map(int,input().split())
solve_function(A,B)
# 1927
import sys
import heapq
input = sys.stdin.readline
n = int(input())
li = []
for _ in range(n):
x = int(input())
if x == 0:
if len(li) == 0:
print(0)
else:
print(heapq.heappop(li))
else:
heapq.heappush(li, x)
# 11279
import sys
import heapq
input = sys.stdin.readline
n = int(input())
li = []
for _ in range(n):
x = int(input())
if x == 0:
if len(li) == 0:
print(0)
else:
print(-heapq.heappop(li))
else:
heapq.heappush(li, -x)
matrix[v][i] == 1)" 하고 묻는 과정for i in graph[v]: 라는 반복문이 쓰임graph[v])에 있는 사람들만 쏙쏙 빼서 확인graph[i].sort())해두는 과정이 꼭 필요import sys
from collections import deque
def dfs_matrix(v):
visited_dfs[v] = True
print(v, end=' ')
# 1번 정점부터 V번 정점까지 순서대로 확인 (자동으로 번호가 작은 순서대로 방문)
for i in range(1, V + 1):
if not visited_dfs[i] and matrix[v][i] == 1:
dfs_matrix(i)
def bfs_matrix(start):
queue = deque([start])
visited_bfs[start] = True
while queue:
v = queue.popleft()
print(v, end=' ')
for i in range(1, V + 1):
if not visited_bfs[i] and matrix[v][i] == 1:
queue.append(i)
visited_bfs[i] = True
# 입력 받기
input = sys.stdin.readline
V, E, start = map(int, input().split())
# 인접 행렬 초기화 (정점 번호가 1부터 시작하므로 V+1 크기로 생성)
matrix = [[0] * (V + 1) for _ in range(V + 1)]
visited_dfs = [False] * (V + 1)
visited_bfs = [False] * (V + 1)
# 간선 정보 입력
for _ in range(E):
u, v = map(int, input().split())
matrix[u][v] = 1
matrix[v][u] = 1 # 양방향 간선
dfs_matrix(start)
print()
bfs_matrix(start)
import sys
from collections import deque
def dfs_list(v):
visited_dfs[v] = True
print(v, end=' ')
# 연결된 정점들만 순회
for i in graph[v]:
if not visited_dfs[i]:
dfs_list(i)
def bfs_list(start):
queue = deque([start])
visited_bfs[start] = True
while queue:
v = queue.popleft()
print(v, end=' ')
for i in graph[v]:
if not visited_bfs[i]:
queue.append(i)
visited_bfs[i] = True
# 입력 받기
input = sys.stdin.readline
V, E, start = map(int, input().split())
# 인접 리스트 초기화
graph = [[] for _ in range(V + 1)]
visited_dfs = [False] * (V + 1)
visited_bfs = [False] * (V + 1)
# 간선 정보 입력
for _ in range(E):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u) # 양방향 간선
# 방문할 수 있는 정점이 여러 개인 경우 작은 번호부터 방문하기 위해 정렬
for i in range(1, V + 1):
graph[i].sort()
dfs_list(start)
print()
bfs_list(start)
import sys
from collections import deque
def dfs_matrix(v):
visited_dfs[v] = True
print(v, end=' ') # 방문한 정점 출력 (예: 1 -> 2 -> 4 -> 3 순서로 출력됨)
# 1번 정점부터 V(4)번 정점까지 순서대로 표를 확인
for i in range(1, V + 1):
if not visited_dfs[i] and matrix[v][i] == 1:
dfs_matrix(i)
def bfs_matrix(start):
queue = deque([start])
visited_bfs[start] = True
while queue:
v = queue.popleft()
print(v, end=' ') # 큐에서 꺼낸 정점 출력 (예: 1 -> 2 -> 3 -> 4 순서로 출력됨)
for i in range(1, V + 1):
if not visited_bfs[i] and matrix[v][i] == 1:
queue.append(i)
visited_bfs[i] = True
# ----------------- 실행 및 결과 -----------------
# 입력: V=4, E=5, start=1
V, E, start = 4, 5, 1
# [데이터 저장 상태] 간선 정보를 입력받아 만든 인접 행렬의 최종 모습
# (가로세로 0번 인덱스는 사용하지 않으므로 모두 0입니다.)
matrix = [
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1], # 1번 정점은 2, 3, 4번과 연결됨 (행렬[1][2], [1][3], [1][4]가 1)
[0, 1, 0, 0, 1], # 2번 정점은 1, 4번과 연결됨
[0, 1, 0, 0, 1], # 3번 정점은 1, 4번과 연결됨
[0, 1, 1, 1, 0] # 4번 정점은 1, 2, 3번과 연결됨
]
visited_dfs = [False] * 5
visited_bfs = [False] * 5
# 1. DFS 실행
dfs_matrix(start)
# [DFS 출력 결과]: 1 2 4 3
# 과정: 1방문 -> 1의 연결인 2방문 -> 2의 연결인 4방문 -> 4의 연결 중 남은 3방문
print() # 줄바꿈
# 2. BFS 실행
bfs_matrix(start)
# [BFS 출력 결과]: 1 2 3 4
# 과정: 1방문 -> 1과 직접 연결된 2, 3, 4를 모두 큐에 넣음 -> 큐에서 순서대로 2, 3, 4를 꺼내며 방문
import sys
from collections import deque
def dfs_list(v):
visited_dfs[v] = True
print(v, end=' ') # 방문한 정점 출력 (예: 1 -> 2 -> 4 -> 3)
# 개인 연락처에 있는 번호만 꺼내서 확인
for i in graph[v]:
if not visited_dfs[i]:
dfs_list(i)
def bfs_list(start):
queue = deque([start])
visited_bfs[start] = True
while queue:
v = queue.popleft()
print(v, end=' ') # 큐에서 꺼낸 정점 출력 (예: 1 -> 2 -> 3 -> 4)
for i in graph[v]:
if not visited_bfs[i]:
queue.append(i)
visited_bfs[i] = True
# ----------------- 실행 및 결과 -----------------
V, E, start = 4, 5, 1
# [데이터 저장 상태] 간선 정보를 입력받고 정렬(sort)까지 완료된 인접 리스트의 최종 모습
# (0번 인덱스는 비어있습니다.)
graph = [
[],
[2, 3, 4], # 1번 정점의 연락처 (오름차순 정렬됨)
[1, 4], # 2번 정점의 연락처
[1, 4], # 3번 정점의 연락처
[1, 2, 3] # 4번 정점의 연락처
]
visited_dfs = [False] * 5
visited_bfs = [False] * 5
# 1. DFS 실행
dfs_list(start)
# [DFS 출력 결과]: 1 2 4 3
# 과정: 1방문 -> 리스트의 첫 번째인 2방문 -> 2의 리스트 첫 번째인 1은 이미 방문, 다음인 4방문 -> 4의 리스트 중 방문 안 한 3방문
print() # 줄바꿈
# 2. BFS 실행
bfs_list(start)
# [BFS 출력 결과]: 1 2 3 4
# 과정: 1방문 -> 1의 리스트에 있는 2, 3, 4를 모두 큐에 넣음 -> 큐에서 순서대로 2, 3, 4를 꺼내며 출력