코딩 기초 트레이닝 - 1 day

Joonlaxy·2023년 11월 2일
0

나선형 배치 문제.

첫느낌!

첫번째 행이나 마지막 열은 한 눈에 들어오는데 꺾이는 부분을 어떻게 나선형으로 만들어야할까?

가설1.

0행은 0부터 +1씩 n정수 반복..
n-1행은 3n-2부터 -1씩 n정수 반복..
하지만 1행, 2행, 3행, ... n-2행의 규칙은 쉽게 보이지 않음

가설2.

방향성을 아래 규칙으로 정한다.

→ 방향 : s(straight)
↓ 방향 : d(down)
← 방향 : b(back)
↑ 방향 : u(up)

처음 s 방향으로 이동 후, n-1 번째 d 방향으로 이동하고.. 나선형 이동성을 적용시킨다. 결과 또한 이중 배열로 나와야함을 기억해야한다.

[[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], ...  [13, 12, 11, 10, 9]]
def solution(n):
    if n == 1:
        return [[1]]
    else:
        # n x n 배열 내부는 0으로 초기화
        answer = [[0 for j in range(n)] for i in range(n)]
        
        x = 0
        y = 0
        dir = "s"
        
        for i in range(n*n):
            answer[x][y] = i + 1
            if dir == "s":
                try:
                    y += 1
                    if y == n-1 or answer[x][y+1] != 0:
                        dir = "d"
                except:
                    dir = "d"
            elif dir == "d":
                try:
                    x += 1
                    if x == n-1 or answer[x+1][y] != 0:
                        dir = "b"
                except:
                    dir = "b"
            elif dir == "b":
                try:
                    y -= 1
                    if y == 0 or answer[x][y-1] != 0:
                        dir = "u"
                except:
                    dir = "u"
            elif dir == "u":
                try:
                    x -= 1
                    if x == 0 or answer[x-1][y] != 0:
                        dir = "s"
                except:
                    dir = "s"

    return answer

결과

후기

list out of index 에러가 계속 발생하여 try, except을 적용시켰다.
정답률 45%의 문제답게? 2시간정도 소요됐다..

주사위 게임 3

첫느낌

조건문 몇가지 만들면 금방 끝나겠는데? 나선형 배치에 비하면 선녀인걸?

가설1.

먼저 주사위 경우를 sorting하여 경우의 수를 줄인다.
이후 주어진 조건에 맞게 경우의 수를 조건문으로 푼다.

def solution(a, b, c, d):
    answer = 0
    list_dice = [a, b, c, d]
    list_dice.sort()
    
    # 모든 주사위 숫자가 같은 경우
    if list_dice[0] == list_dice[3]:
        answer = 1111 * list_dice[0]
    
    # 세 주사위 숫자가 같은 경우
    elif list_dice[1] == list_dice[2]:
        if list_dice[2] == list_dice[3]:
            answer = (10 * list_dice[1] + list_dice[0]) ** 2
        elif list_dice[0] == list_dice[2]:
            answer = (10 * list_dice[1] + list_dice[3]) ** 2
        # 실제 세 주사위가 같지 않고, 두 주사위의 숫자가 같은 경우
        else:
            answer = list_dice[0] * list_dice[3]
    
    # 주사위 두개씩 같은 경우
    elif list_dice[0] == list_dice[1]:
        # 나머지 두 주사위 숫자가 같은 경우
        if list_dice[2] == list_dice[3]:
            answer = (list_dice[0] + list_dice[2]) * (abs(list_dice[0] - list_dice[2]))
        # 나머지 두 수가 다른 첫번째 케이스
        else:
            answer = list_dice[2] * list_dice[3]
    #주사위 두개가 같은 경우
    elif list_dice[1] == list_dice[2]:
        # 나머지 두 수가 다른 두번째 케이스
        answer = list_dice[0] * list_dice[3]
    # 주사위 두개가 같고
    elif list_dice[2] == list_dice[3]:
        # 나머지 두 수가 다른 세번째 케이스
        answer = list_dice[0] * list_dice[1]
        
        
    else:
        answer = list_dice[0]

    return answer

결과

후기

세 주사위가 같은 경우를 두번째, 세번째가 같은 경우라고 가정했더니
반례가 2, 3, 3, 4 같은 경우가 있어 반례를 찾는데 시간이 꽤 소요 되었다.

profile
Come in here

0개의 댓글