๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ต์ ์— ๋ณ„ ๋งŒ๋“ค๊ธฐ - ํŒŒ์ด์ฌ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ต์ ์— ๋ณ„ ๋งŒ๋“ค๊ธฐ - ํŒŒ์ด์ฌ

.23 2024. 11. 17. 20:07
๋ฌธ์ œ

๐Ÿ”— ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๊ต์ ์— ๋ณ„ ๋งŒ๋“ค๊ธฐ

Ax + By + C = 0์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” n๊ฐœ์˜ ์ง์„ ์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด ์ง์„ ์˜ ๊ต์  ์ค‘ ์ •์ˆ˜ ์ขŒํ‘œ์— ๋ณ„์„ ๊ทธ๋ฆฌ๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ง์„  5๊ฐœ๋ฅผ

  • 2x - y + 4 = 0
  • -2x - y + 4 = 0
  • -y + 1 = 0
  • 5x - 8y - 12 = 0
  • 5x + 8y + 12 = 0

์ขŒํ‘œ ํ‰๋ฉด ์œ„์— ๊ทธ๋ฆฌ๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋•Œ, ๋ชจ๋“  ๊ต์ ์˜ ์ขŒํ‘œ๋Š” (4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4), (1.5, 1.0), (2.1, -0.19), (0, -1.5), (-2.1, -0.19), (-1.5, 1.0)์ž…๋‹ˆ๋‹ค. ์ด ์ค‘ ์ •์ˆ˜๋กœ๋งŒ ํ‘œํ˜„๋˜๋Š” ์ขŒํ‘œ๋Š” (4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4)์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ •์ˆ˜๋กœ ํ‘œํ˜„๋˜๋Š” ๊ต์ ์— ๋ณ„์„ ๊ทธ๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ฌธ์ž์—ด๋กœ ๋‚˜ํƒ€๋‚ผ ๋•Œ, ๋ณ„์ด ๊ทธ๋ ค์ง„ ๋ถ€๋ถ„์€ *, ๋นˆ ๊ณต๊ฐ„(๊ฒฉ์ž์„ ์ด ๊ต์ฐจํ•˜๋Š” ์ง€์ )์€ .์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"..........."  
".....*....."  
"..........."  
"..........."  
".*.......*."  
"..........."  
"..........."  
"..........."  
"..........."  
".*.......*."  
"..........."  

์ด๋•Œ ๊ฒฉ์žํŒ์€ ๋ฌดํ•œํžˆ ๋„“์œผ๋‹ˆ ๋ชจ๋“  ๋ณ„์„ ํฌํ•จํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ํฌ๊ธฐ๋งŒ ๋‚˜ํƒ€๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ •๋‹ต์€

"....*...."  
"........."  
"........."  
"*.......*"  
"........."  
"........."  
"........."  
"........."  
"*.......*"  

์ž…๋‹ˆ๋‹ค.

์ง์„  A, B, C์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด line์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋•Œ ๋ชจ๋“  ๋ณ„์„ ํฌํ•จํ•˜๋Š” ์ตœ์†Œ ์‚ฌ๊ฐํ˜•์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

์ œํ•œ์‚ฌํ•ญ

 

  • line์˜ ์„ธ๋กœ(ํ–‰) ๊ธธ์ด๋Š” 2 ์ด์ƒ 1,000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • line์˜ ๊ฐ€๋กœ(์—ด) ๊ธธ์ด๋Š” 3์ž…๋‹ˆ๋‹ค.
    • line์˜ ๊ฐ ์›์†Œ๋Š” [A, B, C] ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
    • A, B, C๋Š” -100,000 ์ด์ƒ 100,000 ์ดํ•˜์ธ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ๊ต์ ์ด ์ƒ๊ธฐ๋Š” ์ง์„  ์Œ์€ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • A = 0์ด๋ฉด์„œ B = 0์ธ ๊ฒฝ์šฐ๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ •๋‹ต์€ 1,000 * 1,000 ํฌ๊ธฐ ์ด๋‚ด์—์„œ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.
  • ๋ณ„์ด ํ•œ ๊ฐœ ์ด์ƒ ๊ทธ๋ ค์ง€๋Š” ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

 


๋˜๊ฒŒ ์‰ฌ์šด ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ๋ฌธ์ œ ๊ฐ™์€๋ฐ,

์ƒ๊ฐ๋ณด๋‹ค๋Š” ๊ณ ๋ คํ•ด์•ผ ๋  ์ ์ด ๋ช‡๊ฐ€์ง€ ์žˆ๋‹ค.

 

์ฐธ๊ณ  ์‚ฌํ•ญ์ด ์—†์—ˆ์œผ๋ฉด ์–ด๋ ค์› ๊ฒ ์ง€๋งŒ.. ์žˆ์–ด์„œ ๊ทธ๋ž˜๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ใ…œใ…œ

 

์ƒ๊ฐํ–ˆ๋˜ ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.:

- ์ž…๋ ฅ๋ฐ›์€ ์„  ๋ผ๋ฆฌ์˜ ๋ชจ๋“  ์กฐํ•ฉ์„ ํ†ตํ•ด ๊ต์ ์„ ๊ณ„์‚ฐํ•ด์ค€๋‹ค.

- ์ง์„ ์ด ์„œ๋กœ ํ‰ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ผ์น˜ํ•˜์—ฌ ๊ธฐ์šธ๊ธฐ๊ฐ€ 0์ธ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ต์ ์„ ๊ณ„์‚ฐํ•ด์ฃผ๋˜,

   ๊ต์ ์˜ ์ขŒํ‘œ๊ฐ€ ์ •์ˆ˜์ธ ๊ฒฝ์šฐ์—๋งŒ ์ขŒํ‘œ ๋ฐฐ์—ด์— ์ขŒํ‘œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

for i in range(len(line)):
    for j in range(i + 1, len(line)):
        if incline(line[i], line[j]) == 0:
            continue
        else:
            x, y = cross(line[i], line[j])
            
            if(x == int(x) and y == int(y)):
                coord.append([x, y])

- ์ขŒํ‘œ ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ์ตœ๋Œ€/์ตœ์†Œ ๋ฐ”์šด๋”๋ฆฌ๋ฅผ ํ•œ์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด x, y ๊ฐ๊ฐ ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ์ €์žฅํ•ด๋‘”๋‹ค.

- ์ตœ๋Œ€์ตœ์†Œ ๋ฐ”์šด๋”๋ฆฌ๋งŒํผ '.' ๋งŒ ๋‹ด๊ธด temp ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์ฃผ๊ณ ,

   ๊ต์ ์ด ๋“ค์–ด๊ฐ€๋Š” ์œ„์น˜์—๋Š” '*'๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

์ด๋•Œ ์ค‘์š”ํ•œ ์ž‘์—…์€

์ž…๋ ฅ๋ฐ›์€ ์ขŒํ‘œ๊ณ„์™€ ์ปดํ“จํ„ฐ ๋ฐฐ์—ด์˜ ์œ„์น˜๋ฅผ ์ผ์น˜์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

for i in coord:
    temp[y_max - int(i[1])][int(i[0]) - x_min] = '*'

 

 

์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”์ค€ ํ›„,

answer ๋ฐฐ์—ด์— join์„ ํ†ตํ•ด ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋ฉด ๋!!

for i in range(len(temp)):
    answer[i] = ''.join(temp[i])

 

 

์ฝ”๋“œ
def incline(line1, line2):
    inc = (line1[0] * line2[1] - line1[1] * line2[0])
    return inc

def cross(line1, line2):
    x = (line1[1] * line2[2] - line1[2] * line2[1])
    y = (line1[2] * line2[0] - line1[0] * line2[2])
    inc = incline(line1, line2)

    return [x / inc, y / inc]

def solution(line):
    coord = []

    for i in range(len(line)):
        for j in range(i + 1, len(line)):
            if incline(line[i], line[j]) == 0:
                continue
            else:
                x, y = cross(line[i], line[j])
                
                if(x == int(x) and y == int(y)):
                    coord.append([x, y])
    
    x_list = [i[0] for i in coord]
    y_list = [i[1] for i in coord]

    x_min = int(min(x_list))
    x_max = int(max(x_list))
    y_min = int(min(y_list))
    y_max = int(max(y_list))

    temp = [['.'] * (x_max - x_min + 1) for _ in range(y_max - y_min + 1)]

    for i in coord:
        temp[y_max - int(i[1])][int(i[0]) - x_min] = '*'

    answer = ['' for _ in range(y_max - y_min + 1)]
    for i in range(len(temp)):
        answer[i] = ''.join(temp[i])
        
    return answer