하루살이 개발자

[Softeer] Level2 문제풀이 by Python 본문

코딩테스트

[Softeer] Level2 문제풀이 by Python

하루살이 2023. 2. 3. 20:22

1. 금고털이 - 정렬이용

import sys

w, n = map(int, input().split())

jew = [list(map(int, input().split())) for _ in range(n)]
 

jew = sorted(jew, key = lambda x : x[1], reverse = True)
 

total = 0

for weight, price in jew:
    if w > weight:
        total += weight * price
        w -= weight
    else:
        total += w * price
        break
print(total)

2. 8단 변속기 - 단순 조건문

import sys

n = list(map(int, sys.stdin.readline().split()))


if n == [1, 2, 3, 4, 5, 6, 7, 8]:
    print("ascending")
elif n == [8, 7, 6, 5, 4, 3, 2, 1]:
    print("descending")
else:
    print("mixed")

3.장애물 인식 프로그램 - bfs 이용

import sys

from collections import deque

answer = []
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]

def bfs(x, y):
    count = 1
    q = deque()
    q.append((x, y))
    visited[x][y] = True

    while q:
        x, y = q.popleft()
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if -1 < nx < n and -1 < ny < n:
                if not visited[nx][ny] and graph[nx][ny] == '1':
                    q.append((nx, ny))
                    visited[nx][ny] = True
                    count += 1

    answer.append(count)


n = int(input())
graph = [input() for _ in range(n)]
visited = [[False] * n for _ in range(n)]

for i in range(n):
    for j in range(n):
        if not visited[i][j] and graph[i][j] == '1':
            bfs(i, j)

print(len(answer))
print('\n'.join(map(str, sorted(answer))))

4. 지도 자동 구축 - dp

import sys

n = int(input())
dp = [0] * 16
dp[0] = 2 # 한 변에 존재하는 점의 갯수

for i in range(1, n+1):
    dp[i] = dp[i-1] + (dp[i-1] -1) # 2 3 5 9

print(dp[n]**2)

5. 비밀메뉴 - 리스트에서 특정 리스트 포함되어 있는지 확인

import sys

m, n, k = map(int, input().split())
secreat = list(map(int, input().split()))
li = list(map(int, input().split()))

result = False
for i in range(len(li)):
    if li[i] == secreat[0]:
        count = 0
        for j in range(len(secreat)):
            if i+j >= len(li):
                break
            else:
                if li[i+j] == secreat[j]:
                    count += 1
        if count == len(secreat):
            result = True


if result == True:
    print("secret")
else:
    print("normal")

6. 회의실 예약 - 어렵(단순구현)

import sys

n, m = map(int, input().split())
room = {}

for i in range(n): # room 리스트 넣기
    room_name = input()
    room[room_name] = [[i, i+1] for i in range(9, 18)] #[i, i+1]

#print(*room)

for _ in range(m):
    a, b, c = map(str, input().split()) 
    for i in range(int(b), int(c)):
        if [i,i+1] not in room[a]:
            pass
        else:
            room[a].remove([i,i+1]) # 예약 가능한 시간에서 제거하기ㅏ

#print(*room['sonata']) # [9,10][11,12][12,13][13,14][16,17][17,18] 

for val in sorted(room.keys()): # 예약 불가능 한 경우, room이름으로 오름차순
    if len(room[val]) == 0: # 가능한 시간 없는 경우
        print("Room " + val + ":")
        print("Not available")

        if val == sorted(room.keys())[-1]: # 마지막 val이면 하이픈 출력 안하고 종료
            break
        else:
            print("-----")

        continue # 다음 val값으로 
    
    else: # 예약이 다 차지 않았을 경우
        tmp = []
        answer = []

        for i in range(len(room[val])):
            if len(room[val]) == 1:
                tmp.append(room[val][i])
            
            if len(room[val])-1 == i:
                tmp.append(room[val][i])
            elif 0 <= i < len(room[val])-1:
                if room[val][i][1] == room[val][i+1][0]:
                    tmp.append(room[val][i])
                else:
                    tmp.append(room[val][i])
                    answer.append([tmp[0][0], tmp[-1][1]])
                    tmp = [] #초기화
        if tmp == []:
            pass
        else:
            answer.append([tmp[0][0], tmp[-1][1]])

        print("Room " + val + ":")
        print(len(answer), "available:")

        for i in range(len(answer)):
            if answer[i][0] == 9:
                answer[i][0] = "09"
                print(answer[i][0] + "-" + str(answer[i][1])) 

            else:
                print(str(answer[i][0]) + "-" + str(answer[i][1])) 
        if val == sorted(room.keys())[-1]:
            break
        else:
            print("-----")

7. 전광판 - 아이디어(단순구현)

import sys

arr = [[1,1,1,0,1,1,1],[0,0,1,0,0,1,0],[1,0,1,1,1,0,1],[1,0,1,1,0,1,1],[0,1,1,1,0,1,0],[1,1,0,1,0,1,1],[1,1,0,1,1,1,1],[1,1,1,0,0,1,0],[1,1,1,1,1,1,1],[1,1,1,1,0,1,1]]

n = int(input())
for _ in range(n):
    a, b = input().split() 
    while len(a) < 5:
        a = '-' + a
    while len(b) < 5:
        b = '-' + b

    result = 0
    for i in range(5):
        if a[i] == '-' and b[i] == '-':
            continue
        elif a[i] == '-':
            for j in arr[int(b[i])]:
                if j == 1:
                    result += 1

        elif b[i] == '-':
            for j in arr[int(a[i])]:
                if j == 1:
                    result += 1

        else:
            for j in range(7):
                if not arr[int(a[i])][j] == arr[int(b[i])][j]:
                    result += 1

    print(result)

8. gcb - 그냥 제한 값 다 넣고, 다 돌려서 비교하기(효율성은 거의 비슷하네,,)

import sys

n, m = map(int, input().split())

limit = [0 for i in range(101)]
h = 0
for i in range(n):
    a, b = map(int, input().split())
    for j in range(h+1, h+a+1):
        limit[j] = b
    h += a

speed = [0 for i in range(101)]
h = 0
for i in range(m):
    a, b = map(int, input().split())
    for j in range(h+1, h+a+1):
        speed[j] = b
    h += a

max_value = 0
for i in range(101):
    max_value = max(max_value, speed[i] - limit[i]) 

print(max_value)