본문 바로가기
📊 Algorithm/Algorithm plus+

🏆솔브드 클래스 2++ 달성하기!

by 정람지 2023. 1. 21.

🧧 설연휴에(맨날 놀긴 하지만) 클래스솔브드 도장깨기

목표는 클래스 2++ 달성!

7문제!


2231 분해합

브론즈 2

#브루트 포스 알고리즘
from sys import stdin
N = int(stdin.readline())
#자릿수에 따라서 생성자후보 최솟값 구하고 되는지 다 돌기 
# 생성자 후보 최솟값은 원래수-(원래수의자릿수*9)로

#자릿수 구하기
M = N
length = 1
while(1):
    if M/10 >= 1:
        M /= 10
        length += 1
    else:
        break

reresult = 0
for cha in range( N - (length * 9), N):
    result = cha
    K = cha
    for j in range(length-1,-1,-1):
        result += K //(10**j)
        K -= (K //(10**j))*(10**j)
    if (N == result):
        reresult = cha
        break

print(reresult)

브루트포스 알고리즘

자릿수 구하는 법 -> 10으로 언제까지 나누어지는지 확인 

각 자릿수의 숫자 구하는 법 유의 -> 몫 활용! 그때그때 원래수에서 빼줘야함!

 

한방에성공!

뭐 브루트포스니깐.. 시간제한 2초~

 

근데.. 경험치 안오른다... 골드 레벨은 브론즈 2정도는 안 쳐준다는 건가..너무해..뿌듯했는데..


15829 Hashing

브론즈 2

해시 함수..아직 안 배웠는데

from sys import stdin
L = int(stdin.readline())
Llist = stdin.readline()[:-1]

# 음 아스키 코드 써볼까
# 고유번호 변환
Nlist = []
for cha in Llist:
    Nlist.append(ord(cha)-96)

# 해시 함수 구현
result = 0
for i in range(L):
    result+= Nlist[i]*((31)**i)

print(result)

stdin.readline() 문자열 받을 때는 \n 줄바꿈코드 항상 잊지말기! 슬라이싱

오잉 50점 신기 첨본다 뭐가틀렸지?

음 함수를 잘 몰라서 발생한 문제였다.

mod M이란 게 나누는 건 줄 알았는데 나머지를 구하라는 말이었군

[이상 시의 주기경계조건]이라는 논문 읽고 있는데 나왔다.

모듈러 연산이라고 하는 건데 주기경계조건과 연관지어 생각할 수 있다고 설명해줬다.

서브테스크 문제 -> 내 코드 보기에서 문제 뭘 틀렸는지 확인 가능!

 

성공%


1436 영화감독 숌

실버 5

 

예전에 수학적인 규칙을 이용해 보려다가 포기했었던 문제..

 

#브루트 포스 알고리즘
from sys import stdin
L = int(stdin.readline())

#666확인 함수
def sixsixsix(N):
    length = lenlen(N)
    sixnum = continuesix(N, length)
    # 맞으면
    if sixnum == 3:
        return 1
    else:
        return 0

#자릿수 구하기 함수
def lenlen(N):
    length = 1
    while(1):
        if N/10 >= 1:
            N /= 10
            length += 1
        else:
            return length

# 6연속 확인 함수
def continuesix(N, len):
    sixNum = 0
    for j in range(len-1,-1,-1):
        if( N //(10**j)==6 ):
            sixNum += 1
            if sixNum == 3:
                return sixNum
        else:
            sixNum = 0
        N -= (N //(10**j))*(10**j)
        
    return sixNum
   

N = 666 #첫 영화
Lright = 0
while(1):
    #666 있는지 확인
    rere = sixsixsix(N)
    Lright += rere

    if Lright == L:
        print(N)
        break

    #다음숫자
    N += 1

무지막지한 브루트다. 

이번에는 무뇌로 +1씩 하면서 확인하는 알고리즘을 짰다.

 

파이썬 인터프리터에서 값 출력 눈에 보일 만큼 지연되는 건 오랜만이었다..

채점도 엄청 오래 걸렸는데

맞았다.

정말 이거였다니 믿기지 않는


7568 덩치

실버 5

from sys import stdin
N = int(stdin.readline())
Nlist = []
nlist =[1] * N

for _ in range(N):
    A, B = map(int,stdin.readline().split())
    Nlist.append([A, B])

for i in range(N):
    for cha in Nlist:
        if Nlist[i][0] > cha[0]:
            if Nlist[i][1] > cha[1]:
                nlist[i] += 1
                print(i+1,Nlist[i] , cha)

for cha in nlist:
    print(cha, end =" ")

한방성공

차 안에서 하는 건 쫌 멀미나는듯


1654 랜선 자르기

실버 2

오 이전에 질문받아봤던 문제다

이분탐색

from sys import stdin
K, N = map(int,stdin.readline().split())
Klist = []
for i in range(K):
    Klist.append(int(stdin.readline()))

#잘릴 랜선의 길이 후보 범위
start = 1
end = max(Klist)
while(start <= end):
    Nlen = 0    
    mid = (start + end) // 2 #이분탐색
    for cha in Klist: 
        Nlen += cha // mid
    
    if (Nlen >= N): 
        start = mid + 1
    else:
        end = mid - 1

print(end)

어렵..

이분탐색 공부해야 함


2805 나무 자르기

실버 2

from sys import stdin
K, N = map(int,stdin.readline().split())
Klist = list(map(int,stdin.readline().split()))

#잘릴 랜선의 길이 후보 범위
start = 1
end = max(Klist)
while(start <= end):
    Nlen = 0    
    mid = (start + end) // 2 # 이분탐색
    for cha in Klist: 
        if (cha > mid):
            Nlen += (cha - mid)
    
    if (Nlen >= N):
        start = mid + 1
    else:
        end = mid - 1

print(end)

이분탐색 공부해야 함


18111 마인크래프트

실버 2

리스트 안에서 반복? 할 때 쓰레기값 들어갈 때가 있는데 [] 말고 list()로 하면 잘 된다. 왜지?

 

# 브루트 포스
from sys import stdin
N, M, B = map(int,stdin.readline().split()) # 세로 가로 인벤토리블록
land = [list(map(int,stdin.readline().split())) for _ in range(N)]
answer = 999999999

"""
#이게 오히려 시간 초과 유발 ㅜ
#가장 낮은 땅 높은땅 사이 땅 높이 모두 돌려보기
MostHigh = []
MostLow = []
for cha in land:
    MostHigh.append(max(cha))
    MostLow.append(min(cha))
Mosthigh = max(MostHigh)
Mostlow = max(MostLow)
"""

for height in range(Mostlow, Mosthigh+1):
    max_target, min_target = 0, 0

    for i in range(N):
        for j in range(M):
            if land[i][j] >= height:
                max_target += land[i][j] - height
            else:
                min_target += height - land[i][j]
    if max_target + B >= min_target:
        if min_target + (max_target * 2) <= answer:
            answer = min_target + (max_target * 2) 
            Height = height # 층수

print(answer, Height)

sys.maxsize

int 최댓값 반환


이전에 궁금해서 질문했던 문제 답변 도착

재귀함수를 쓸 때에는 return 필요 (재귀함수에서 최종 답이 나올 때)

return은 바로 전 함수에만 값 전달!!


성공!!!

🧧해피 설날🧧

저는 세뱃돈 받으러 숑숑