본문 바로가기
알고리즘

백준_3649_로봇 프로젝트

by 매화of사군자 2020. 2. 11.

https://www.acmicpc.net/problem/3649

 

3649번: 로봇 프로젝트

문제 상근이와 선영이는 학교 숙제로 로봇을 만들고 있다. 로봇을 만들던 중에 구멍을 막을 두 레고 조각이 필요하다는 것을 깨달았다. 구멍의 너비는 x 센티미터이고, 구멍에 넣을 두 조각의 길이의 합은 구멍의 너비와 정확하게 일치해야 한다. 정확하게 일치하지 않으면, 프로젝트 시연을 할 때 로봇은 부수어질 것이고 상근이와 선영이는 F를 받게 된다. 구멍은 항상 두 조각으로 막아야 한다. 지난밤, 상근이와 선영이는 물리 실험실에 들어가서 레고 조각의 크기를

www.acmicpc.net

처음에 생각한 방법

> 입력을 받아 조건에 맞는 블럭1, 블럭2, 절대값을 set으로 넣는다.

> sorting 후 첫번째 set을 조건에 맞게 출력한다.

> set에 아무것도 없다면 danger 출력

 

코드

더보기

while True:
    x = int(input())
    num = int(input())

    rego = list()
    for i in range(num):
        rego.append(int(input()))

    x = x * (10 ** 7)
    correct = set()
    for i in rego:
        for j in rego:
            if i == j:
                continue
            if i + j == x:
                correct.add((i,j,abs(i-j))) if i < j else correct.add((j,i,abs(i-j)))

    a = sorted(correct,key= lambda x : -x[2])

    for i in range(len(a)):
        a[i] = list(a[i])

    if a: print("yes", a[0][0], a[0][1])
    else: print("danger")

문제점

> 시간초과....

 

해결 방법

> 문제에서 주어진 시간이 5초나 되는걸로 보아 자료형에 넣고 연산하면 안될것 같았다.

> 블럭들의 정보(list)를 sorting한다.

> start, end(초기값 : 리스트의 양 끝)을 잡아 연산하였다.(절대값이 큰 것을 선택해야 하므로)

> 연산을 줄이기 위해 덧셈을 최소화한다.

 

코드

더보기

import sys

while True:
    try:
        x = int(sys.stdin.readline()) * (10 ** 7)
    except:
        break
    num = int(sys.stdin.readline())

    rego = list()
    for i in range(num):
        rego.append(int(sys.stdin.readline()))

    rego.sort()
    
    start, end= 0, len(rego)-1
    while start < end:
        _sum = rego[start] + rego[end]
        if _sum == x:
            print("yes",rego[start], rego[end])
            break
        if _sum < x:
            start += 1
        else:
            end -= 1
    if start >= end:
        print("danger")

댓글