티스토리 뷰
thinking
도착점의 column 인덱스를 찾아서 역으로 위로 올라가면서 시작점의 column 인덱스를 찾는 방향으로 설정
1. 위로 가는 경우: 왼쪽이나 오른쪽이 1이 나오면 direction 체인지
2. 오른쪽으로 가는 경우: 쭉 가다가 0 나오면 위로 턴 (d: 1 -> 0)
3. 왼쪽으로 가는 경우: 쭉 가다가 0 나오면 위로 턴 (d: 2 -> 0)
반복문을 돌리면서 이동해야 하는데 코드를 도대체 어케 짜야 하는지 감이 안왔다......
그래서 아래 처럼 그림판으로 일일이 좌표를 찾으며 디버깅을 했다 ^^
100 x 100 배열이라 눈알 빠질뻔 ㅎ;; 답답하고 멍청해보일지라도 이해에 아주 직빵이었다 ㅎ
위로 쭉 갈때는 column은 동일하고 row만 바뀐다. 이때, 왼쪽이나 오른쪽이 1이면 그 방향으로 꺾어야한다.
방향 전환은 왼쪽 아니면 오른쪽이므로 두번의 if문이 아닌 if~elif 문으로 설정하여 첫 if문을 빠져나와도 다음 조건문에 해당하지 않도록 설정했다. 만약 왼쪽 오른쪽 각각 두번의 if 문을 사용하면 (6,2) -> (6,7)까지 이동했다가 다시 (6,7) -> (6,2)로 이동하는 대참사가 발생한다.
오른쪽으로 꺾으려면 현재 column의 오른쪽 값이 1이기 때문에 a[r][c+1] == 1
이라는 조건을 설정했고, 방향 전환을 위해 d
를 1로 설정했다.
이때 반복문을 빠져나오지 않고 계속 오른쪽으로 가기 위해 while 반복문을 돌렸고 (6,8)
처럼 그 다음 열이 0이라면 반복문을 종료하도록 break
를 걸어줬다.
왼쪽 역시 마찬가지로 동일하게 설정하되, 왼쪽이므로 a[r][c-1] == 1
이라는 조건을 설정했고, 방향 전환을 위해 d
를 2로 설정했다. 마찬가지로 (3,3)
처럼 그 다음 열이 0이라면 반복문을 종료하도록 break
를 걸어줬다.
왼쪽, 오른쪽 이동이 아니라면 무조건 위로 직진하도록 조건문 하단에 위쪽 방향의 direction(d = 0
)을 설정했다.
초기 row 인덱스를 99로 초기화해주고 while문 돌리다가 row 인덱스가 0이 되면 반복문 종료하고 출력하도록 break
를 설정해줬다.
✔ 완전 중요한 포인트는 이동은 우리가 보는 화면 방향 그대로라는 것이다 !
오른쪽으로 쭉 가다가 방향을 꺾을때 왼쪽으로 턴한거 같지만 배열의 인덱스로 보면 row 인덱스가 하나 감소했기 때문에 위로 이동한다고 봐야된다 ! (왼쪽 역시 마찬가지)
그림 안그리고 머리속으로 생각했을 때 여기서 계속 막혔다... 코드의 조건이 너무 많아지는게 아닌가 엄청 고민했는데 알고보니 내가 멍충한것이었음 😇
코드
import sys
sys.stdin = open("input.txt")
# direction 설정 (위, 오, 왼)
dr = [-1, 0, 0]
dc = [0, 1, -1]
T = 10
for tc in range(1, T+1):
t = int(input())
# 양 끝에 벽을 세워주기 위해 0 컬럼 추가
a = [[0] + list(map(int, input().split())) + [0] for _ in range(100)]
# c: 도착점 column idx 구하기
for j in range(102):
if a[99][j] == 2:
c = j
# 방향 위로 초기화
d = 0 # 0: 위, 1: 오, 2: 왼
r = 99
while True:
# 반복문 계속 돌리다가 row 인덱스가 0 이 되면 끝내고 리턴
if r == 0:
break
# 왼쪽에 1이 있으면 왼쪽으로 계속 가다가 0 나오면 반복문 종료
if a[r][c-1]:
d = 2
while True:
r += dr[d]
c += dc[d]
if a[r][c-1] == 0:
break
# 오른쪽에 1이 있으면 오른쪽으로 계속 가다가 0 나오면 반복문 종료
elif a[r][c+1]:
d = 1
while True:
r += dr[d]
c += dc[d]
if a[r][c+1] == 0:
break
# 양옆에 1 하나도 없으면 계속 직진(i.e. d=0) 또는
# 왼쪽이든 오른쪽이든 가다가 next col에서 0이면 d=0(위)로 체인지
d = 0
r += dr[d]
c += dc[d]
print("#{} {}".format(t, c-1))
'algorithm > swea' 카테고리의 다른 글
[swea] 1220. Magnetic / python 파이썬 (0) | 2021.04.08 |
---|---|
[swea] 1219. 길찾기 / python 파이썬 (1) | 2021.04.08 |
[swea] 4869. 종이붙이기 / python 파이썬 (0) | 2021.04.08 |
[swea] 1860. 진기의 최고급 붕어빵 / python 파이썬 (0) | 2021.02.26 |
[swea] 1954. 달팽이 숫자 / python 파이썬 / 2차원 배열의 인덱스 접근 (1) | 2021.02.17 |
- 기지국설치
- git 미러링
- 브루트포스
- react
- 20057 마법사 상어와 토네이도
- Python
- 백준
- swea
- 프로그래머스
- 알고리즘
- merge에러
- 보석쇼핑
- BFS
- 삼성코테
- 삼성기출
- 20056 마법사 상어와 파이어볼
- dp
- 17406 배열돌리기4
- 파이썬
- dfs
- 2579 계단오르기
- 2018 카카오 공채
- merge 에러
- 21609 상어 중학교
- 영어끝말잇기
- Total
- Today
- Yesterday