파이썬 코드 16개 상세 설명 통합 자료

195.py · 200.py · 203.py · 208.py · 212.py · 217.py · 220.py · 222.py · 223.py · 227.py · 232.py · 235.py · 239.py · 244.py · 249.py · 254.py

자료 구성

원본 코드
업로드된 코드를 그대로 제시합니다.
실행 흐름
입력부터 출력까지 단계적으로 설명합니다.
구문별 해설
핵심 문법과 계산 원리를 상세히 풀이합니다.
주의·개선
오류 가능성과 더 좋은 작성 방법을 안내합니다.
195.py

표준 몸무게와 비만도 판정

키와 몸무게를 입력받아 키 구간에 따라 표준 몸무게를 계산한 뒤, 실제 몸무게가 표준 몸무게보다 얼마나 차이 나는지를 백분율로 계산하여 정상·과체중·비만으로 분류합니다.

입력 분리실수 변환다중 조건문산술식구간 판정

실행 흐름

  1. 키와 몸무게를 공백으로 구분하여 입력받습니다.
  2. 키에 따라 서로 다른 표준 몸무게 공식을 적용합니다.
  3. 비만도 = (실제 몸무게 - 표준 몸무게) ÷ 표준 몸무게 × 100으로 계산합니다.
  4. 비만도가 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 <= 2010 초과 20 이하를 과체중으로 분류합니다.
else20 초과를 비만으로 분류합니다.
주의·개선 포인트
변수 이름 bmi는 일반적인 체질량지수 BMI와 혼동될 수 있습니다. obesity_rate 또는 obesity_degree처럼 의미가 분명한 이름이 더 좋습니다.
200.py

일차방정식 ax+b=c 풀기

문자열 형태로 입력된 일차방정식 ax+b=c를 x와 = 기호를 기준으로 분리한 뒤, x=(c-b)/a 공식을 이용해 해를 계산합니다.

문자열 분리자료형 변환일차방정식형식 지정 출력

실행 흐름

  1. 방정식 문자열을 입력받습니다.
  2. x를 기준으로 계수 a와 나머지 식을 분리합니다.
  3. =를 기준으로 b와 c를 분리합니다.
  4. 세 값을 정수로 변환합니다.
  5. 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)/aax+b=c를 이항하여 x=(c-b)/a로 계산합니다.
print("{:.2f}".format(x))계산 결과를 소수점 둘째 자리까지 반올림하여 출력합니다.
주의·개선 포인트
a가 0이면 0으로 나누는 오류가 발생합니다. 또한 -2x+3=11, 2x-3=11처럼 부호가 포함된 입력 형식도 명확히 정의해야 합니다.
203.py

윤년을 고려한 월의 마지막 날

연도와 월을 입력받고, 각 월의 일수를 저장한 리스트에서 해당 월의 마지막 날을 출력합니다. 2월은 윤년이면 29일로 바꿉니다.

리스트 인덱스중첩 조건문논리 연산자윤년 판정

실행 흐름

  1. 연도와 월을 정수로 입력받습니다.
  2. 1월부터 12월까지의 기본 일수를 리스트에 저장합니다.
  3. 입력 월이 2월이면 윤년 조건을 검사합니다.
  4. 윤년이면 2월의 일수를 1 증가시킵니다.
  5. 해당 월의 마지막 날을 출력합니다.

입출력·계산 예시

입력: 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 == 22월일 때만 윤년 계산이 필요하므로 조건을 제한합니다.
y%400==0 or y%4==0 and y%100!=0400의 배수이거나, 4의 배수이면서 100의 배수가 아니면 윤년입니다.
lastday[2] += 1평년의 28일에 1일을 더해 29일로 바꿉니다.
print(lastday[m])월 번호를 그대로 리스트 인덱스로 사용해 마지막 날을 출력합니다.
주의·개선 포인트
월이 1~12 범위를 벗어나면 IndexError가 발생할 수 있으므로 입력 범위 검사가 필요합니다.
208.py

철근 자재 번호 생성

전체 철근 길이 n을 한 개당 길이 k로 나누어 만들 수 있는 자재 수를 계산하고, F-0001 형식으로 번호를 출력합니다.

정수 나눗셈불 자료형반복문0 채움 형식

실행 흐름

  1. 전체 길이와 한 개당 길이를 입력받습니다.
  2. 정수 나눗셈으로 완성 가능한 자재 개수를 구합니다.
  3. 개수가 9999를 초과하는지 확인합니다.
  4. 가능하면 1번부터 count번까지 자재 번호를 출력합니다.
  5. 초과하면 오류 메시지를 출력합니다.

입출력·계산 예시

입력: 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가 양수인지 검사하는 방어 코드가 필요합니다.
212.py

EAN-13 바코드 검증 숫자 생성

12자리 바코드의 각 숫자에 위치별 가중치를 적용하여 13번째 검증 숫자를 계산하고 완성된 바코드를 출력합니다.

문자열 순회홀짝 판정가중합검증 숫자

실행 흐름

  1. 12자리 숫자 문자열을 입력받습니다.
  2. 각 문자를 앞에서부터 순회하며 위치를 셉니다.
  3. 홀수 위치는 그대로, 짝수 위치는 3배하여 합합니다.
  4. 합이 10의 배수가 되도록 필요한 검증 숫자를 계산합니다.
  5. 원래 코드 뒤에 검증 숫자를 붙여 출력합니다.

입출력·계산 예시

입력: 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 == 11,3,5...번째 위치인지 확인합니다.
sum += 3*int(x)짝수 위치 숫자는 3배하여 가중합에 더합니다.
res = (10-(sum%10))%10합을 다음 10의 배수로 만들기 위한 값을 계산합니다. 이미 10의 배수라면 결과는 0입니다.
code + str(res)숫자형 검증값을 문자열로 바꾸어 12자리 코드 뒤에 연결합니다.
주의·개선 포인트
입력이 정확히 12자리 숫자인지 검사해야 합니다. 변수 sum은 파이썬 내장 함수 sum()을 가리므로 total 같은 이름이 더 안전합니다.
217.py

시저 암호 복호화

각 알파벳을 세 글자 이전 문자로 이동시켜 시저 암호를 복호화합니다. a, b, c는 각각 x, y, z로 순환 처리합니다.

문자열 누적문자 코드ordchr조건 분기

실행 흐름

  1. 암호문을 입력받습니다.
  2. 문자열을 한 글자씩 순회합니다.
  3. 공백은 그대로 유지합니다.
  4. a, b, c는 알파벳 끝으로 순환시킵니다.
  5. 그 밖의 문자는 문자 코드를 3만큼 감소시킵니다.
  6. 복호화 결과를 출력합니다.

입출력·계산 예시

입력: 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 += ...복호화된 문자를 결과 문자열 뒤에 이어 붙입니다.
주의·개선 포인트
현재 코드는 소문자와 공백만 안전하게 처리합니다. 대문자, 숫자, 문장부호는 별도 조건이 없으면 예상치 못한 문자로 바뀔 수 있습니다.
220.py

몬테카를로 방법으로 원주율 추정

정사각형 안의 점 중 사분원 내부에 들어간 점의 비율을 이용해 원주율 π를 근사합니다.

좌표 리스트언패킹원의 방정식확률적 추정형식 지정

실행 흐름

  1. 점의 개수 n을 입력받습니다.
  2. n개의 x, y 좌표를 리스트에 저장합니다.
  3. 각 점이 반지름 1000인 원 안에 있는지 검사합니다.
  4. 원 안의 점 개수 inp를 셉니다.
  5. π ≈ 4×(원 안 점 수)/(전체 점 수)로 계산합니다.
  6. 소수 여섯째 자리까지 출력합니다.

입출력·계산 예시

점이 균일하게 분포할수록 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]에 균일하게 분포해야 몬테카를로 추정의 의미가 있습니다.
222.py

터틀로 몬테카를로 원주율 시각화

0부터 r 사이의 난수 좌표를 생성해 사분원 안과 밖의 점을 터틀 화면에 표시하면서 원주율을 추정하려는 프로그램입니다.

turtle 그래픽난수실수 좌표몬테카를로 시뮬레이션시각화

실행 흐름

  1. 터틀 객체를 생성하고 속도를 가장 빠르게 설정합니다.
  2. 반지름과 원 내부 점 개수를 초기화합니다.
  3. 10,000개의 난수 좌표를 생성합니다.
  4. 터틀을 해당 좌표로 이동시킵니다.
  5. 원의 내부 여부를 판단하고 점을 표시해야 합니다.
  6. 내부 점 비율로 π를 계산하고 결과를 표시해야 합니다.

입출력·계산 예시

현재 업로드된 파일은 ‘원의 안에 들어가는지 판단’ 이후 코드가 비어 있어 완성되지 않은 상태입니다.

원본 코드

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()
223.py

터틀 몬테카를로 원주율 시각화의 후반부

무작위 좌표가 반지름 r인 사분원 안에 들어가는지 판정하고, 원 안의 점은 파란색, 밖의 점은 빨간색으로 표시합니다. 원 안의 점 비율로 원주율을 추정하고 일정 횟수마다 화면에 현재 값을 출력하려는 코드입니다.

원의 방정식조건문누적 변수터틀 점 찍기실시간 문자 출력

실행 흐름

  1. 현재 난수 좌표 (x, y)가 원 안에 있는지 검사합니다.
  2. 원 안이면 내부 점 개수 inp를 1 증가시키고 파란 점을 찍습니다.
  3. 원 밖이면 빨간 점을 찍습니다.
  4. π ≈ 4×(원 안 점 수)/(전체 점 수)로 추정값을 갱신합니다.
  5. 반복 횟수가 50의 배수일 때 화면의 기존 글자를 흰색 사각형으로 덮습니다.
  6. 현재 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회마다 갱신하려면 반복문 안쪽으로 들여써야 합니다.
227.py

문자 테두리 사각형 그리기

가로 n, 세로 m 크기의 문자 사각형을 만듭니다. 네 모서리는 +, 위·아래 변은 -, 왼쪽·오른쪽 변은 |, 내부는 공백으로 표현합니다.

중첩 반복문행과 열문자열 누적모서리·변 판정

실행 흐름

  1. 가로 길이 n과 세로 길이 m을 입력받습니다.
  2. 바깥 반복문으로 각 행을 만듭니다.
  3. 안쪽 반복문으로 각 열의 문자를 결정합니다.
  4. 첫 행과 마지막 행에서는 모서리와 가로선을 구분합니다.
  5. 중간 행에서는 양 끝 열만 세로선으로 표시합니다.
  6. 완성된 한 줄을 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 이상으로 제한하면 더 명확합니다.
232.py

복면산 완전 탐색

S, O, T에 0부터 9까지의 서로 다른 숫자를 모두 대입해 SOT - SO = TT 식을 만족하는 경우를 찾습니다.

3중 반복문완전 탐색continue서로 다른 숫자자리값

실행 흐름

  1. S에 0부터 9까지 차례로 대입합니다.
  2. O에 0부터 9까지 대입하되 S와 같으면 건너뜁니다.
  3. T에 0부터 9까지 대입하되 S 또는 O와 같으면 건너뜁니다.
  4. SOT, SO, TT를 자리값 계산으로 수치화합니다.
  5. 식이 성립하는 경우만 결과를 출력합니다.

입출력·동작 예시

모든 가능한 서로 다른 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: continueO와 S가 같으면 조건에 맞지 않으므로 현재 반복을 즉시 건너뜁니다.
if T==S or T==O: continueT가 앞에서 선택한 숫자와 중복되는 경우를 제외합니다.
S*100+O*10+T세 자리 수 SOT를 자리값 원리로 만듭니다.
S*10+O두 자리 수 SO를 계산합니다.
T*10+T같은 숫자 두 개로 이루어진 TT를 계산합니다.
"{}{}{}-{}{}={}{}".format(...)숫자를 식의 모양으로 보기 좋게 출력합니다.
주의·개선 포인트
S가 0이면 SOT와 SO가 실제로는 세 자리·두 자리 수가 아닐 수 있습니다. 복면산에서 맨 앞자리를 0으로 허용하지 않는다면 if S==0: continue 조건을 추가해야 합니다.
235.py

두 원의 교점 개수 판정

두 원의 중심 좌표와 반지름을 입력받아 중심 사이 거리와 반지름의 합·차를 비교하고, 두 원이 만나지 않는지, 한 점에서 접하는지, 두 점에서 만나는지를 판정합니다.

함수두 점 사이 거리원의 위치 관계절댓값반환값

실행 흐름

  1. 각 원의 중심 좌표와 반지름을 리스트로 입력받습니다.
  2. 두 중심 사이 거리를 계산합니다.
  3. 거리와 두 반지름의 합을 비교해 외부에서 떨어짐·외접 여부를 판정합니다.
  4. 거리와 반지름 차의 절댓값을 비교해 내부 포함·내접 여부를 판정합니다.
  5. 그 밖의 경우 두 점에서 만나므로 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()를 사용하거나 허용 오차를 두는 방식이 더 안전합니다. 또한 두 원이 완전히 일치하는 경우는 교점이 무한개이므로 별도 처리할 수 있습니다.
239.py

5×5 격자에서 3×3 최대 가치 찾기

5×5 격자에서 중심이 될 수 있는 9개 위치를 순회하며, 각 중심을 둘러싼 3×3 영역의 합을 계산하고 가장 큰 값을 출력합니다.

2차원 리스트중첩 반복문함수부분 영역 합최댓값 탐색

실행 흐름

  1. 5줄의 정수를 입력받아 2차원 리스트 mines를 만듭니다.
  2. 함수 f(row, col)이 중심 주변 3×3 영역의 합을 계산합니다.
  3. 중심이 될 수 있는 행과 열 1~3만 순회합니다.
  4. 각 위치의 3×3 합을 구합니다.
  5. 현재 최댓값보다 크면 maxval을 갱신합니다.
  6. 모든 후보를 조사한 뒤 최대 합을 출력합니다.

입출력·동작 예시

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')로 초기화해야 합니다.
244.py

점수 내림차순 정렬 후 3등 찾기

이름과 정보 점수를 입력받아 점수의 내림차순으로 정렬하고, 정렬된 목록에서 세 번째 학생의 이름을 출력합니다.

리스트lambda정렬 기준내림차순인덱스

실행 흐름

  1. 학생 수 n을 입력받습니다.
  2. 각 학생의 이름과 점수를 리스트에 저장합니다.
  3. lambda 함수로 점수를 정렬 기준으로 지정합니다.
  4. 점수에 음수를 붙여 큰 점수가 앞에 오도록 정렬합니다.
  5. 인덱스 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가 발생합니다. 동점 처리 기준도 문제 조건에 따라 달라질 수 있으므로 이름순, 입력순, 공동 순위 여부를 명확히 해야 합니다.
249.py

도서 대출 목록 딕셔너리 관리

도서 이름별 대출 권수를 딕셔너리로 관리합니다. 명령어에 따라 도서를 추가하거나 제거하고, 현재 목록을 출력합니다.

딕셔너리함수추가·삭제명령어 처리문자열 슬라이싱

실행 흐름

  1. 처리할 명령어 수 n을 입력받습니다.
  2. books 딕셔너리에 도서 이름과 대출 권수를 저장합니다.
  3. 1 도서명 명령은 도서를 추가합니다.
  4. 2 도서명 명령은 도서를 한 권 제거합니다.
  5. 권수가 0이 되면 해당 키를 딕셔너리에서 삭제합니다.
  6. 0 명령은 현재 도서별 권수를 출력합니다.
  7. 정의되지 않은 명령은 오류 메시지를 출력합니다.

입출력·동작 예시

명령:
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())를 사용할 수 있습니다.
254.py

집합의 교집합과 합집합 출력

두 정수 집합을 입력받아 교집합과 합집합을 계산합니다. 집합은 중복을 자동 제거하며, 결과는 오름차순으로 출력합니다.

집합교집합합집합정렬공집합

실행 흐름

  1. 첫 번째 집합의 원소 수와 원소를 입력받습니다.
  2. 두 번째 집합의 원소 수와 원소를 입력받습니다.
  3. & 연산자로 교집합을 계산합니다.
  4. | 연산자로 합집합을 계산합니다.
  5. 교집합이 비어 있으면 0을 출력합니다.
  6. 그렇지 않으면 교집합을 정렬하여 출력합니다.
  7. 다음 줄에 합집합을 정렬하여 출력합니다.

입출력·동작 예시

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) 또는 원본 입력 길이와 비교할 수 있습니다.