swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14BgD6AEECFAYh
#import sys
#sys.stdin = open('./.idea/1211_input.txt','r')
for _ in range(10):
tc = int(input())
row, col = 100, 100
matrix = [list(map(int, input().split())) for i in range(100)]
start_index = []
for i in range(col):
if matrix[0][i]==1:
start_index.append(i)
distance = []
for index in start_index:
r, c = 0, index
distance_tmp = 0
while r < row : # 99에 도착하면 끝
if 0 <= c-1 < col and matrix[r][c-1]: # 범위조건은 0 <= c-1만 해도 줘도 됨
while c > 0 and matrix[r][c-1]:
c -= 1
distance_tmp += 1
elif 0 <= c + 1 < col and matrix[r][c+1]: # 범위조건은 c + 1 < col 만 줘도 됨
while c < 99 and matrix[r][c+1]:
c += 1
distance_tmp += 1
r += 1
distance_tmp += 1
distance.append(distance_tmp)
min_ind, min_val = 0, row*col
for ind, val in enumerate(distance):
if min_val >= val: # 복수 개인 경우 가장 큰 x좌표
min_val = val
min_ind = ind
print(f"#{tc} {start_index[min_ind]}")
swea ladder1은 아래에서 시작해서 위로 도착했을때 column의 좌표를 찍어주는 문제였다.
ladder2는 위에서 시작해서 아래로 도착했을때 가장 짧은 이동 거리를 갖는 시작점 x를 반환하게 만들어야 한다.
matrix로 100 * 100 행렬을 받아오고, 0행에서 값이 1인 index 을 start_index에 저장한다.
저장하는 이유는 모든 경우를 확인해야하기도 하고 마지막에 가장 작은 값의 index를 출력해야하기 때문이다.
시작 좌표에서부터 좌, 우를 확인하며, 범위를 벗어나는지 확인하고 벗어나지 않으면 그 값이 1인지 확인한다.
값이 1인경우 갈수있는 방향으므로 끝에 닿을때까지 반복한다. (반복할때 계속 같은 조건을 확인한다.)
맨 아래에 도착했을때 while 반복문을 끝내고 그다음 시작 위치에서 시작한다.
중간중간 column이나 row 값이 변경될때 거리값도 계속 1씩 증가시키면 움직인 횟수를 구할 수 있다.
(모든 start_index에 대해서 이동한 거리를 구하기 위해 for문을 사용했다.)
for 반복문이 끝나면 모든 시작 좌표에 대해서 끝 좌표까지 움직인 거리가 distance 배열에 저장된다.
이 값에서 가장 작은 값을 찾고 해당 인덱스에 대해서 시작좌표를 반환하면 된다.
머리로는 쉽게 해결한 문제인데 코드를 짤때 무한 루프에 빠지기도 하였고, 해결했을때 코드가 많이 더러웠기도 했다.
공부를 위해 다른 분의 코드를 참고해서 조금 더 매끄럽게 다듬었다.
머리에 있는 것들을 구현할때, 알아볼수 있고 쉽게 만들려면 더 노력해야할것같다.
'STUDY > Algorithm' 카테고리의 다른 글
[백준] 2231 분해합 (0) | 2021.02.20 |
---|---|
[백준] 1436 영화감독 숌 (0) | 2021.02.20 |
[백준] 2447 별찍기 (0) | 2021.02.14 |
[백준] 11729 하노이 탑 이동 순서 (0) | 2021.02.14 |
[백준] 1002 터렛 (0) | 2021.02.12 |