파이썬 알고리즘

SWEA 1210 사다리

뜻 지, 깨달음 오 2022. 9. 16. 15:03

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14ABYKADACFAYh 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

코드를 구현하기 전에 해야하는 생각

이 말은 내가 도달해야하는 지점 (X표시 지점)이 고정되어있다는 것을 의미한다.

지금은 시작점:?

            끝점: X표시

이니까

고정된 끝점에서 사다리를 따라가면 마지막에 내가 원하는 시작점에 도달할 수 있겠다고 생각하면 된다.

 

 

따라서 맨 끝점에 있는 x좌표를 먼저 찾아주기로 했다

T = 10
for tc in range(1, T+1):
    n = int(input())
    ladder = [list(map(int, input().split())) for _ in range(100)]

    # 시작점 찾기 (맨끝줄의 x좌표 찾기)
    x = 0
    for s in range(100):
        if ladder[99][s] == 2:
            x= s
    y = 99

시작점은 2라고 했으니까 찾아준 후, 시작점 x, y를 따로 변수에 저장했다.

    # 다이렉트배열 (오른쪽이나 왼쪽에 갈수있는 길 있으면 오,왼 먼저인거 확인)
    dy = [0, 0, -1]
    dx = [-1, 1, 0]

사다리 탈때, 위로 올라가면서

양옆에 갈 수 있는 길이 생기면 무조건 그쪽으로 가야된다!!

그래서 다이렉트 배열을 만들때 x쪽을 먼저가게끔 만들어줘야한다

 

    while y>=0:
        for i in range(3):
            # 다음에 가는 칸 확인
            ny = y+dy[i]
            nx = x+dx[i]
            #범위 벗어나면 다음거로 넘어가기
            if nx<0 or nx>99 or ny>99:
                continue

            if ladder[ny][nx] == 1:
                idx = i
                ladder[y][x] = 3 #이미 갔던 칸 안가도록 체크 해주기
                y+=dy[idx]
                x+=dx[idx]
                break

    print(f'#{tc} {x}')

for문을 돌면서 다음에 내가 갈 칸을 확인하고, 조건이 맞으면 다음칸으로 간다.

1이라는 숫자가 사다리를 표시하니까 좌표값이 1이면, 그쪽으로 간다고 코드를 짜준다.

이때, 내가 이미 지나간 칸은 1이 아닌 다른 문자나 숫자로 꼭 표시를 해줘야한다!!!

이걸 안하면 사다리의 한 칸에서 좌우로만 무한루프를 돌게된다는 것을 알게됨...(나도 알고싶지 않았다)

 

 

1) 사다리에서 끝점을 알고있으면, 시작~끝으로 가지 말고 끝~시작으로 간다고 생각하기

2) 사다리는 양옆으로 길이 있으면 무조건 그쪽으로 가니까 다이렉트 배열짤때 주의하기

3) 이미 갔던 칸을 돌아가는 일이 없도록 숫자 바꿔주기

만 주의하면 되는 문제였다

 

 

 

전체코드는 이러하다.

T = 10
for tc in range(1, T+1):
    n = int(input())
    ladder = [list(map(int, input().split())) for _ in range(100)]
    
    # 시작점 찾기 (맨끝줄의 x좌표 찾기)
    x = 0
    for s in range(100):
        if ladder[99][s] == 2:
            x= s
    y = 99

    # 다이렉트배열 (오른쪽이나 왼쪽에 갈수있는 길 있으면 오,왼 먼저인거 확인)
    dy = [0, 0, -1]
    dx = [-1, 1, 0]
    
    
    while y>=0:
        for i in range(3):
            # 다음에 가는 칸 확인
            ny = y+dy[i]
            nx = x+dx[i]
            #범위 벗어나면 다음거로 넘어가기
            if nx<0 or nx>99 or ny>99:
                continue
            
            if ladder[ny][nx] == 1:
                idx = i
                ladder[y][x] = 3 #이미 갔던 칸 안가도록 체크 해주기
                y+=dy[idx]
                x+=dx[idx]
                break

    print(f'#{tc} {x}')

'파이썬 알고리즘' 카테고리의 다른 글

SWEA 그래비티 풀이2  (0) 2022.09.20
재귀 DFS 문제: 단어 최소 사용 개수 구하기  (0) 2022.09.18
SWEA 1216 회문2  (1) 2022.09.16
SWEA 1221 GNS  (0) 2022.09.16
SWEA 4861 회문  (0) 2022.09.16