ABOUT ME

Today
Yesterday
Total
  • section3.8 곳감(모래시계)
    알고리즘 2022. 10. 30. 22:50

    현수는 곳감을 만들기 위해 감을 깎아 마당에 말리고 있습니다. 현수의 마당은 N*N 격자판으로 이루어져 있으며, 현수는 각 격자단위로 말리는 감의 수를 정합니다. 그런데 해의 위치에 따라 특정 위치의 감은 잘 마르지 않습니다. 그래서 현수는 격자의 행을 기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 합니다. 만약 회전 명령 정보가 2 0 3이면 2번째 행을 왼쪽으로 3만큼 아래 그림처럼 회전시키는 명령입니다.

    1행 10 13 10 12 15       ->        10 13 10 12 15

    2행 12 39 30 23 11        ->        23 11 12 39 30

    3행 11 25 50 53 15        ->        11 25 50 53 15

    4행 19 27 29 37 27        ->       19 27 29 37 27

    5행 19 13 30 13 19        ->       19 13 30 13 19

    첫 번째 수는 행 번호, 두 번째 수는 방향인데 0이면 왼쪽, 1이면 오른쪽이고, 세 번째 수는 회 전하는 격자의 수입니다. M개의 회전 명령을 실행하고 난 후 아래와 같이 마당의 모래시계 모양의 영역에는 감 이 총 몇 개가 있는지 출력하는 프로그램을 작성하세요.

    10 13 10 12 15

    23 11 12 39 30

    11 25 50 53 15

    19 27 29 37 27

    19 13 30 13 19

     

     

    import sys
    sys.stdin = open("input.txt", "rt")
    n = int(input())
    list1 = [list(map(int, input().split())) for _ in range(n)]
    m = int(input())
    list2 = [list(map(int, input().split())) for _ in range(m)]
    
    for i in range(m):    
        rownum = list2[i][0]
        direcnum = list2[i][1]
        circlenum = list2[i][2]
        if direcnum == 0:
            # 왼쪽 회전
            for j in range(circlenum):
                list1[rownum-1].insert(n, list1[rownum-1][0])
                list1[rownum-1].pop(0)
        else:
            # 오른쪽 회전
            for j in range(circlenum):
                list1[rownum-1].insert(0, list1[rownum-1][n-1])
                list1[rownum-1].pop()
    
    sumlist = 0
    
    for i in range(n//2+1):
        if i == n//2:
            sumlist += list1[i][n//2]
        else:
            sumlist += sum(list1[i][0+i:n-i])
            sumlist += sum(list1[n-1-i][0+i:n-i])
    
    print(sumlist)

     

     

    정답

     

     

    import sys
    sys.stdin = open("input.txt", "rt")
    n = int(input())
    a = [list(map(int, input().split())) for _ in range(n)]
    m = int(input())
    
    for i in range(m):
        h, t, k = map(int, input().split())
        if t == 0:
            for _ in range(k):
                a[h-1].append(a[h-1].pop(0))
        else:
            for _ in range(k):
                a[h-1].insert(0, a[h-1].pop())
    
    res = 0
    s = 0
    e = n-1
    for i in range(n):
        for j in range(s, e+1):
            res += a[i][j]
        if i < n//2:
            s += 1
            e -= 1
        else:
            s -= 1
            e += 1
    
    print(res)

     

     

    pop 하자마자 append가 가능한지 몰랐다

    당연히 pop을 했으면 값이 없어진다고 생각했는데 아니었다

    정확히 pop은 지정한 위치에 값을 취득한 후 삭제하기 때문에 바로 append가 가능하다

     

     

    for i in range(m):    
        rownum = list2[i][0]
        direcnum = list2[i][1]
        circlenum = list2[i][2]
        
    for i in range(m):
        h, t, k = map(int, input().split())

     

     

    인덱스로 받을 필요 없이, 변수명만 지정해주면 된다

    훨씬 편한 파이썬을 내가 잘 활용하지 못하는 느낌이다

     

     

     

    EOFError: EOF when reading a line
    EOF (End Of File)로 input을 사용한 입력 시 더이상 입력할 파일이 없다는 뜻
    list2에 값을 넣을 때 m인데 n으로 지정해서 오류가 발생했다
     

    remove, append, insert, pop 다시 정리하기
    - remove() : 인덱스가 아닌 값을 넣어야하고 앞에서부터 값을 찾았다면 삭제
    - pop()       : 값을 지정한 후 삭제하는데 인덱스가 지정되지 않았다면 맨 뒤에 값을 삭제
    - append() : 값을 리스트의 맨 끝에 추가
    - insert()    : insert(인덱스, 값)의 형태로 원하는 인덱스에 값을 추가할 수 있다
                       이번 코드를 작성하면서 append(리스트[인덱스])값을 하니까 오류가 발생했고  insert로 바꿨더니 해결되었다

     

    728x90

    '알고리즘' 카테고리의 다른 글

    section3.10 스토쿠 검사  (0) 2022.10.31
    section3.9 봉우리  (1) 2022.10.30
    section3.7 사과나무(다이아몬드)  (0) 2022.10.27
    section3.6 수들의 합  (0) 2022.10.27
    section3.5 수들의 합  (0) 2022.10.26
Designed by Tistory.