프로그래머스 LV1(6)

2024. 1. 29. 17:21백준 및 프로그래머스/프로그래머스 LV 1

-기사단원의 무기

def solution(number, limit, power):
    yaksu = [1]
    for i in range(2,number+1):
        answer = 0
        for j in range(1,int(i**(1/2))+1):
            if i%j == 0:
                answer+=1
                if i//j !=j:
                    answer+=1
        yaksu.append(answer)
        
    total = 0
    
    for i in yaksu:
        if i <= limit:
            total+=i
        else:
            total+=power
    return total

(이 문제는 기본적으로 시간 초과를 유도하는 문제이다.. for 문장을 2번 넣어서 약수를 구하려고 했으나 시간 초과가 나왔고 약수 알고리즘을 찾아 int(i**(1/2)) 알게 되었다. 제곱근을 사용한다면 하나씩 다 넣을 필요가 없는 것이다.)

 

-소수 만들기

def solution(nums):
    count = 0
    n = len(nums)
    for i in range(n):
        for j in range(i+1,n):
            for k in range(j+1,n):
                total = nums[i] + nums[j] + nums[k]
                sosu = 0
                for q in range(2,total):
                    if total % q == 0:
                        sosu+=1
                        break
                if sosu == 0:
                    count+=1
    return count

 

-소수 찾기

def solution(n):
    count = []
    for i in range(2,n+1):
        answer = 0
        for j in range(1,int(i ** (1/2))+1):
            if i % j == 0:
                answer+=1
            if answer > 1:
                break
        if answer == 1:
            count.append(i)
    return len(count)

소수 찾기 알고리즘은 시간초과를 넘어가는 경우가 많아서 까다롭고 어려운것같다..

 

-덧칠하기

def solution(n, m, section):
    count = 1 
    
    first = section[0]
    
    for i in section:
        
        if first + (m - 1) < i:
            
            first = i 
            
            count+=1
                
    
    return count

 

-실패율

def solution(n, stages):
    answer = {}
    stage_num = len(stages)
    
    for i in range(1,n+1):
        if stage_num != 0:
            member = stages.count(i)
            answer[i] = member / stage_num
            stage_num = stage_num - member
        else:
            answer[i] = 0
    answer = sorted(answer,key = lambda x:answer[x],reverse=True)
    return answer

 

-옹알이(2)

def solution(babbling):
    answer = 0
    for word in babbling:
        last = 0
        while word:
            if word[:2] == "ma" and last!=1:
                word = word[2:]
                last = 1
            elif word[:2] == 'ye' and last!=2:
                word = word[2:]
                last = 2
            elif word[:3] == "woo" and last!=3:
                word = word[3:]
                last = 3
            elif word[:3] == "aya" and last!=4:
                word = word[3:]
                last = 4
            else:
                break
        if not word:
            answer+=1
                
    return answer

 

-[1차 다트게임]

def solution(dartResult):
    answer = 0
    dart = []
    num =""
    for i in dartResult:
        
        if i.isdigit():
            num +=i
        elif i =='S':
            dart.append(int(num)**1)
            num =""
        elif i =='D':
            dart.append(int(num)**2)
            num =""
        elif i =='T':
            dart.append(int(num)**3)
            num =""
        elif i == '*':
            if len(dart) >=2:
                dart[-2] = dart[-2] * 2
                dart[-1] = dart[-1] * 2
            else:
                dart[-1] = dart[-1] * 2
        elif i =="#":
            dart[-1] = dart[-1] *(-1)
            
            
            
    return sum(dart)

 

-로또의 최고 순위와 최저 순위

def solution(lottos, win_nums):
    answer = []
    tal = lottos.count(0)
    cnt = 0 
    for i in range(len(win_nums)):
        for j in range(len(lottos)):
            if win_nums[i] == lottos[j]:
                cnt+=1
    good_rank = tal + cnt
    bad_rank = good_rank - tal
    if good_rank == 6:
        answer.append(1)
    elif good_rank == 5:
        answer.append(2)
    elif good_rank == 4:
        answer.append(3)
    elif good_rank == 3:
        answer.append(4)
    elif good_rank == 2:
        answer.append(5)
    else:
        answer.append(6)
        
    if bad_rank == 6:
        answer.append(1)
    elif bad_rank == 5:
        answer.append(2)
    elif bad_rank == 4:
        answer.append(3)
    elif bad_rank == 3:
        answer.append(4)
    elif bad_rank == 2:
        answer.append(5)
    else:
        answer.append(6)
    answer.sort()
    return answer

 

-숫자 짝꿍

def solution(X, Y):
    answer = ''
    x_num = {n:0 for n in range(10)}
    y_num = {n:0 for n in range(10)}
    for i in X:
        x_num[int(i)]+=1
    for i in Y:
        y_num[int(i)]+=1
        
    for i in range(9,-1,-1):
        answer += str(i) * min(x_num[i], y_num[i])
    answer= list(answer)
    answer.sort(reverse=True)
    if len(answer) == 0:
        return "-1"
    elif answer[0] == "0":
        return"0"
    else:
        return ''.join(answer)

 

-대충 만든 자판

def solution(keymap, targets):
    answer = []
    alpha =dict()
    
    for word in keymap:
        
        for idx,key in enumerate(word):
            
            if key in alpha.keys():
                if idx + 1 < alpha[key] :
                    alpha[key] = idx + 1
            else:
                alpha[key] = idx+1
    
    for word2 in targets:
        total = 0
        for target in word2:
            if target in alpha:
                total += alpha[target]
            else:
                total = -1
                break
        answer.append(total)
                
    return answer

(어떻게 풀어야 할 지 잘 몰라서 정답 코드를 살짝 참고하였고, 문제를 이해한 후 다시 나의 방식대로 푼 케이스) 하지만, 정답 코드를 많이 참고해서 제가 풀었다고 하기에는 애매하네영..

 

-완주 하지 못한 선수

def solution(participant, completion):
    answer = ''
    name = {name:0 for name in participant}
    
    for i in participant:
        if i in name:
            name[i]+=1
    
    for j in completion:
        
        if j in name:
            name[j]-=1
    
    for i in name:
        if name[i]>0:
            answer+=i
    
    return answer

 

-둘만의 암호

def solution(s, skip, index):
    word = [i for i in 'abcdefghijklmnopqrstuvwxyz']
    answer = ''
    
    
    for i in s:
        word_list = []
        tal = 1   
        
        while True:
            if len(word_list) == index:
                break
            if word[(word.index(i)+tal)%26] in skip:
                tal+=1
            else:
                word_list.append(word[(word.index(i)+tal)%26])
                tal+=1
                
        answer+=word_list[index - 1]
                
            
    
    return answer

 

-[PCCE 기출문제] 9번 / 이웃한 칸

def solution(board, h, w):
    
    dh = [0,1,-1,0]
    dw = [1,0,0,-1]
    color = board[h][w]
    count = 0
    
    for i in range(4):
        h_check = h + dh[i]
        w_check = w + dw[i]
        if 0<=h_check < len(board) and 0<=w_check<len(board):
            if board[h_check][w_check] == color:
                count+=1
    return count

 

-햄버거 만들기

def solution(ingredient):
    answer = 0
    hamburger = []
    for i in ingredient:
        hamburger.append(i)
        if hamburger[-4:] == [1,2,3,1]:
            answer+=1
            for _ in range(4):
                hamburger.pop()
    return answer

 

-[PCCE 기출문제] 10번 / 데이터 분석

def solution(data, ext, val_ext, sort_by):
    answer = []
    if sort_by == 'remain':
        data = sorted(data, key = lambda x:x[3])
    elif sort_by == 'code':
        data = sorted(data, key = lambda x:x[0])
    elif sort_by == 'maximum':
        data = sorted(data, key = lambda x:x[2])
    elif sort_by == 'date':
        data = sorted(data, key = lambda x:x[1])
        
    if ext == 'date':     
        for i in range(len(data)):
            if data[i][1] <= val_ext:
                answer.append([data[i][0],data[i][1],data[i][2],data[i][3]])
    if ext == 'code':     
        for i in range(len(data)):
            if data[i][0] <= val_ext:
                answer.append([data[i][0],data[i][1],data[i][2],data[i][3]])
    if ext == 'maximum':     
        for i in range(len(data)):
            if data[i][2] <= val_ext:
                answer.append([data[i][0],data[i][1],data[i][2],data[i][3]])
    if ext == 'remain':     
        for i in range(len(data)):
            if data[i][3] <= val_ext:
                answer.append([data[i][0],data[i][1],data[i][2],data[i][3]])
    return answer

 

-바탕화면 정리

def solution(wallpaper):
    answer = []
    for i in range(len(wallpaper)):
        
        for j in range(len(wallpaper[0])):
            if wallpaper[i][j] =='#':
                answer.append((i,j))
    answer.sort(key = lambda x :(x[0],x[1]))
    number = []
    min_number = 100000
    min_number2 = 100000
    for i in range(len(answer)):
        if answer[i][0] < min_number:
            min_number = answer[i][0]
        if answer[i][1] < min_number2:
            min_number2 = answer[i][1]
    
    max_number = 0
    max_number2 = 0
    
    for i in range(len(answer)):
        
        if answer[i][0] > max_number:
            max_number = answer[i][0]
        if answer[i][1] > max_number2:
            max_number2 = answer[i][1]
    
    number.append(min_number)
    number.append(min_number2)
    number.append(max_number+1)
    number.append(max_number2+1)
    

  
    return number

 

-공원 산책

def solution(park, routes):
    answer = []
    row,col= len(park),len(park[0])
    new_col ,new_row = 0,0
    
    new_park = [[ 0 for _ in range(col)] for _ in range(row)]
    for i in range(row):
        for j in range(col):
            if park[i][j] =='X':
                new_park[i][j] = 1
            elif park[i][j] == 'S':
                new_row = i
                new_col = j
            else:
                new_park[i][j] = 0
    dx = [0,0,-1,1]
    dy = [1,-1,0,0]
   
    for route in routes:
        distance, number = route.split()
        valid = True
        for offset in range(1,int(number)+1):
            if distance =='E':
                new_row1 = new_row+dx[0] *offset
                new_col1 = new_col+dy[0] *offset
            elif distance =='W':
                new_row1 = new_row+dx[1]  *offset
                new_col1 = new_col+dy[1] *offset
            elif distance =='N':
                new_row1 = new_row+dx[2]  *offset
                new_col1 = new_col+dy[2] *offset
            elif distance =='S':
                new_row1 = new_row+dx[3]  *offset
                new_col1 = new_col+dy[3]  *offset
                
                
            if 0<=new_col1<col and 0<=new_row1<row and new_park[new_row1][new_col1] == 0:
                pass
            else:
                valid = False
                break
        if valid:
            new_row = new_row1
            new_col = new_col1
            
        
       
        
    return [new_row,new_col]

offset을 이용해서 내가 가려고자 하는 거리까지 저장해주는 것이 포인트라고 생각한다.

 

-[PCCP 기출문제] 1번/붕대 감기

#t초 동안 붕대를 감으면서 1초마다 x만큼 체력을 회복 
#t초 연속으로 붕대를 감는 데 성공하면 y만큼의 체력을 추가회복
def solution(bandage, health, attacks):
    n = len(attacks)
    count = 0
    now_health = health
    total = 0
    for i in range(n):
        time, attack = attacks[i]
        
        while True:
            count+=1
            total+=1
            if count == time:
                total = 0
                break
            else:
                if health < now_health:
                    health+=bandage[1]
                    if health > now_health:
                        health = now_health
                        
                    if total == bandage[0]:
                        total = 0
                        health+=bandage[2]
                        if health> now_health:
                            health = now_health
        health -= attack
        if health<=0:
            return -1
    return health

 

-문자열 나누기

def solution(s):
    answer = 0
    while s:
        x = s[0]
        idx = 0
        while idx < len(s):
            sub_string = s[0:idx+1]
            print(sub_string)
            x_count = sub_string.count(x)
            if x_count == len(sub_string) - x_count:
                break
            idx+=1
        s = s[idx+1:]
        answer+=1
            
    return answer

잘 이해가되지 않아 문제 해결님 유튜브 보면서 문제 해결했습니다. 다시 풀어보고 풀이를 올리도록 하겠습니다.

 

 

-[PCCP 기출문제] 1번 / 동영상 재생기 

def solution(video_len, pos, op_start, op_end, commands):
    answer = ''
    
    #오프닝 함수 
    def opening(hh,mm,op_start,op_end):
        opsm,opsh = map(int,op_start.split(":"))
        opem,opeh = map(int,op_end.split(":"))
        #  현재 시각이 끝나는 시각 사이일때 
        if opsm < hh < opem:
            return True
        elif opsm<=hh<opem:
            if opsh<=mm:
                return True 
        elif opsm<hh<=opem:
            if mm<=opeh:
                return True 
        elif opsm<=hh<=opem:
            if opsh<=mm<=opeh:
                return True 
        return False
    
    def video_time(hh,mm,video_len):
        videos,videoe = map(int,video_len.split(":"))
        st,se = time(hh,mm,"next")
        if st == videos and se > videoe :
            return True 
        return False
    
    def video_time2(hh,mm):
        
        if hh == 0:
            if mm - 10 < 0 :
                return True 
        return False 
    
    def time(hh,mm,acess):
        if acess == "next":
            mm += 10 
            if mm >= 60:
                hh+=1
                mm-=60 
                
        elif acess=='prev':
            mm-=10
            if mm < 0 :
                hh-=1 
                mm += 60 
        
        return [hh,mm]
    
    for acess in commands:
        hh,mm = map(int,pos.split(":"))
        if opening(hh,mm,op_start,op_end):
            hh,mm = map(int,op_end.split(":"))
        
        if acess =="next":
            if video_time(hh,mm,video_len):
                hh,mm = map(int,video_len.split(":"))
            else:
                hh,mm = time(hh,mm,acess) 
        
        elif acess=="prev":
            if video_time2(hh,mm):
                hh, mm = 0,0
            else:
                hh,mm = time(hh,mm,acess)
                
        if opening(hh,mm,op_start,op_end):
            hh,mm = map(int,op_end.split(":"))
            
        pos = str(hh) +":"+str(mm)
            
    
    total = pos.split(":")
    total.insert(1,":")
    for i in total:
        if len(i) == 1 and i !=':':
            answer+='0'+i 
        else:
            answer+=i
    
    return answer
  1.  
  2. 제] 1번 / 동영상 재생기
 

'백준 및 프로그래머스 > 프로그래머스 LV 1' 카테고리의 다른 글

크레인 인형뽑기 게임 - JAVA  (0) 2025.02.21
숫자 짝꿍 -JAVA  (0) 2025.02.21
프로그래머스 LV 1  (0) 2024.01.28
프로그래머스 LV 1(5)  (0) 2024.01.26
프로그래머스 LV1(4)  (0) 2024.01.26