Carnival7
Change Developer
Carnival7
전체 방문자
오늘
어제
  • 분류 전체보기
    • 자바의 정석
    • 프로그래밍 언어별 tools
      • 파이썬
      • 자바
    • 코딩 테스트
      • 백준 강의 기초편
      • 백준 강의 연습편
      • 백준 강의 문제편
      • 삼성 기출
      • 백준 - 일반
      • 카카오 기출
      • 프로그래머스 - 일반
      • 코테 풀이 Tools
    • CS
      • Network
      • 운영체제
      • 알고리즘
      • DB
    • Web_Backend
      • Spring
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
      • 스프링 핵심 원리 - 기본편
    • DevOps
    • IT 업무 지식
      • 인프라
      • 클라우드
    • 자격증
      • AWS - CLF
      • 정처기 - 실기
    • 생각 정리

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 슬라이딩 윈도우
  • ci/cd
  • 알고리즘 #백준강의기초편 #코딩테스트
  • 슬라이딩 윈도우 #덱
  • 코딩테스트 #삼성기출 #구현 #시뮬레이션
  • code deploy
  • DMZ
  • 스프링 #AOP
  • 삼성기출 #백준강의문제편
  • 삼성기출 #2023 #상반기
  • nginx
  • 스프링 #인터셉터 #AOP #필터
  • Github Actions
  • DevOps
  • 스프링 부트 무중단 웹 서비스
  • 프로그래머스 #카카오기출 #레벨2

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Carnival7

Change Developer

코딩 테스트/프로그래머스 - 일반

레벨2.교점에 별 만들기

2021. 11. 19. 18:26

 

문제 : https://programmers.co.kr/learn/courses/30/lessons/87377

 

코딩테스트 연습 - 교점에 별 만들기

[[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

1. 파이썬 풀이

from itertools import combinations

# solutio 1 : combinations 사용
def solution(line):
    answer = []

    INF = float('inf')

    intersections=[]

    max_x=-INF
    min_x=INF
    max_y=-INF
    min_y=INF

    # 문제에 나온 공식대로 모든 정수 교차점과 좌표의 최대/최솟값을 구합니다.
    for first,second in combinations(line,2):
        a,b,e = first
        c,d,f = second

        mod = (a*d - b*c)
        if mod==0:
            continue

        x = (b * f - e * d) / mod
        y = (e * c - a * f) / mod

        if x!=int(x) or y!=int(y):
            continue
        x=int(x)
        y=int(y)

        intersections.append((x,y))

        max_x = max(x, max_x)
        min_x = min(x, min_x)
        max_y = max(y, max_y)
        min_y = min(y, min_y)

    # 너비와 높이를 계산 후, 별을 찍습니다.
    h=max_y-min_y+1
    w=max_x-min_x+1

    matrix = [['.'] * w for _ in range(h)]

    for x,y in intersections:
        matrix[max_y-y][x-min_x] = '*'

    for i in range(h):
        answer.append("".join(matrix[i]))

    return answer

포인트

1. 높이는 maxY - minY + 1가 되고 너비는 maxX - minX + 1가 됩니다.
별을 찍을 때는 그래프 안에 있는 점들을 1사분면에 옮긴다 생각하시면 되는데
그 이유는 컴퓨터의 2차원 배열이 그래프의 1사분면을 뒤집은 형태로 표현되기 때문입니다.
그래서 y좌표 = maxY - y, x좌표 = x - minX의 결과가 나옵니다.

 

참조 : https://velog.io/@front/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B5%90%EC%A0%90%EC%97%90-%EB%B3%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%9C%84%ED%81%B4%EB%A6%AC-%EC%B1%8C%EB%A6%B0%EC%A7%80-10%EC%A3%BC%EC%B0%A8

 

프로그래머스 - 교점에 별 만들기 (위클리 챌린지 10주차)

문제 링크설명Ax + By + C = 0으로 표현할 수 있는 n개의 직선이 주어질 때, 이 직선의 교점 중 정수 좌표에 별을 그리려 합니다.예를 들어, 다음과 같은 직선 5개를2x - y + 4 = 0\-2x - y + 4 = 0\-y + 1 = 05x -

velog.io

 

2. 자바 풀이

import java.util.*;

public String[] solution(int[][] line) {
        List<long[]> list = new ArrayList<>();
        int n = line.length;

        long  max_X = Long.MIN_VALUE, max_Y = Long.MIN_VALUE, min_X = Long.MAX_VALUE, min_Y =Long.MAX_VALUE;

        for(int i=0;i<n-1;i++){
            for(int j=i+1;j<n;j++){
                double a=line[i][0], b=line[i][1], e=line[i][2], c=line[j][0], d=line[j][1], f=line[j][2];
                double mod = a*d - b*c;
                if(mod == 0) continue;
                double x=(b*f-e*d)/mod, y=(e*c-a*f)/mod;
                long ix=(long)x; long iy=(long)y;
                if(x== ix && y==iy) {
                    min_X = Math.min(ix, min_X);
                    max_X = Math.max(ix, max_X);
                    min_Y = Math.min(iy, min_Y);
                    max_Y = Math.max(iy, max_Y);
                    list.add(new long[] { ix, iy });
                }
            }
        }

        int h = (int)(max_Y - min_Y + 1);
        int w = (int)(max_X-min_X + 1);

        char[][] map = new char[h][w];
        for(char[] m : map) Arrays.fill(m, '.');
        for(long[] a : list) map[(int)(max_Y -a[1])][(int)(a[0] -min_X)] = '*';
        String[] answer = new String[map.length];
        for(int i = 0; i < map.length; i++) answer[i] = new String(map[i]);
        return answer;
    }
배울 점
1. 무한에 수렴하는 큰 값 표현할 때, Long.MIN_VALUE, Long.MIN_VALUE 사용
2. char 배열 빈 칸 채울 때, Arrays.fill(m, '.'); 사용
3. foreach 문 활용하여 심플하게 나타내기. for(long[] a : list) map[(int)(max_Y -a[1])][(int)(a[0] -min_X)] = '*';

'코딩 테스트 > 프로그래머스 - 일반' 카테고리의 다른 글

레벨2. 이중우선순위큐  (0) 2021.11.19
level 2.소수 찾기  (0) 2021.10.23
    '코딩 테스트/프로그래머스 - 일반' 카테고리의 다른 글
    • 레벨2. 이중우선순위큐
    • level 2.소수 찾기
    Carnival7
    Carnival7

    티스토리툴바