알고리즘
[프로그래머스] 교점에 별 만들기
JH_Lucid
2022. 8. 3. 14:09
문제 링크
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근
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] = "*"