본문 바로가기
Problem Solving/SWEA

[ SWEA ] D2 - 1954, 1948, 1946, 1945 - python 문제풀이

by IM조이 2021. 6. 27.

1954 달팽이 숫자

나름 반복되는 규칙을 찾아서 구현하면 됨

 

달팽이처럼 돌기 위해서는 오른쪽, 아래, 왼쪽, 위쪽 방향을 반복적으로 돌아가면서 이동해 들어가고, 그 빈도는 위 그림에서 볼 수 있듯이 각 n번에서 1번 순서대로, 처음을 제외하면 각각 2번씩 반복적이라는 규칙을 찾을 수 있다.

for tc in range(int(input())):
    N = int(input())
    snail = [[0]*N for _ in range(N)]
    number = 1
    jump_cnt = N
    direction = 'right' # 'right','down','left','up'순으로 바뀔 것
    row_idx,col_idx = 0,0
    while number <= N**2:
        # 제일 처음: 1~N까지 채우기
        if number == 1:
            for i in range(N):
                snail[row_idx][col_idx] = number
                col_idx += 1
                number += 1
            direction = 'down'
            jump_cnt -= 1

        # 2번씩
        else:
            for _ in range(2):
                if direction == 'down':
                    col_idx -= 1
                    row_idx += 1
                    for i in range(jump_cnt):
                        snail[row_idx][col_idx] = number
                        number += 1
                        row_idx += 1
                    direction = 'left'
                elif direction == 'left':
                    col_idx -= 1
                    row_idx -= 1
                    for i in range(jump_cnt):
                        snail[row_idx][col_idx] = number
                        number += 1
                        col_idx -= 1
                    direction = 'up'
                elif direction == 'up':
                    col_idx += 1
                    row_idx -= 1
                    for i in range(jump_cnt):
                        snail[row_idx][col_idx] = number
                        number += 1
                        row_idx -= 1
                    direction = 'right'
                else:
                    col_idx += 1
                    row_idx += 1
                    for i in range(jump_cnt):
                        snail[row_idx][col_idx] = number
                        number += 1
                        col_idx += 1
                    direction = 'down'

            jump_cnt -= 1

    print("#{}".format(tc+1))
    for row in snail:
        print(" ".join(map(str, row)))

 

1948 날짜 계산기

cal = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}
for tc in range(int(input())):
    m1,d1,m2,d2 = map(int, input().split())
    print("#{}".format(tc+1), end=" ")
    if m1 == m2:
        # 어차피 문제 조건에 첫번째 날보다 두번째 날이 항상 크다고 했으니, d1d2가 같을때는 고려하지 않아도 된
        print(d2-d1+1)
    else:
        result = d2
        for i in range(m1+1,m2):
            result += cal[i]
        print(result + cal[m1]-d1+1)

딕셔너리의 키,값 관계를 이용해 키에는 월(month), 값에는 날짜(days)를 담고 접근하는 방식.
당연히 리스트의 인덱스와 값 관계를 활용해서 풀 수도 있다.

for tc in range(int(input())):
    m1,d1,m2,d2=map(int, input().split())
    d = [0,31,28,31,30,31,30,31,31,30,31,30,31]
    if m1 == m2:
        print("#{} {}".format(tc+1, d2-d1+1))
    else:
        result = d[m1]-d1+1+d2
        while (m1+1) != m2:
            m1 += 1
            result+= d[m1]
        print("#{} {}".format(tc+1, result))

두 방법의 속도 차이를 보면,
딕셔너리로 풀었을때가 좀 더 빠르고 메모리도 덜 쓰는 것 같다

(왼) 딕셔너리  (오) 리스트

 

1946 간단한 압축 풀기

for tc in range(int(input())):
    N = int(input())
    result = ''
    for i in range(N):
        alphabet, cnt = input().split()
        result += alphabet*(int(cnt))
    print("#{}".format(tc+1))
    if len(result) <= 10:
        print(result, end="")
    else:
        for j in range(len(result)//10+1):
            print(result[10*j:10*j+10])

 

1945 간단한 소인수분해

numbers = [2,3,5,7,11]
for tc in range(int(input())):
    N = int(input())
    cnt = [0]*5
    for i in range(5):
        while True:
            if N%numbers[i]== 0:
                cnt[i] += 1
                N //= numbers[i]
            else:
                break
    print("#{} {}".format(tc+1, " ".join(map(str, cnt))))

 

댓글