https://www.acmicpc.net/problem/2528
2528번: 사다리
첫 번째 줄에 층 수 N (1 ≤ N ≤ 3,000)과 층의 길이 L (1 ≤ L ≤ 3,000, L은 짝수)이 주어진다. 가장 아래층은 1층이고 가장 위층은 N층이다. 다음 N개의 줄 중 i번째 줄에는 i층의 막대기의 길이 l (1 ≤ l
www.acmicpc.net
문제분석
문제 요약:
게임을 연상하면 편하다. n개의 층이 있고 층의 가로길이도 주어준다.
막대기는 좌우로 움직인다(게임처럼 반대편끝에 부딛히면 반대방향으로 감).
막대는 1시간단위마다 1칸씩 움직인다. 철수는 맨 아래층 막대에서 위로 올라가려고 하는중이다.
철수는 좌우이동하는데 시간을 소모하지 않는다.
막대기 좌표가 위아래 겹치는 경우에 철수는 위아래 이동한다. 이때도 시간을 소모하지 않는다.
막대를 객체까지 만들 필요는 없을 것 같고, 2차원배열 정도로 막대 좌표, 막대 층수, 방향 저장하면 될것같다.
해결과정
시간이 가면 막대기 배열의 좌표를 전부 바꾸는 time_gone함수 선언
while문으로, 철수가 꼭대기까지 갈동안 반복해주게 구현
어려운 문제는 아닌 것 같아서 풀이가 길지 않다.
def time_gone():#1시간이 지났을때, 위치전부변경
for i in stick:
if i[3]==0:#왼쪽>오른쪽
i[0]+=1
i[1]+=1
else: #오른쪽>왼쪽
i[0]-=1
i[1]-=1
if i[3]==0 and i[1]==l: #왼쪽>오른쪽이고, 반대편에 도착한 경우, 방향전환
i[3]=1
elif i[3]==1 and i[0]==0: #오른쪽>왼쪽이고, 반대편에 도착한 경우, 방향전환
i[3]=0
n,l=map(int, input().split())
stick=[]#[스틱의 시작점좌표,끝점좌표,층수,방향 지표] n by 3행렬, 좌표는 좌 0, 우 l 시작,층은 0 시작
for i in range(n):
length,way=map(int,input().split())
if way==0: #왼쪽>오른쪽
stick.append([0,length,i,way])
else: #오른쪽>왼쪽
stick.append([l-length,l,i,way])
person=0 #철수의 층수
time=0 #시간
while person<n-1: #철수의 층수<최고층수 일 때
for i in range(person,n-1):#철수올리기
if not(stick[i][1]<stick[i+1][0] or stick[i][0]>stick[i+1][1]):#겹치는경우
person+=1
else:break
if person<n-1:
time_gone()
time+=1
print(time)
처음 골드문제 한번에 맞춘 것 같다 ㅎㅎㅎ....
'알고리즘&백준' 카테고리의 다른 글
[JAVA] 백준 7570 줄 세우기 (0) | 2024.06.24 |
---|---|
[JAVA] 백준 1034 램프 (0) | 2024.06.24 |
[Python] 백준 1041 주사위 (2) | 2024.01.05 |
[Python] 백준 2493 탑 (2) | 2024.01.05 |
[Python] 백준 1711 직각삼각형 (0) | 2024.01.03 |