2024. 12. 4. 17:39ㆍAlgorithms/백준알고리즘 연습
2745번
초기 코드
a = 'ZZZZZ'
b = 36
print(int(a,b))
아나콘다에 이렇게 돌리면 잘 받아옴
근데
a,b = input().split()
print(int(a,b))
이렇게 쓰면 오류가 남
왜지?
n,b=input().split()
print(int(n,int(b)))
문제에 n이 주어진다고 했으니 n으로 바꾸어주고,
b를 str 형태로 받아왔으니 한번 더 int로 바꾸어주는 작업이 필요
쓰인 문법 :
int(x, radix)
radix 진수로 표현된 문자열 x를 10진수로 변환하여 리턴한다.
11005번
10진법 --> n진법 만들기
초기 답안
n,b = map(int,input().split())
import string
tmp = string.digits+string.ascii_lowercase
def convert(num, base) :
q, r = divmod(num, base)
if q == 0 :
return tmp[r]
else :
return convert(q, base) + tmp[r]
print(upper.convert(n,b))
정답
n,b = map(int,input().split())
import string
tmp = string.digits+string.ascii_lowercase
def convert(num, base) :
q, r = divmod(num, base)
if q == 0 :
return tmp[r]
else :
return convert(q, base) + tmp[r]
c = convert(n,b)
print(c.upper())
2720번 세탁소 사장 동혁
처음 작성한 코드
t = int(input())
for _ in range (t) :
C = int(input())
for i in range (4):
b = C // 25
d = (C-b*25)//10
e = (C-b*25-e*10)//5
f = (C-b*25-*d10-e*5)//1
print(b,d,e,f, end = " ")
런타임 에러 뜸 (쉼표왜찍었지?)
지피티가 고쳐준코드
t = int(input())
for _ in range(t):
C = int(input())
b = C // 25
d = (C - b * 25) // 10
e = (C - b * 25 - d * 10) // 5
f = (C - b * 25 - d * 10 - e * 5) // 1
print(b, d, e, f, end=" ")
그래도 얼추맞았다.
다른 분 코드
changes = [25, 10, 5, 1]
T = int(input())
for _ in range(T) :
C = int(input())
res = []
for i in changes :
res.append(C // i) # 몫이 개수
C = C % i # 나머지는 다시 C에 저장
print(*res)
출처: https://calkolab.tistory.com/entry/baekjoon-python-2720 [CALKO LAB:티스토리]
더 간단하게 만들 수 있는데.. 저런 방법을 배우자
2903번
중앙 이동 알고리즘
초기 코드
n = int(input())
print(pow((pow(2,n)+1),2))
여기에서 적용되는 수학적 알고리즘은
점의 수 = (2^ㅜ+1)^2 라는 것만 알면 됨
괄호 닫기 주의하자
컴파일에러 자꾸 남
2292번 벌집
벌집의 규칙을 찾지 못했음
+1 늘어날때마다 6의 배수로 벌집의 갯수가 증가함
7,19,37 에서 각각 1을 빼면 6,18,36 (*1,*3,*6)
초기 코드
a = 1 =>1
b = [2:7]까지 2
c = [8:19]까지 3
d = 20:37까지 4
...
n = int(input())
ans = 0
while a in b :
print('1')
이런식으로 루프 돌리려 하는데 맞는지 모르겠음..
수학적 공식을 알아야 함
다른분 답변
n = int(input())
nums_pileup = 1 # 벌집의 개수, 1개부터 시작
cnt = 1
while n > nums_pileup :
nums_pileup += 6 * cnt # 벌집이 6의 배수로 증가
cnt += 1 # 반복문을 반복하는 횟수
print(cnt)
출처 : https://ooyoung.tistory.com/82
루프가 n에 도달하면 멈춤.
예를 들어 n=5라고 하면 한번 루프가 돌면 nums_pileup은 6이 되고, n은 5이기때문에 한번 돌고 멈춤
cnt 에 1을 더한 값이 출력됨
= 2
루프를 돌리는것은 아는데 루프를 언제
n 이 19인 경우 3번까지는 돌아가지만(19>18), 4번째부터는 안돌아감
1193번 분수찾기 - 어렵다
문제
무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
1/1 | 1/2 | 1/3 | 1/4 | 1/5 | … |
2/1 | 2/2 | 2/3 | 2/4 | … | … |
3/1 | 3/2 | 3/3 | … | … | … |
4/1 | 4/2 | … | … | … | … |
5/1 | … | … | … | … | … |
… | … | … | … | … | … |
이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.
문제 해석
i 번은 1~n 까지
j 번도 1~m 까지 차례대로 1씩 입력되도록 넣고 map array를 만들어놓고
루프 돌릴 때 지그재그로 돌리게 만들면되는데, (1,1), (2,1), (1,2), 이렇게 반복되어야 함
그런데 무한한 배열은 어떻게 만들지...?
규칙 찾기
1/1
1/2, 2/1
3/1, 2/2, 1/3
1/4, 2/3, 3/2, 4/1
5/1, 4/2, 3/3, 2/4, 1/5
1,3,5번줄에는 분자가 1늘어날때 분모가 1 줄어듬
2,4 (짝수) 줄에는 분자가 1줄어들때 분모가 1늘어남
몇번째줄 몇번째 위치인지 알려면
while num > line:
num -= line
line += 1
루프 사용
num = int(input())
line = 1
while num > line:
num -= line
line += 1
if 1 % 2 == 0 : #짝수인경우
a = num
b = line - num + 1
elif 1 % 2 == 1 : #홀수인경우
a = line - num + 1
b = num
print(f'{a}/{b}') #스트링으로전환
어떻게 이 과정을 생각해내지? 하면
순서대로 어떤 규칙/조건이 나에게 주어지는지 봐야함
1. 먼저 라인이 주어지고
2. 지그재그가 주어지는데
3. 라인이 변하면서 분수와 분모의크기가 규칙적으로 바뀜 ( 이 규칙을 알아야 함)
4. 라인의 번호와 분수/분모 크기 바뀌는 법칙의 변화가 어떻게 있는지 파악해야 함
'Algorithms > 백준알고리즘 연습' 카테고리의 다른 글
백준 (1) | 2024.12.05 |
---|---|
백준 알고리즘 연습 : 약수, 배수와 소수 (0) | 2024.12.04 |
백준 2차원 배열 (0) | 2024.12.02 |
백준 심화 1 (2) | 2024.12.01 |
백준 알고리즘 1차원배열 10807, 10871, 10818, 2562, 10810, 10813, 5597, 3052, 10811, 1546 번 (1) | 2024.11.28 |