coding test - python/Programmers

Programmers / 삼각 달팽이 / Python 파이썬

sillon 2022. 9. 1. 17:52
728x90
반응형

 

*문제 출처는 프로그래머스에 있습니다.

문제 제목: 삼각 달팽이

문제 사이트: https://school.programmers.co.kr/learn/courses/30/lessons/68645


 

이미지출처: https://choichumji.tistory.com/108

코드를 통해 직사각형의 삼각형을 만든다.

나머지 부분은 0으로 채워준다

arr = [[0 for _ in range(n)] for i in range(n)]

 

여기서 화살표 방향은 세가지

1. 아래로 내려가는 방향

2. 옆으로 가는 방향

3. 대각선으로 올라가는 방향

 

row = -1 # 행 (내려가면서 해당 인덱스에 값 추가)
col = 0 # 열
cnt = 0 # 숫자

기본 변수를 정해준다.

인덱스들을 지나가면서 값을 추가해줄 것이다.

먼저 첫번째로 아래로 지나가는 경우

# 아래 방향
for i in range(n):

    row += 1
    if arr[row][col] == 0 and row < n: # 만약 숫자가 안채워져있으면
        arr[row][col] += cnt + 1
        cnt += 1
    else: # 만약 숫자가 채워져있으면 마지막 자리로 가서 for문을 빠져 나옴
        row -= 1
        break

오른쪽 방향으로 지나가는 경우

#  오른쪽 방향
for i in range(n-1):
    col += 1

    if arr[row][col] == 0 :
        arr[row][col] += cnt + 1
        cnt += 1
    else:
        col -= 1
        break

대각선 방향으로 올라가는 경우

 

# 대각선 방향
for i in range(n-2):
    col -= 1
    row -= 1
    if arr[row][col] == 0: # 만약 숫자가 안채워져있으면
        arr[row][col] += cnt + 1
        cnt += 1
    else:
        col += 1
        row += 1
        break

 

이 과정을 반복해주면 된다.

while cnt != target:

    # 아래 방향
    for i in range(n):

        row += 1
        if arr[row][col] == 0 and row < n: # 만약 숫자가 안채워져있으면
            arr[row][col] += cnt + 1
            cnt += 1
        else: # 만약 숫자가 채워져있으면 마지막 자리로 가서 for문을 빠져 나옴
            row -= 1
            break
    print(arr)
    #  오른쪽 방향
    for i in range(n-1):
        col += 1

        if arr[row][col] == 0 :
            arr[row][col] += cnt + 1
            cnt += 1
        else:
            col -= 1
            break
    print(arr)
    # 대각선 방향
    for i in range(n-2):
        col -= 1
        row -= 1
        if arr[row][col] == 0: # 만약 숫자가 안채워져있으면
            arr[row][col] += cnt + 1
            cnt += 1
        else:
            col += 1
            row += 1
            break
    print(arr)

여기서 target 값을 조건문으로 잡아주었는데,

해당 직삼각형의 크기만큼 모두 지나갔을 시 while 문을 빠져나간다.

target = (n*(n+1)) // 2

 

이렇게 완성된 코드에서 마지막으로 삼각형을 펴서 출력하면 된다.

# 삼각형 펴서 출력하기
answer = []
for i in arr:
    for j in i:
        if j != 0:
            answer.append(j)

나의 풀이

def solution(n):
    arr = [[0 for _ in range(n)] for i in range(n)]

    row = -1 # 행 (내려가면서 해당 인덱스에 값 추가)
    col = 0 # 열
    cnt = 0 # 숫자
    target = (n*(n+1)) // 2
    while cnt != target:

        # 아래 방향
        for i in range(n):

            row += 1
            if arr[row][col] == 0 and row < n: # 만약 숫자가 안채워져있으면
                arr[row][col] += cnt + 1
                cnt += 1
            else: # 만약 숫자가 채워져있으면 마지막 자리로 가서 for문을 빠져 나옴
                row -= 1
                break
        
        #  오른쪽 방향
        for i in range(n-1):
            col += 1

            if arr[row][col] == 0 :
                arr[row][col] += cnt + 1
                cnt += 1
            else:
                col -= 1
                break
        
        # 대각선 방향
        for i in range(n-2):
            col -= 1
            row -= 1
            if arr[row][col] == 0: # 만약 숫자가 안채워져있으면
                arr[row][col] += cnt + 1
                cnt += 1
            else:
                col += 1
                row += 1
                break
        
    # 삼각형 펴서 출력하기
    answer = []
    for i in arr:
        for j in i:
            if j != 0:
                answer.append(j)
    return answer

모범답안

def solution(n):
    dx=[0,1,-1];dy=[1,0,-1]
    b=[[0]*i for i in range(1,n+1)]
    x,y=0,0;num=1;d=0
    while num<=(n+1)*n//2:
        b[y][x]=num
        ny=y+dy[d];nx=x+dx[d];num+=1
        if 0<=ny<n and 0<=nx<=ny and b[ny][nx]==0:y,x=ny,nx
        else:d=(d+1)%3;y+=dy[d];x+=dx[d]
    return sum(b,[])

그래프 탐색을 이용해서 섹시하게 문제를 푼 것 같다.. 멋있다


 

 

728x90
반응형