728x90
320x100
문제
https://school.programmers.co.kr/learn/courses/30/lessons/161990
접근
세로점을 y축, 가로점을 x축이라고 가정하면 드래그 좌표는 (y,x)가 된다.
1. 입력이 ["..........", ".....#....", "......##..", "...##.....", "....#....."] 형태이므로 index함수를 사용해 y축이 몇번째 행인지 판단한다.
2-1. find() 함수를 사용해 해당 행에 #(파일)이 처음나오는 위치를 찾고
2-2. rfind() 함수로 #(파일)이 마지막에 나오는 위치를 찾는다.
3. 행과 열을 각각 오름차순 정리하고 첫번째 값과 마지막 값을 반환해서 최소, 최대를 찾는다.
1차시도
def solution(wallpaper):
answer = []
x_list = []
y_list=[]
for string in wallpaper:
y = wallpaper.index(string) # 행 정렬
x1 = string.find('#') # 해당 행의 첫 파일 위치 (드래그 시작)
x2 = string.rfind('#')+1 # 해당 행의 마지막 파일 위치 (드래그 끝)
if x1 != -1: # 파일이 있는 행에 대하여
x_list.append(x1) #시작점
x_list.append(x2) #끝점
y_list.append(y)
#오름차순 정렬
x_list.sort()
y_list.sort()
answer.append(y_list[0])
answer.append(x_list[0])
answer.append(y_list[-1]+1) # y좌표 드래그 끝
answer.append(x_list[-1])
return answer
이렇게 했는데 몇 테스트케이스에서 실패가 떴다.
answer.append(y_list[-1]+1) 때문에 중복 계산이 되는 사례가 있는 것으로 판단하고
코드를 정리해보기로 함.
2차 시도
1. wallpaper 리스트의 각 행의 인덱스,값에 접근 할 때 index 값을 직접 넣는 대신 enumerate 함수를 사용
2. 입출력 예 처럼 첫 행에만 파일이 없을 때가 아닌, 중간에도 없을 때를 대비해 .#이 없을 때 빈 리스트를 반환하도록 처리해줘야 한다.
3. 리스트를 오름차순으로 정렬해 찾는 대신 min과 max를 이용해 최대, 최소를 찾는다.
def solution(wallpaper):
answer = []
x_list = []
y_list = []
for y, string in enumerate(wallpaper):
x1 = string.find('#') # 해당 행의 첫 '#' 문자 위치 (드래그 시작)
x2 = string.rfind('#') + 1 # 해당 행의 마지막 '#' 문자 위치 (드래그 끝)
if x1 != -1:
x_list.append(x1)
x_list.append(x2)
y_list.append(y)
if not x_list or not y_list:
return [] # '#' 문자가 없는 경우 빈 리스트를 반환
x_min = min(x_list)
x_max = max(x_list)
y_min = min(y_list)
y_max = max(y_list) + 1 # y좌표 드래그 끝
answer = [y_min, x_min, y_max, x_max]
return answer
300x250
반응형
GitHub 댓글