코딩테스트 풀이 - 1

김기훈·2025년 9월 17일

BaekJoon

목록 보기
6/12

2025/09월 첫 코딩테스트를 공부하며 배운점 기록


그림그리기

  • \ 한개는 인식이 안되서 \이 모양이 필요할 경우 \\ 두번 사용
    • 큰 따옴표(")를 모양 그대로 사용하기 위해서는 문자열을 작은따옴표(')로 둘러싸거나 \" 를 사용

명령어

  • \n
    • 줄바꿈
  • \t
    • 수평 탭
  • \\
    • '\' 문자 자체를 의미
  • \'
    • 작은 따옴표(') 자체
  • \"
    • 큰 따옴표(") 자체
  • \'"
    • 도 가능

ex. 고양이 강아지


풀면서 배움

자주 사용할 풀이

  • 여러 입력값을 정수형으로 변경

    • nums = list(map(int, input().split()))
    • a,b,c = map(int,input().split())
  • 1개의 값은 굳이 map 쓸필요 없이

    • a = int(input()) 이렇게 쓰면 됨

반복문

N=int(input())
a="int"

for i in range(N//4):
    a="long "+ a 
print(a)
  • 한번 반복시에 long int 출력 이 값이 다시 a자리에 들어가 long의 개수는 증가하지만 a는 증가하지 않는다.
while True:
    A,B = map(int,input().split())
    print(A+B)
    if A==0 and B==0:
        break
-----------------------------------
while True:
    A,B = map(int,input().split())
    if A==0 and B==0:
        break
    else:
        print(A+B)
  • 결과가 똑같다고 생각했지만 0 0이 들어왔을때 첫 번째는 출력해버리고 나서 반복문을 종료
    • 두번째는 0 0이 들어왔을때 출력 자체를 안해버림

join

N = int(input())
a = N // 4

words = []
for _ in range(a):
    words.append("long")

print(" ".join(words), "int")
  • join 은 중간에만 공백을 넣어주고, 끝에는 안붙임

input 대용

import sys
T=int(sys.stdin.readline())
for i in range(T):
    a,b=map(int,sys.stdin.readline().split())
    print(a+b)
  • sys.stdin.readline() : input()처럼 사용하는데 속도가 더 빠른것 같음

rjust

N=int(input())

for i in range(1,N+1):
    a = "*" * i
    print(a.rjust(i))
  • .rjust() 는 오른쪽 정렬을 도와주는데 a의 길이가 이미 i이기 때문에 정렬효과가 없다
    • 현재의 길이가 아니라 최대 폭을 넣어야 하기 때문에 a.rjust(N) 으로 설정한다

이론

EOF

  • 입력의 끝
while True:
    try:
        A, B = map(int, input().split())
        print(A + B)
    except EOFError:
        break
  • input()이 더 이상 읽을 게 없으면 EOFError 발생
    • ESC로 input창을 끄는게 아닌 백준에서 자동으로 파일 끝에 도달하면 EOF

sys

  • system 관련 기능을 다루는 표준 라이브러리

    • 파이썬 인터프리터와 직접 상호작용하거나, 프로그램 실행 환경을 제어가능
  • 입출력 제어

    • sys.stdin : 표준 입력(키보드, 파일 리다이렉션 등)
    • sys.stdout : 표준 출력(print가 쓰는 곳)
    • sys.stderr : 표준 에러 출력 (보통 에러 메시지 출력할 때 씀)

풀이 및 학습

2025/09/18 (4단계)

한번에 입력값 받기

  • map(int,input().split()) 자체를 list로 묶으면 변수명을 여러개 선언할 필요 없이 한번에 저장 가능
    • numbers = list(map(int,input().split()))

리스트안의 특정 위치값 반환

  • a = list.index(b)
    • 리스트안에서의 b의 위치를 인덱스값으로 반환
    • 인덱스값은 0부터 시작하기 때문에 1부터 시작하고 싶다면 출력할때 a+1로 하면됨

list 내용물의 중복된 값을 제거하기

  • set
    • list(set(list)) : 순서를 신경쓰지 않을경우 사용
  • 반복문으로 만들기
    • 귀찮긴한데 원하는대로 하기 좋음

요소의 개수

  • 리스트에 len 을 사용하면 리스트에 들어있는 요소의 개수를 알 수 있다.

    • 리스트에 들어있는 특정요소의 개수는 .count

인덱싱

  • 리스트 안에 있는 특정값을 꺼내는 방법

    • 한줄에 정수만 출력하기 위해서는 print(*리스트이름) 하면 괄호없이 값만 출력된다.
      • num = [10, 20, 30]
      • print(*num) = 10 20 30

리스트 채우기

  • 비어있는 리스트를 입력된 숫자만큼 0으로 채우기
    • [0] * 5 = [0,0,0,0,0]
  • 입력되는 숫자까지 정수 채워넣기
    • nums = list(range(1, N+1))
                ums = [0, 0, 0, 0, 0]
                nums[1:4] = [7, 7, 7] or nums[1:4] = [7] * (4-1)

서로 값을 교환하기

  • num_A[i-1], num_A[j-1] = num_A[j-1], num_A[i-1]

원하는 범위의 리스트 값의 순서를 반대로

숫자 = [1, 2, 3, 4, 5, 6]
숫자[1:3]=reversed(숫자[1:3])
print(숫자)

2025/09/19 (4단계)

숫자 = [1, 2, 3, 4, 5, 6]
숫자[1:3]=reversed(숫자[1:3])
print(숫자) # [1, 3, 2, 4, 5, 6]
  • reversed() 는 리스트, 문자열, 튜플 같은 시퀀스 자료형에서 사용할 수 있다
numbers = [1, 2, 3, 4, 5]
numbers.remove(2)  # 1,3,4,5
numbers.pop(2) # 인덱스 2의 값을 제거 1,2,4,5
del numbers[1] # 인덱스 1의 값을 제거 1,3,4,5
num = 12345
print(str(num)[::-1])   # "54321"
print(int(str(num)[::-1]))  # 54321

2025/09/20 (5단계)

# 단어의 개수
a=list(map(str,input().split())) # 공백을 기준으로 입력된 단어를 저장 
print(len(a)) # 리스트에 공백을 기준으로 저장했기 때문에 [apple,banana]의 개수는 2개로 측정 된다.

10809

  • ord()

    • 알파벳은 유니코드로 저장되는데 알파벳을 유니코드로 바꿔주는 역할
  • chr()

    • 유니코드를 문자로 바꿔주는 역할
print(ord('a'))  # 97
print(ord('z'))  # 122
print(chr(97))   # 'a'
print(chr(122))  # 'z'

# 문자를 range의 범위로 변환(range는 숫자전용)
for i in range(ord('a'), ord('z')+1):  # 97 ~ 122
    print(chr(i), end=" ")

# find() 메서드 = 문자열.find(찾을값) 
# 문자열에서 특정문자가 처음 나타나는 위치를 반환 / 값이 없을경우 -1 반환

-------------------------------------------------------------
# 유니코드를 사용하지 않은 방법
S=str(input())
alpha="abcdefghijklmnopqrstuvwxyz"
for i in alpha:
    if i in S:
        print(S.index(i),end=" ")
    else:
        print("-1",end=" ")

# 서로다른 형태의 입력값을 공백을 기준으로 한번에 받는 법
	a,b = input().split()
    a=int(a)
    b=str(b)

n_dic={'ABC':2,'DEF':3,'GHI':4,'JKL':5,'MNO':6,'PQRS':7,'TUV':8,'WXYZ':9}
a='A'
for i in n_dic:
    if a in i:
        print(n_dic[i])
--------------------------------------------------------------------
# 사용
X=str(input())
n_dic={"ABC":2,"DEF":3,"GHI":4,"JKL":5,"MNO":6,"PQRS":7,"TUV":8,"WXYZ":9}
a=0
for i in range(len(X)): # 입력한 문자의 개수만큼 반복
    for it in n_dic: # 딕셔너리의 키값을 빼옴
        if X[i] in it:
            a+=n_dic[it]+1
        else:
            pass
print(a)
  • 딕셔너리를 for에 붙이면 키값을 하나씩 뽑아옴

2025/09/20(5단계)

S = str(input())
a=["c=","c-","dz=","d-","lj","nj","s=","z="]
for i in a:
    S = S.replace(i,"0") # for문이 반복하면서 같은 값이 들어오면 0으로 바꿈
print(len(S))

N = int(input())
ans = N
for i in range(N):
    s_inp=str(input())
    for j in range(len(s_inp)-1):
        if s_inp[j] == s_inp[j+1]:
            continue
        elif s_inp[j] in s_inp[j+1:]:  
            ans-=1
            break
print(ans)

2025/09/21(6단계)

basic={"A+":4.5,"A0":4.0,"B+":3.5,"B0":3.0,"C+":2.5,"C0":2.0,"D+":1.5,"D0":1.0,"F":0.0}
a=input()
if a in basic: # 입력한 a값이 딕셔너리의 key값에 있는지 찾음
    print("True")
else: 
    print("False")
  • for i in range(5) 를 역순으로 돌리기 위해서는 for i in reserved(range(5))
  • rjust(범위),ljust(),center() : 메서드
N = int(input())
Nt=2*N-1
for i in range(Nt+1):
    if not i%2==0:
        a="*"*i
        print(a.center(Nt).rstrip())
        if i==Nt:
            for it in reversed(range(Nt)):
                if not it%2==0:
                    b="*"*it
                    print(b.center(Nt).rstrip())
- rstrip()를 붙여서 줄 끝 공백을 없애야 백준에서 정답처리됨
-------------------------------------------------------------
N = int(input())
Nt = 2*N - 1
for i in range(1, Nt + 1, 2):
    print(('*'*i).center(Nt).rstrip())
for i in range(Nt - 2, 0, -2):
    print(('*'*i).center(Nt).rstrip())
  • 같은 결과기는 함

2025/09/22(7단계)

li=[]
li_1=[]
for i in range(9):
    num=list(map(int,input().split()))
    li.append(num) # [[1,2,3]] 이런형태로 저장
    li_1.append(max(num))
ma=max(li_1)
print(ma)
for i in range(9):
    if ma in li[i]:
        print(i+1,end=" ")
        for it in range(9):
            if li[i][it] == ma:
                print(it+1,end=" ")
                break
  • [[1,2,3],[4,5,6]] 여기에서 max를 구하면 [4,5,6] 이 출력

    • [1,2,3]에서 max를 출력하면 3 제대로 출력됨
  • for _ in range(5):

    • 반복 횟수만 필요하고, range(5)에서 나온 값(0,1,2,3,4)을 쓸 일이 없을 때 _를 씀.

2025/09/23(8단계)

dic1={"a":1,"b":2}
print("a" in dic1) # True
print(1 in dic1.values()) # True

N, B = map(input().split())
a=N/B
b=1
while a>B:
    a=a/B 계산값을 저장하고 그 값을 다시 나눔

2025/09/24(9단계)

while (1):
    a,b = map(int,input().split())

    if a==0 and b == 0:
        break

    if a<b and b%a ==0:
        print("factor")
    elif a>b and a%b==0:
        print("multiple")
    else:
        print("neither")

2025/09/27 (9단계)

while True:
    N = int(input())
    if N == -1:  
        break

    li = [i for i in range(1, N) if N % i == 0]  
    if sum(li) == N:
        print(f"{N} = {' + '.join(map(str, li))}")
    else:
        print(f"{N} is NOT perfect.")
  • print(f"{N} = {' + '.join(map(str, li))}")
    • " + " 를 기준으로 문자열 리스트를 이어 붙임 : "1 + 2 + 3"
    • li = [i for i in range(1, N) if N % i == 0] : 약수 리스트
    • map(str, li) → 리스트의 각 원소를 문자열로 변환

2025/09/28 ()

# 소인수 분해
N = int(input())
li = []

i = 2
while N > 1:   
    if N % i == 0:
        li.append(i)
        N //= i   
    else:
        i += 1

print(li)
T=int(input())
li=[25,10,5,1]
for i in range(T):
    a=int(input())
    for it in li:
        c=0
        while a>=it:
            a-=it
            c+=1
        print(c,end=" ")
    print()

profile
안녕하세요.

0개의 댓글