프로그래머스 10주차 - 교점에 별 만들기
코딩테스트 연습 - 10주차
[[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"] [[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"] [[1, -1, 0], [2, -1, 0], [4, -
programmers.co.kr
프로그래머스 위클리 챌린지 10주차 문제인 교점에 별 만들기를 풀어 보았다.
풀이 방식
- 인풋 안에 있는 직선들끼리 접점이 있는지 탐색
- if를 사용해서 접점이 있고 정수로만 표현될수 있는 좌표 찾기
- 정수로만 표현되는 접점들을 따로 list에 담기
- 모든 별을 포함하는 최소한의 크기의 격자판으로 나타내야 한다
- 격자판에서 동서남북 방향으로 가장 끝에 위치한 좌표를 저장
- matrix에서 인덱스가 높을수록 반대로 아래에 위치한다
- 나중에 다 만들어 놓고 뒤집어도 되고 아니면 좌표들의 y값에 - 싸인을 붙여서 음양 기호를 뒤집자
- 격자판을 만들자
- Row는 남에서 북까지의 차이
- Column은 서에서 동까지의 차이
- '.'으로 채운다
- 이제 아까 찾은 접점들을 저장한 list를 돌면서 해당 지점들을 '.'이 아닌 '*'로 바꿔준다
- 문제에서는 격자의 row들을 하나의 문자열로 원하기 때문에 list를 하나의 문자열로 붙여준다
코드
def solution(line):
answer, points = [], []
for i in range(len(line)):
a,b,e = line[i]
for j in range(i+1, len(line)):
c,d,f = line[j]
if a*d - b*c != 0 and (b*f-e*d)%(a*d-b*c) == 0 and (e*c-a*f)%(a*d-b*c)==0:
x = (b*f-e*d)//(a*d-b*c)
y = -(e*c-a*f)//(a*d-b*c)
if len(points) == 0:
top, bot = y,y
left,right = x,x
else:
top = max(top,y)
bot = min(bot,y)
left = min(left,x)
right = max(right,x)
points.append((x,y))
for _ in range(top-bot+1):
answer.append(['.']*(right-left+1))
for x,y in points:
answer[y-bot][x-left] = '*'
for i in range(len(answer)):
answer[i] = ''.join(answer[i])
return answer
'Algorithm > 프로그래머스' 카테고리의 다른 글
(파이썬) [위클리 챌린지 12주차] - 피로도 (0) | 2021.10.27 |
---|---|
(파이썬) [알고리즘 문제 풀이] - 로또의 최고 순위와 최저 순위 (0) | 2021.05.24 |
(파이썬) [알고리즘 문제 풀이] - 섬 연결하기 (프로그래머스 (0) | 2021.03.03 |
(파이썬) [알고리즘 문제 풀이] - 도둑질 (프로그래머스) (2) | 2021.03.02 |
(파이썬) [알고리즘 문제 풀이] - 정수 삼각형 (프로그래머스) (0) | 2021.02.19 |