본문 바로가기

알고리즘/정렬

파이썬 | 백준 | 1728 | 구슬 굴리기 | list에 있는지 : in 없는지 : not in

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

solution

1. N 개의 구슬 --> N크기의 일차원 배열 생성

 

import sys

n = int(sys.stdin.readline())

coor = []
for i in range(n+1):
    coor.append(list(map(int, sys.stdin.readline().split())))

loc_v = {}	# 처음 위치, 속도 저장 (y좌표는 겹치지 않으므로 딕셔너리 이용)

for y in range(n):
    v_candidate = []	# 속도가 될 수 있는 후보들을 1차원 배열에 저장
    for i in range(n):
        v_tmp = (coor[-1][i]-coor[0][y]) / n	# (마지막 위치 - 처음 위치) / n
        v_candidate.append(v_tmp)
	
    for v in v_candidate:	# 속도 대입
        for i in range(1, len(coor)-1):
            if coor[0][y]+v*i not in coor[i]:	# 계산한 위치가 좌표 리스트에 없으면 for문 나감
                break	

        if i == len(coor)-2:	# 계산한 위치가 모두 좌표에 있었다면
            loc_v[coor[0][y]] = int(v)	# 딕셔너리에 처음 위치와 속도를 저장
            for i in range(1, len(coor)-1):
                coor[i].remove(coor[0][y]+v*i)	# 탐색 시간을 줄이기 위해 이미 답을 구한 것은 좌표에서 제거
            break

loc_v = sorted(loc_v.items(), key=lambda x: x[0])	# 처음 위치를 기준으로 오름차순 정렬

for i in range(len(loc_v)):
    print(loc_v[i][0], loc_v[i][1])

38592KB

3488ms


for i in range(1, len(coor)-1):
	coor[i].remove(coor[0][y]+v*i)	# 탐색 시간을 줄이기 위해 이미 답을 구한 것은 좌표에서 제거
	break

없으면 

38562KB

6320ms