forDevLife
[프로그래머스] 교점에 별 만들기 본문
문제 링크
접근
1. combination으로 경우의 수를 만들고 교점을 추출한다.
2. 해당 교점이 정수라면 result에 넣는다.
3. result에서 x_min, x_max, y_min, y_max를 뽑고, 해당 사이즈 만큼 배열을 만들어 '.'로 초기화 한다.
4. result를 하나씩 반복하며 일치하는 좌표에 '*'를 넣는다.
코드
def solution(line):
result = []
for i in range(0, len(line) - 1):
A, B, E = line[i]
for j in range(i + 1, len(line)):
C, D, F = line[j]
denominator = (A * D) - (B * C)
if denominator == 0:
continue
x = ((B * F) - (E * D)) // denominator
y = ((E * C) - (A * F)) // denominator
if ((B * F) - (E * D)) % denominator == 0 and ((E * C) - (A * F)) % denominator == 0:
result.append([x, y])
xs = [r[0] for r in result]
x_min = min(xs)
x_max = max(xs)
ys = [r[1] for r in result]
y_min = min(ys)
y_max = max(ys)
answer = [['.'] * (x_max - x_min + 1) for _ in range(y_max - y_min + 1)]
for r in result:
x, y = r
answer[y - y_min][x - x_min] = "*"
return [''.join(ans) for ans in answer][::-1]
- 배열과 좌표의 y의 방향은 아래처럼 서로 반대방향이다. 따라서 반환할 때는 뒤집어서 반환한다.
헷갈린 점
새로 생성된 배열로 좌표를 계산하는게 헷갈렸다.. 이게 헷갈릴것인지는 모르겠지만 ㅠ
아래와 같은 배열이 있다고 했을 때, x의 최대가 2, 최소가 -2로 고정된다고 가정하자.
최소 ~ 최대의 범위로 새로운 배열을 만들면 아래와 같이 될 것이다.
이 때 기존(실제)좌표를 새로운 곳에 반영하기 위해서 (실제 - 최소)로 계산하면 된다.
따라서 아래와 같은 위치에 매핑하면 된다.
for r in result:
x, y = r
answer[y - y_min][x - x_min] = "*"
'알고리즘' 카테고리의 다른 글
[프로그래머스] 아이템 줍기 (3) | 2022.08.17 |
---|---|
[프로그래머스] 섬 연결하기 (0) | 2022.07.29 |
[프로그래머스] 조이스틱 (0) | 2022.07.27 |
[프로그래머스] 무지의 먹방 라이브 (0) | 2022.07.15 |
[이코테] 만들 수 없는 금액 (0) | 2022.07.15 |
Comments