문제
풀이
문제 접근
10 * 10의 격자에서
L에서 시작해 B 에 도착하는
최단 거리를 구한다.
이때, R을 거치지 않아야한다.
최단 경로에서
R을 마주치게 되는 경우는
L, R, B가 가로 또는 세로에
일직선상으로 위치하는 경우다.
따라서 총 3가지 케이스인
가로 겹침, 세로 겹침, 안 겹침을
생각해볼 수 있다.
알고리즘
편의상 설명에서는 격자 사이즈를 5*5로 했다.
case1
L, R, B가 일직선으로 있지 않은 경우
(각자 다른 줄에 위치하는 경우)
최단 거리를 구하면
어느 경로에서든 4가된다.
case2
같은 세로줄에 위치하는 경우
최단 거리를 구하면
R이 없을 경우 2다.
하지만 R이 길을 막고 있어
돌아 가야함으로
+2가 되어 4가된다.
case3
같은 가로줄에 위치하는 경우
최단 거리를 구하면
R이 없을 경우 1이다.
하지만 R이 길을 막고 있어
돌아 가야함으로
+2가 되어 3이된다.
주의할 점
일직선상에 존재한다고 해도
R이 L과 R의 경로 밖에 존재하면
돌아가지 않음으로 +2를 하지 않는다.
코드
arr = [list(input()) for _ in range(10)]
lx, ly = 0,0
rx, ry = 0,0
bx, by = 0,0
def find_lrb(lx,ly,rx,ry,bx,by):
find_cnt = 0
for x in range(10):
for y in range(10):
if arr[x][y] == 'L':
lx, ly = x, y
find_cnt += 1
elif arr[x][y] == 'R':
rx, ry = x, y
find_cnt += 1
elif arr[x][y] == 'B':
bx, by = x, y
find_cnt += 1
if find_cnt > 2:
return lx,ly,rx,ry,bx,by
lx,ly,rx,ry,bx,by = find_lrb(lx,ly,rx,ry,bx,by)
cnt = abs(lx - bx) + abs(ly-by) -1
# case3번 가로 일치
if lx == rx and rx == bx and min(ly, by) < ry and ry< max(ly, by):
print(cnt+2)
# case2번 세로 일치
elif ly==ry and ry==by and min(lx, bx) < rx and rx< max(lx, bx):
print(cnt+2)
# case1번 줄 일치x
else:
print(cnt)
① L, R, B의 위치를 구한다.
② cnt = abs(lx - bx) + abs(ly-by) -1
로
R의 존재와 상관없이 최단 거리를 구한다.
( 💡 '-1'을 하는 이유?
시작점 또는 도착점은 거리 카운트에서 제외되어야함.)
③가로 또는 세로 줄과 일치하는지 판단한다.
일직선상에 있을 경우 L과 B사이에 R이 있는지 판단한다.
④ '③'이 True인 경우 최단거리인 cnt에 +2한 결과를 출력한다.
⑤ '③'이 False인 경우 cnt를 출력한다.
'CODING TEST > Code Tree' 카테고리의 다른 글
[코드트리 조별과제] 6주차 정리 (악수와 전염병의 상관관계 2 / 작은 구슬의 이동) (0) | 2024.08.25 |
---|---|
[코드트리 조별과제] 5주차 정리(흰검 칠하기 / 신기한 타일 뒤집기) (0) | 2024.08.18 |
[코드트리 조별과제] 4주차 (정렬된 숫자 위치 알아내기 / DateTime to DateTime) (0) | 2024.08.11 |
[코드트리 조별과제] 3주차 정리(출력결과 18 / 출력결과 29 / 재귀함수를 이용한 최소공배수) (0) | 2024.08.04 |
[코드트리 조별과제] 2주차 정리 (그 계절, 그 날 / 함수를 이용한 369 게임) (0) | 2024.07.28 |