자료 구성
업로드된 코드를 그대로 제시합니다.
입력부터 출력까지 단계적으로 설명합니다.
핵심 문법과 계산 원리를 상세히 풀이합니다.
오류 가능성과 더 좋은 작성 방법을 안내합니다.
표준 몸무게와 비만도 판정
키와 몸무게를 입력받아 키 구간에 따라 표준 몸무게를 계산한 뒤, 실제 몸무게가 표준 몸무게보다 얼마나 차이 나는지를 백분율로 계산하여 정상·과체중·비만으로 분류합니다.
실행 흐름
- 키와 몸무게를 공백으로 구분하여 입력받습니다.
- 키에 따라 서로 다른 표준 몸무게 공식을 적용합니다.
- 비만도 = (실제 몸무게 - 표준 몸무게) ÷ 표준 몸무게 × 100으로 계산합니다.
- 비만도가 10 이하이면 정상, 20 이하이면 과체중, 그보다 크면 비만으로 출력합니다.
입출력·계산 예시
입력: 170 70 표준 몸무게: (170-100)×0.9 = 63 비만도: (70-63)×100÷63 ≈ 11.11 출력: 과체중
원본 코드
# 입력 처리
h,w = input().split()
h = float(h)
w = float(w)
# 키에 따른 표준 몸무게 계산
if h<150:
stdw = h-100
elif h<160:
stdw = (h-150)/2+50
else:
stdw = (h-100)*0.9
# 비만도 계산
bmi = (w-stdw)*100/stdw
# 비만도 판정
if bmi<=10:
print("정상")
elif bmi<=20:
print("과체중")
else:
print("비만")
구문별 상세 설명
| 구문 | 설명 |
|---|---|
h, w = input().split() | 입력 한 줄을 공백 기준으로 나누어 키와 몸무게 문자열을 각각 저장합니다. |
h = float(h), w = float(w) | 소수 입력도 처리할 수 있도록 문자열을 실수형으로 변환합니다. |
if h < 150 | 키가 150cm 미만일 때 첫 번째 공식을 적용합니다. |
elif h < 160 | 앞 조건이 거짓이면서 160cm 미만이면 두 번째 공식을 적용합니다. |
else | 키가 160cm 이상인 모든 경우에 세 번째 공식을 적용합니다. |
bmi = (w-stdw)*100/stdw | 표준 몸무게 대비 실제 몸무게 차이를 백분율로 계산합니다. 일반적인 BMI 공식과는 다른 ‘비만도’ 계산식입니다. |
if bmi <= 10 | 비만도 10 이하를 정상으로 분류합니다. |
elif bmi <= 20 | 10 초과 20 이하를 과체중으로 분류합니다. |
else | 20 초과를 비만으로 분류합니다. |
변수 이름 bmi는 일반적인 체질량지수 BMI와 혼동될 수 있습니다. obesity_rate 또는 obesity_degree처럼 의미가 분명한 이름이 더 좋습니다.
일차방정식 ax+b=c 풀기
문자열 형태로 입력된 일차방정식 ax+b=c를 x와 = 기호를 기준으로 분리한 뒤, x=(c-b)/a 공식을 이용해 해를 계산합니다.
실행 흐름
- 방정식 문자열을 입력받습니다.
- x를 기준으로 계수 a와 나머지 식을 분리합니다.
- =를 기준으로 b와 c를 분리합니다.
- 세 값을 정수로 변환합니다.
- x=(c-b)/a로 해를 구하고 소수 둘째 자리까지 출력합니다.
입출력·계산 예시
입력: 2x3=11 계산: x=(11-3)/2=4 출력: 4.00
원본 코드
# 입력 처리(ax+b=c)
eq = input()
a,b = eq.split('x') # 'x'를 기준으로 문자열 분리
b,c = b.split('=') # '='를 기준으로 문자열 분리
# 정수로 자료형 변환
a = int(a)
b = int(b)
c = int(c)
# x값 구하기
x = (c-b)/a
# 출력 처리
print("{:.2f}".format(x)) # 반올림해서 출력
구문별 상세 설명
| 구문 | 설명 |
|---|---|
eq = input() | 예: 2x3=11 같은 문자열을 입력받습니다. |
a, b = eq.split('x') | 문자 x를 기준으로 왼쪽 계수와 오른쪽 문자열을 분리합니다. |
b, c = b.split('=') | 남은 문자열을 = 기준으로 다시 나눕니다. |
a = int(a), b = int(b), c = int(c) | 문자열을 정수로 바꾸어 계산 가능한 값으로 만듭니다. |
x = (c-b)/a | ax+b=c를 이항하여 x=(c-b)/a로 계산합니다. |
print("{:.2f}".format(x)) | 계산 결과를 소수점 둘째 자리까지 반올림하여 출력합니다. |
a가 0이면 0으로 나누는 오류가 발생합니다. 또한 -2x+3=11, 2x-3=11처럼 부호가 포함된 입력 형식도 명확히 정의해야 합니다.
윤년을 고려한 월의 마지막 날
연도와 월을 입력받고, 각 월의 일수를 저장한 리스트에서 해당 월의 마지막 날을 출력합니다. 2월은 윤년이면 29일로 바꿉니다.
실행 흐름
- 연도와 월을 정수로 입력받습니다.
- 1월부터 12월까지의 기본 일수를 리스트에 저장합니다.
- 입력 월이 2월이면 윤년 조건을 검사합니다.
- 윤년이면 2월의 일수를 1 증가시킵니다.
- 해당 월의 마지막 날을 출력합니다.
입출력·계산 예시
입력: 2024 2 2024는 4의 배수이며 100의 배수가 아니므로 윤년 출력: 29
원본 코드
# 입력 처리(연도, 월 입력 후 정수로 변환)
y, m = input().split()
y = int(y)
m = int(m)
# 각 월의 마지막 날 정리.
lastday = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if m==2: # 2월인 경우
if y%400==0 or y%4==0 and y%100!=0: # 윤달이면
lastday[2] += 1
# 마지막 날 출력
print(lastday[m])
구문별 상세 설명
| 구문 | 설명 |
|---|---|
lastday = [0, 31, 28, ...] | 월 번호와 인덱스를 맞추기 위해 0번 자리에 사용하지 않는 0을 넣었습니다. |
if m == 2 | 2월일 때만 윤년 계산이 필요하므로 조건을 제한합니다. |
y%400==0 or y%4==0 and y%100!=0 | 400의 배수이거나, 4의 배수이면서 100의 배수가 아니면 윤년입니다. |
lastday[2] += 1 | 평년의 28일에 1일을 더해 29일로 바꿉니다. |
print(lastday[m]) | 월 번호를 그대로 리스트 인덱스로 사용해 마지막 날을 출력합니다. |
월이 1~12 범위를 벗어나면 IndexError가 발생할 수 있으므로 입력 범위 검사가 필요합니다.
철근 자재 번호 생성
전체 철근 길이 n을 한 개당 길이 k로 나누어 만들 수 있는 자재 수를 계산하고, F-0001 형식으로 번호를 출력합니다.
실행 흐름
- 전체 길이와 한 개당 길이를 입력받습니다.
- 정수 나눗셈으로 완성 가능한 자재 개수를 구합니다.
- 개수가 9999를 초과하는지 확인합니다.
- 가능하면 1번부터 count번까지 자재 번호를 출력합니다.
- 초과하면 오류 메시지를 출력합니다.
입출력·계산 예시
입력: 100 20 count=5 출력: F-0001 F-0002 F-0003 F-0004 F-0005
원본 코드
# 입력 처리
n,k = input().split()
n = int(n)
k = int(k)
# 철근 길이로 자재 번호 계산
count = n//k
if count>9999: # 자재 번호가 9999를 초과하면
status = False # 오류 상태
else:
status = True # 출력 가능 상태
# 상태에 따라 출력
if status: # 출력 가능 상태이면
for x in range(1,count+1):
print("F-{:04d}".format(x)) # F-xxxx 형태로 출력
else:
print("번호 초과 오류")
구문별 상세 설명
| 구문 | 설명 |
|---|---|
count = n // k | 나머지를 버리고 완성 가능한 철근 개수만 계산합니다. |
if count > 9999 | 네 자리 번호 범위를 초과하는지 검사합니다. |
status = False / True | 출력 가능 여부를 불 값으로 저장합니다. |
for x in range(1, count+1) | 1부터 count까지 번호를 순서대로 생성합니다. |
"F-{:04d}".format(x) | 정수를 네 자리로 맞추고 빈 앞자리를 0으로 채웁니다. 예: 7 → F-0007 |
k가 0이면 ZeroDivisionError가 발생합니다. n과 k가 양수인지 검사하는 방어 코드가 필요합니다.
EAN-13 바코드 검증 숫자 생성
12자리 바코드의 각 숫자에 위치별 가중치를 적용하여 13번째 검증 숫자를 계산하고 완성된 바코드를 출력합니다.
실행 흐름
- 12자리 숫자 문자열을 입력받습니다.
- 각 문자를 앞에서부터 순회하며 위치를 셉니다.
- 홀수 위치는 그대로, 짝수 위치는 3배하여 합합니다.
- 합이 10의 배수가 되도록 필요한 검증 숫자를 계산합니다.
- 원래 코드 뒤에 검증 숫자를 붙여 출력합니다.
입출력·계산 예시
입력: 880123456789 가중합을 계산한 뒤 검증 숫자를 붙여 13자리 코드 출력
원본 코드
# 바코드 열두 자리를 입력받음
code = input()
sum = 0 # 합을 저장하는 변수
pos = 0 # 몇 번째 위치인지 나타내는 변수
# 반복문으로
for x in code:
pos = pos+1 # 위치 값 1 증가
if pos%2==1: # 위치가 홀수이면
sum = sum+int(x) # 그 수를 더함.
else: # 위치가 짝수이면
sum = sum+3*int(x) # 3배를 더함.
res = (10-(sum%10))%10 # 검증 수 구하기
print(code+str(res)) # 열세 자리 바코드 출력
구문별 상세 설명
| 구문 | 설명 |
|---|---|
sum = 0 | 가중합을 저장합니다. 다만 sum은 내장 함수 이름과 같아 다른 이름이 더 좋습니다. |
for x in code | 바코드 문자열을 한 글자씩 순회합니다. |
pos % 2 == 1 | 1,3,5...번째 위치인지 확인합니다. |
sum += 3*int(x) | 짝수 위치 숫자는 3배하여 가중합에 더합니다. |
res = (10-(sum%10))%10 | 합을 다음 10의 배수로 만들기 위한 값을 계산합니다. 이미 10의 배수라면 결과는 0입니다. |
code + str(res) | 숫자형 검증값을 문자열로 바꾸어 12자리 코드 뒤에 연결합니다. |
입력이 정확히 12자리 숫자인지 검사해야 합니다. 변수 sum은 파이썬 내장 함수 sum()을 가리므로 total 같은 이름이 더 안전합니다.
시저 암호 복호화
각 알파벳을 세 글자 이전 문자로 이동시켜 시저 암호를 복호화합니다. a, b, c는 각각 x, y, z로 순환 처리합니다.
실행 흐름
- 암호문을 입력받습니다.
- 문자열을 한 글자씩 순회합니다.
- 공백은 그대로 유지합니다.
- a, b, c는 알파벳 끝으로 순환시킵니다.
- 그 밖의 문자는 문자 코드를 3만큼 감소시킵니다.
- 복호화 결과를 출력합니다.
입출력·계산 예시
입력: khoor zruog 출력: hello world
원본 코드
# 입력 처리(암호문)
inp = input()
res = "" # 원문 저장
for x in inp: # 반복문을 이용하여 한 문자씩 접근
if x==' ': # 공백인 경우
res += ' '
elif x=='a': # 'a'인 경우
res += 'x'
elif x=='b': # 'b'인 경우
res += 'y'
elif x=='c': # 'c'인 경우
res += 'z'
else: # 그 외 문자인 경우
res += chr(ord(x)-3)
# 출력 처리
print(res)
구문별 상세 설명
| 구문 | 설명 |
|---|---|
res = '' | 복호화된 원문을 누적할 빈 문자열입니다. |
if x == ' ' | 공백은 암호화하지 않으므로 그대로 보존합니다. |
elif x == 'a' / 'b' / 'c' | 알파벳 앞부분은 3을 빼면 영문자 범위를 벗어나므로 x, y, z로 직접 순환합니다. |
ord(x)-3 | 문자를 유니코드 정수값으로 바꾼 뒤 3을 뺍니다. |
chr(...) | 계산한 정수 코드를 다시 문자로 변환합니다. |
res += ... | 복호화된 문자를 결과 문자열 뒤에 이어 붙입니다. |
현재 코드는 소문자와 공백만 안전하게 처리합니다. 대문자, 숫자, 문장부호는 별도 조건이 없으면 예상치 못한 문자로 바뀔 수 있습니다.
몬테카를로 방법으로 원주율 추정
정사각형 안의 점 중 사분원 내부에 들어간 점의 비율을 이용해 원주율 π를 근사합니다.
실행 흐름
- 점의 개수 n을 입력받습니다.
- n개의 x, y 좌표를 리스트에 저장합니다.
- 각 점이 반지름 1000인 원 안에 있는지 검사합니다.
- 원 안의 점 개수 inp를 셉니다.
- π ≈ 4×(원 안 점 수)/(전체 점 수)로 계산합니다.
- 소수 여섯째 자리까지 출력합니다.
입출력·계산 예시
점이 균일하게 분포할수록 n이 커질 때 π에 가까운 값이 나옵니다.
원본 코드
# 입력 처리
n = int(input())
points = [] # 무작위 점들의 리스트
for i in range(n):
xy = list(map(int, input().split())) # x, y 좌푯값 입력
points.append(xy) # 점을 리스트에 추가
# 원 안에 들어가는 점의 개수 세기
inp = 0
for x,y in points:
if x**2+y**2 <= 1000**2: # 원의 반지름은 1000, 피타고라스 정리
inp += 1 # inp 값 1 증가
pi = (4*inp)/n # 파이(π)값 계산식
# 출력 처리(소수점 여섯째 자리까지 출력)
print("{:.6f}".format(pi))
구문별 상세 설명
| 구문 | 설명 |
|---|---|
points = [] | 입력받은 모든 좌표를 저장할 리스트입니다. |
list(map(int, input().split())) | 두 좌표 문자열을 정수로 변환해 리스트로 만듭니다. |
for x, y in points | 각 점의 두 좌표를 언패킹하여 순회합니다. |
x**2 + y**2 <= 1000**2 | 원의 중심이 원점일 때 x²+y²≤r²이면 원 내부 또는 경계에 있습니다. |
pi = 4*inp/n | 사분원 넓이 비율 π/4를 이용해 π를 추정합니다. |
"{:.6f}".format(pi) | 원주율 추정값을 소수점 여섯째 자리까지 표시합니다. |
n이 0이면 0으로 나누는 오류가 발생합니다. 또한 입력 점들이 정사각형 [0,1000]×[0,1000]에 균일하게 분포해야 몬테카를로 추정의 의미가 있습니다.
터틀로 몬테카를로 원주율 시각화
0부터 r 사이의 난수 좌표를 생성해 사분원 안과 밖의 점을 터틀 화면에 표시하면서 원주율을 추정하려는 프로그램입니다.
실행 흐름
- 터틀 객체를 생성하고 속도를 가장 빠르게 설정합니다.
- 반지름과 원 내부 점 개수를 초기화합니다.
- 10,000개의 난수 좌표를 생성합니다.
- 터틀을 해당 좌표로 이동시킵니다.
- 원의 내부 여부를 판단하고 점을 표시해야 합니다.
- 내부 점 비율로 π를 계산하고 결과를 표시해야 합니다.
입출력·계산 예시
현재 업로드된 파일은 ‘원의 안에 들어가는지 판단’ 이후 코드가 비어 있어 완성되지 않은 상태입니다.
원본 코드
import turtle
import random
# 터틀 초기화
t = turtle.Turtle( )
t.speed(0)
t.hideturtle( )
# 변수 초기화
inp = 0 # 원 안에 들어간 점의 개수
pi = 0 # pi 추정값
r = 300 # 반지름 300픽셀로 지정
# 10000번 반복
for n in range(1,10001):
# (x, y) 좌표 랜덤 생성
x = random.uniform(0,r)
y = random.uniform(0,r)
# (x, y)로 이동
t.up()
t.goto(x, y)
t.down()
# 이 좌표가 원 안에 들어가는지 판단
구문별 상세 설명
| 구문 | 설명 |
|---|---|
t = turtle.Turtle() | 그래픽 화면에서 움직일 터틀 객체를 만듭니다. |
t.speed(0) | 터틀 이동 속도를 가장 빠르게 설정합니다. |
t.hideturtle() | 화살표 모양의 터틀을 숨기고 점만 보이게 합니다. |
random.uniform(0, r) | 0 이상 r 이하의 실수 난수를 생성합니다. |
t.up() / t.goto() / t.down() | 선을 그리지 않고 좌표로 이동한 뒤 다시 그리기 상태로 바꿉니다. |
if x**2 + y**2 <= r**2 | 이 조건을 추가하여 사분원 내부 여부를 판단해야 합니다. |
pi = 4*inp/n | 반복 중 또는 반복 종료 후 원 내부 비율로 π를 추정할 수 있습니다. |
이 파일은 미완성입니다. 점 색상 표시, inp 증가, pi 계산, 결과 출력, 화면 종료 처리가 추가되어야 합니다.
이 파일은 미완성입니다. 점 색상 표시, inp 증가, pi 계산, 결과 출력, 화면 종료 처리가 추가되어야 합니다.
완성 예시 코드
import turtle
import random
t = turtle.Turtle()
t.speed(0)
t.hideturtle()
turtle.tracer(0, 0)
inp = 0
r = 300
for n in range(1, 10001):
x = random.uniform(0, r)
y = random.uniform(0, r)
inside = x**2 + y**2 <= r**2
if inside:
inp += 1
dot_color = "blue"
else:
dot_color = "red"
t.penup()
t.goto(x, y)
t.dot(2, dot_color)
if n % 500 == 0:
turtle.update()
pi = 4 * inp / 10000
print(f"추정 원주율: {pi:.6f}")
turtle.update()
turtle.done()
터틀 몬테카를로 원주율 시각화의 후반부
무작위 좌표가 반지름 r인 사분원 안에 들어가는지 판정하고, 원 안의 점은 파란색, 밖의 점은 빨간색으로 표시합니다. 원 안의 점 비율로 원주율을 추정하고 일정 횟수마다 화면에 현재 값을 출력하려는 코드입니다.
실행 흐름
- 현재 난수 좌표 (x, y)가 원 안에 있는지 검사합니다.
- 원 안이면 내부 점 개수 inp를 1 증가시키고 파란 점을 찍습니다.
- 원 밖이면 빨간 점을 찍습니다.
- π ≈ 4×(원 안 점 수)/(전체 점 수)로 추정값을 갱신합니다.
- 반복 횟수가 50의 배수일 때 화면의 기존 글자를 흰색 사각형으로 덮습니다.
- 현재 n과 π 값을 화면에 다시 출력합니다.
입출력·동작 예시
n이 커질수록 파란 점의 비율이 사분원의 넓이 비율에 가까워지고, π 근삿값도 3.14 부근으로 수렴합니다.
원본 코드
if x**2+y**2 <= r**2:
inp += 1 # 원 안에 들어간 점의 개수 1 증가
t.dot(4,"blue") # 파란 점 찍기
else:
t.dot(4,"red") # 빨간 점 찍기
pi = (4*inp)/n # pi값 계산
# n=50, 100, 150, ..., 10000일 때마다 pi값 출력
if n%50==0:
# pi값 출력할 위치로 이동
t.up( )
t.goto(0, -100)
# 텍스트를 출력할 흰색 사각형 그리기
t.begin_fill( )
t.color("white")
t.goto(300, -100)
t.goto(300, -10)
t.goto(0, -10)
t.goto(0,-100)
t.end_fill()
# pi값 출력
t.color("black")
t.write("n="+str(n)+"\npi="+str(pi), font=("Arial", 16, "normal"))
구문별 상세 설명
| 구문 | 상세 설명 |
|---|---|
if x**2+y**2 <= r**2 | 점 (x, y)가 중심이 원점이고 반지름이 r인 원의 내부 또는 경계에 있는지 확인합니다. |
inp += 1 | 원 안에 들어간 점의 누적 개수를 1 증가시킵니다. |
t.dot(4, "blue") | 현재 위치에 지름 4픽셀의 파란 점을 찍습니다. |
t.dot(4, "red") | 원 밖에 있는 점은 빨간색으로 표시합니다. |
pi = (4*inp)/n | 사분원의 넓이 비율 π/4를 이용해 현재 원주율 근삿값을 계산합니다. |
if n%50==0 | 반복 횟수가 50의 배수일 때만 화면의 수치를 갱신하도록 합니다. |
t.begin_fill() ~ t.end_fill() | 흰색 사각형을 그려 이전에 출력된 문자를 덮습니다. |
t.write("n="+str(n)+"\npi="+str(pi), ...) | 현재 시행 횟수와 원주율 근삿값을 두 줄로 표시합니다. |
이 파일은 독립 실행 코드가 아니라 앞부분에 이어지는 후반부 조각입니다. 현재 들여쓰기상 if n%50==0 블록이 반복문 밖에 있으므로, 의도대로 50회마다 갱신하려면 반복문 안쪽으로 들여써야 합니다.
문자 테두리 사각형 그리기
가로 n, 세로 m 크기의 문자 사각형을 만듭니다. 네 모서리는 +, 위·아래 변은 -, 왼쪽·오른쪽 변은 |, 내부는 공백으로 표현합니다.
실행 흐름
- 가로 길이 n과 세로 길이 m을 입력받습니다.
- 바깥 반복문으로 각 행을 만듭니다.
- 안쪽 반복문으로 각 열의 문자를 결정합니다.
- 첫 행과 마지막 행에서는 모서리와 가로선을 구분합니다.
- 중간 행에서는 양 끝 열만 세로선으로 표시합니다.
- 완성된 한 줄을 paper 리스트에 저장한 뒤 전체를 출력합니다.
입출력·동작 예시
입력: 6 4 출력: +----+ | | | | +----+
원본 코드
# 입력 처리
paper = []
n,m = input().split()
n = int(n)
m = int(m)
# 중첩 반복문
for row in range(1, m+1):
line = ""
for col in range(1, n+1):
if row==1 or row==m: # (1,1),(1,n),(m,1),(m,n)인 경우
if col==1 or col==n:
line += '+'
else:
line += '-'
elif col==1 or col==n: # 1열, n열인 경우
line += '|'
else: # 그 외 칸은 공백
line += ' '
paper.append(line) # paper에 한 줄 추가
# 출력 처리
for row in paper:
print(row)
구문별 상세 설명
| 구문 | 상세 설명 |
|---|---|
paper = [] | 완성된 각 행의 문자열을 저장할 리스트입니다. |
for row in range(1, m+1) | 1행부터 m행까지 순회합니다. |
for col in range(1, n+1) | 각 행에서 1열부터 n열까지 순회합니다. |
if row==1 or row==m | 첫 번째 또는 마지막 행인지 검사합니다. |
if col==1 or col==n | 현재 위치가 네 모서리 중 하나인지 검사합니다. |
line += '+' / '-' / '|' / ' ' | 위치에 따라 알맞은 문자를 현재 행 문자열에 이어 붙입니다. |
paper.append(line) | 한 행이 완성되면 리스트에 저장합니다. |
for row in paper: print(row) | 저장된 행을 위에서 아래 순서로 출력합니다. |
n 또는 m이 1인 경우 모서리와 변의 판정이 일반적인 사각형과 다르게 보일 수 있습니다. 최소 크기를 2 이상으로 제한하면 더 명확합니다.
복면산 완전 탐색
S, O, T에 0부터 9까지의 서로 다른 숫자를 모두 대입해 SOT - SO = TT 식을 만족하는 경우를 찾습니다.
실행 흐름
- S에 0부터 9까지 차례로 대입합니다.
- O에 0부터 9까지 대입하되 S와 같으면 건너뜁니다.
- T에 0부터 9까지 대입하되 S 또는 O와 같으면 건너뜁니다.
- SOT, SO, TT를 자리값 계산으로 수치화합니다.
- 식이 성립하는 경우만 결과를 출력합니다.
입출력·동작 예시
모든 가능한 서로 다른 S, O, T 조합을 검사하므로 최대 10×9×8=720개 후보를 확인합니다.
원본 코드
# 3중 반복문(S,O,T의 값을 순서대로 대입해서 계산)
for S in range(0,10):
for O in range(0,10):
if O==S: # S와 O가 같은 숫자인 경우 다음 반복으로
continue
for T in range(0,10):
if T==S or T==O: # T와 S, O가 같은 숫자인 경우 다음 반복으로
continue
if (S*100+O*10+T)-(S*10+O)==T*10+T: # 식이 맞으면 출력
print("{}{}{}-{}{}={}{}".format(S,O,T,S,O,T,T))
구문별 상세 설명
| 구문 | 상세 설명 |
|---|---|
for S in range(0,10) | S가 될 수 있는 모든 숫자를 탐색합니다. |
if O==S: continue | O와 S가 같으면 조건에 맞지 않으므로 현재 반복을 즉시 건너뜁니다. |
if T==S or T==O: continue | T가 앞에서 선택한 숫자와 중복되는 경우를 제외합니다. |
S*100+O*10+T | 세 자리 수 SOT를 자리값 원리로 만듭니다. |
S*10+O | 두 자리 수 SO를 계산합니다. |
T*10+T | 같은 숫자 두 개로 이루어진 TT를 계산합니다. |
"{}{}{}-{}{}={}{}".format(...) | 숫자를 식의 모양으로 보기 좋게 출력합니다. |
S가 0이면 SOT와 SO가 실제로는 세 자리·두 자리 수가 아닐 수 있습니다. 복면산에서 맨 앞자리를 0으로 허용하지 않는다면 if S==0: continue 조건을 추가해야 합니다.
두 원의 교점 개수 판정
두 원의 중심 좌표와 반지름을 입력받아 중심 사이 거리와 반지름의 합·차를 비교하고, 두 원이 만나지 않는지, 한 점에서 접하는지, 두 점에서 만나는지를 판정합니다.
실행 흐름
- 각 원의 중심 좌표와 반지름을 리스트로 입력받습니다.
- 두 중심 사이 거리를 계산합니다.
- 거리와 두 반지름의 합을 비교해 외부에서 떨어짐·외접 여부를 판정합니다.
- 거리와 반지름 차의 절댓값을 비교해 내부 포함·내접 여부를 판정합니다.
- 그 밖의 경우 두 점에서 만나므로 overlapped를 출력합니다.
입출력·동작 예시
입력: 0 0 5 8 0 5 중심 거리 8, 반지름 합 10, 차 0이므로 두 점에서 만나며 overlapped 출력
원본 코드
# 입력 처리
a = list(map(int, input().split()))
b = list(map(int, input().split()))
# 원의 겹침 여부 판별하는 함수(겹치는 점의 개수를 리턴)
def f(a,b):
dist = ((a[0]-b[0])**2 + (a[1]-b[1])**2)**0.5
if dist > a[2]+b[2]:
return 0
elif dist == a[2]+b[2]:
return 1
elif dist == abs(a[2]-b[2]):
return 1
elif dist < abs(a[2]-b[2]):
return 0
else:
return 2
# 출력 처리(겹치는 경우, 접하는 경우, 겹치지 않는 경우)
if f(a,b)==2: # 겹치는 점이 2개인 경우
print("overlapped")
elif f(a,b)==1: # 겹치는 점이 1개인 경우
print("tangent")
else: # 겹치지 않는 경우
print("not overlapped")
구문별 상세 설명
| 구문 | 상세 설명 |
|---|---|
dist = ((a[0]-b[0])**2 + ...)**0.5 | 피타고라스 정리로 두 원 중심 사이의 유클리드 거리를 구합니다. |
dist > a[2]+b[2] | 중심 거리가 반지름 합보다 크면 두 원이 멀리 떨어져 교점이 없습니다. |
dist == a[2]+b[2] | 중심 거리가 반지름 합과 같으면 외접하여 한 점에서 만납니다. |
dist == abs(a[2]-b[2]) | 중심 거리가 반지름 차와 같으면 내접하여 한 점에서 만납니다. |
dist < abs(a[2]-b[2]) | 작은 원이 큰 원 안에 완전히 들어가며 교점이 없습니다. |
return 0, 1, 2 | 교점의 개수를 함수의 결과로 반환합니다. |
if f(a,b)==2 ... | 반환값에 따라 세 가지 메시지 중 하나를 출력합니다. |
실수 계산 결과를 ==로 직접 비교하면 오차가 생길 수 있습니다. math.isclose()를 사용하거나 허용 오차를 두는 방식이 더 안전합니다. 또한 두 원이 완전히 일치하는 경우는 교점이 무한개이므로 별도 처리할 수 있습니다.
5×5 격자에서 3×3 최대 가치 찾기
5×5 격자에서 중심이 될 수 있는 9개 위치를 순회하며, 각 중심을 둘러싼 3×3 영역의 합을 계산하고 가장 큰 값을 출력합니다.
실행 흐름
- 5줄의 정수를 입력받아 2차원 리스트 mines를 만듭니다.
- 함수 f(row, col)이 중심 주변 3×3 영역의 합을 계산합니다.
- 중심이 될 수 있는 행과 열 1~3만 순회합니다.
- 각 위치의 3×3 합을 구합니다.
- 현재 최댓값보다 크면 maxval을 갱신합니다.
- 모든 후보를 조사한 뒤 최대 합을 출력합니다.
입출력·동작 예시
5×5 입력에는 3×3 영역이 가로 3개×세로 3개, 총 9개 존재합니다. 이 9개 합 중 가장 큰 값을 출력합니다.
원본 코드
# 입력 처리(2차원 리스트)
mines = []
for row in range(5):
x = list(map(int, input().split()))
mines.append(x)
# (row, col) 주변의 가치 합을 구하는 함수
def f(row, col):
res = 0
for i in range(row-1, row+2):
for j in range(col-1, col+2):
res += mines[i][j]
return res
# ① → ② → … → ⑨를 탐색하며 최대 가치 구함.
maxval = 0
for row in range(1, 4):
for col in range(1, 4):
sum = f(row,col)
if sum>maxval:
maxval = sum
# 출력 처리(최대 가치 출력)
print(maxval)
구문별 상세 설명
| 구문 | 상세 설명 |
|---|---|
for row in range(5) | 5개의 행을 입력받습니다. |
mines.append(x) | 각 행의 리스트를 2차원 리스트에 추가합니다. |
for i in range(row-1, row+2) | 중심 행의 바로 위부터 바로 아래까지 세 행을 순회합니다. |
for j in range(col-1, col+2) | 중심 열의 왼쪽부터 오른쪽까지 세 열을 순회합니다. |
res += mines[i][j] | 3×3 영역의 각 값을 누적합니다. |
for row in range(1,4) | 배열 경계를 벗어나지 않는 중심 행 1,2,3만 검사합니다. |
sum = f(row,col) | 현재 3×3 영역의 합을 계산합니다. |
if sum > maxval | 더 큰 합을 찾으면 최댓값을 갱신합니다. |
변수 이름 sum은 내장 함수 sum()과 겹치므로 area_sum이 더 좋습니다. 모든 값이 음수일 수 있다면 maxval=0은 잘못된 결과를 만들 수 있으므로 첫 영역의 합 또는 float('-inf')로 초기화해야 합니다.
점수 내림차순 정렬 후 3등 찾기
이름과 정보 점수를 입력받아 점수의 내림차순으로 정렬하고, 정렬된 목록에서 세 번째 학생의 이름을 출력합니다.
실행 흐름
- 학생 수 n을 입력받습니다.
- 각 학생의 이름과 점수를 리스트에 저장합니다.
- lambda 함수로 점수를 정렬 기준으로 지정합니다.
- 점수에 음수를 붙여 큰 점수가 앞에 오도록 정렬합니다.
- 인덱스 2에 있는 3등 학생의 이름을 출력합니다.
입출력·동작 예시
입력: 4 민수 80 지수 95 서준 88 하늘 90 정렬: 지수, 하늘, 서준, 민수 출력: 서준
원본 코드
# 입력 처리
n = int(input())
data = []
for x in range(n):
a,b = input().split()
data.append([a, int(b)])
# 데이터 정렬
data.sort(key = lambda x: -x[1]) # 정보 점수의 내림차순으로 정렬
# 출력 처리(3등이므로 인덱스는 2)
print(data[2][0]) # [2][0]: 이름, [2][1]: 점수
구문별 상세 설명
| 구문 | 상세 설명 |
|---|---|
data.append([a, int(b)]) | 학생 이름과 정수 점수를 하나의 2원소 리스트로 저장합니다. |
data.sort(...) | 원본 리스트 자체의 순서를 정렬된 상태로 변경합니다. |
key=lambda x: -x[1] | 각 학생 자료의 점수에 음수를 취한 값을 정렬 기준으로 사용해 내림차순 효과를 냅니다. |
data[2] | 인덱스는 0부터 시작하므로 2번 인덱스가 세 번째 학생입니다. |
data[2][0] | 세 번째 학생 자료에서 0번 요소인 이름을 꺼냅니다. |
학생 수가 3명보다 적으면 IndexError가 발생합니다. 동점 처리 기준도 문제 조건에 따라 달라질 수 있으므로 이름순, 입력순, 공동 순위 여부를 명확히 해야 합니다.
도서 대출 목록 딕셔너리 관리
도서 이름별 대출 권수를 딕셔너리로 관리합니다. 명령어에 따라 도서를 추가하거나 제거하고, 현재 목록을 출력합니다.
실행 흐름
- 처리할 명령어 수 n을 입력받습니다.
- books 딕셔너리에 도서 이름과 대출 권수를 저장합니다.
- 1 도서명 명령은 도서를 추가합니다.
- 2 도서명 명령은 도서를 한 권 제거합니다.
- 권수가 0이 되면 해당 키를 딕셔너리에서 삭제합니다.
- 0 명령은 현재 도서별 권수를 출력합니다.
- 정의되지 않은 명령은 오류 메시지를 출력합니다.
입출력·동작 예시
명령: 1 파이썬 1 파이썬 1 알고리즘 2 파이썬 0 출력: 파이썬 1 알고리즘 1
원본 코드
# 입력 처리
n = int(input())
books = {} # 대출 리스트 딕셔너리 생성
# 대출 리스트에 book을 추가
def addBook(book):
if book in books: # 대출 리스트에 도서가 있는 경우
books[book] += 1
else: # 대출 리스트에 도서가 없는 경우
books[book] = 1
# 대출 리스트에서 book을 제거
def delBook(book):
if book in books: # 대출 리스트에 도서가 있는 경우
books[book] -= 1
if books[book]==0: # 도서 대여 개수가 0인 경우
del books[book] # 대출 리스트에서 삭제
else:
print("no book!") # 대출 리스트에 도서가 없는 경우 에러 출력
# 대출 리스트 출력
def printBooks(books):
for k,v in books.items(): # 딕셔너리의 키와 값을 순서대로 k,v에 저장
print(k, v) # 키와 값 출력
# 명령어 처리
for x in range(n):
cmd = input()
if cmd[0]=='1': # 명령어가 1인 경우
addBook(cmd[2:])
elif cmd[0]=='2': # 명령어가 2인 경우
delBook(cmd[2:])
elif cmd[0]=='0': # 명령어가 0인 경우
printBooks(books)
else: # 명령어가 잘못된 경우
print("wrong command!")
구문별 상세 설명
| 구문 | 상세 설명 |
|---|---|
books = {} | 도서명을 키, 대출 권수를 값으로 저장하는 빈 딕셔너리입니다. |
if book in books | 이미 등록된 도서인지 키 존재 여부를 확인합니다. |
books[book] += 1 | 기존 도서의 권수를 1 증가시킵니다. |
del books[book] | 권수가 0이 된 도서 항목을 딕셔너리에서 완전히 제거합니다. |
for k,v in books.items() | 딕셔너리의 키와 값을 한 쌍씩 꺼내 순회합니다. |
cmd[0] | 명령 문자열의 첫 글자로 명령 종류를 구분합니다. |
cmd[2:] | 명령 번호와 공백을 제외한 나머지 문자열을 도서명으로 사용합니다. |
빈 문자열 명령이 입력되면 cmd[0]에서 오류가 납니다. printBooks의 매개변수 이름 books는 전역 변수와 같아 혼동될 수 있으며, 출력 순서가 필요하다면 sorted(books.items())를 사용할 수 있습니다.
집합의 교집합과 합집합 출력
두 정수 집합을 입력받아 교집합과 합집합을 계산합니다. 집합은 중복을 자동 제거하며, 결과는 오름차순으로 출력합니다.
실행 흐름
- 첫 번째 집합의 원소 수와 원소를 입력받습니다.
- 두 번째 집합의 원소 수와 원소를 입력받습니다.
- & 연산자로 교집합을 계산합니다.
- | 연산자로 합집합을 계산합니다.
- 교집합이 비어 있으면 0을 출력합니다.
- 그렇지 않으면 교집합을 정렬하여 출력합니다.
- 다음 줄에 합집합을 정렬하여 출력합니다.
입출력·동작 예시
A={1,2,3,4}, B={3,4,5}
교집합: 3 4
합집합: 1 2 3 4 5원본 코드
# 입력 처리
n = int(input())
A = set(map(int, input().split())) # 집합 자료 구조
m = int(input())
B = set(map(int, input().split())) # 집합 자료 구조
s1 = A & B # 교집합 연산
s2 = A | B # 합집합 연산
if len(s1)==0: # 공집합이면 0 출력
print(0, end='')
else: # 공집합이 아니면
for x in sorted(s1): # 교집합의 원소를 오름차순으로 출력
print(x, end=' ')
print() # 한 줄 띄우고
for x in sorted(s2): # 합집합의 원소를 오름차순으로 출력
print(x, end=' ')
구문별 상세 설명
| 구문 | 상세 설명 |
|---|---|
set(map(int, input().split())) | 입력 정수를 집합으로 변환하여 중복값을 제거합니다. |
s1 = A & B | 두 집합에 공통으로 포함된 원소의 집합을 계산합니다. |
s2 = A | B | 두 집합 중 하나 이상에 포함된 모든 원소의 집합을 계산합니다. |
len(s1)==0 | 교집합이 공집합인지 원소 개수로 확인합니다. |
sorted(s1) | 순서가 없는 집합을 오름차순 리스트로 바꾸어 출력 순서를 일정하게 만듭니다. |
print(x, end=' ') | 각 원소를 같은 줄에 공백으로 구분하여 출력합니다. |
print() | 교집합 출력이 끝난 뒤 줄을 바꿉니다. |
입력된 n과 m은 실제 원소 개수 검증에 사용되지 않습니다. 문제 조건을 엄격히 확인하려면 len(A) 또는 원본 입력 길이와 비교할 수 있습니다.