[codeup] 6097 : [기초-리스트] 설탕과자 뽑기(py)

SUNGJIN KIM·2022년 3월 5일
0

CODEUP

목록 보기
16/76
post-thumbnail

문제

https://codeup.kr/problem.php?id=6097&rid=0

격자판의 세로(h), 가로(w), 막대의 개수(n), 각 막대의 길이(l),
막대를 놓는 방향(d:가로는 0, 세로는 1)과
막대를 놓는 막대의 가장 왼쪽 또는 위쪽의 위치(x, y)가 주어질 때,

격자판을 채운 막대의 모양을 출력하는 프로그램을 만들어보자.

입력

첫 줄에 격자판의 세로(h), 가로(w) 가 공백을 두고 입력되고,
두 번째 줄에 놓을 수 있는 막대의 개수(n)
세 번째 줄부터 각 막대의 길이(l), 방향(d), 좌표(x, y)가 입력된다.
1 <= w, h <= 100
1 <= n <= 10
d = 0 or 1
1 <= x <= 100-h
1 <= y <= 100-w

입력 예시

5 5
3
2 0 1 1
3 1 2 3
4 1 2 5

출력

모든 막대를 놓은 격자판의 상태를 출력한다.
막대에 의해 가려진 경우 1, 아닌 경우 0으로 출력한다.
단, 각 숫자는 공백으로 구분하여 출력한다.

출력 예시

1 1 0 0 0
0 0 1 0 1
0 0 1 0 1
0 0 1 0 1
0 0 0 0 1

문제풀이

항상 느끼는 것이지만, 배열은 0,0 부터 시작하는데 문제가 1,1 로 되어있으면 엄청난 혼란이 온다.
문제를 접근했던 방식은 아래와 같다.

배열의 값이 "0"인 2차원 배열을 생성해주고, 거기에 막대를 놓는 함수를 추가하여 막대가 놓인 곳은 값을 "1"로 변경해주자.

  1. 배열을 생성하는 함수
# 0으로 채워진 격자 만들기 (empty)
def made_graph(h,w):
    arg_graph = []
    for i in range(h):
        arg_graph.append([0]*w)
    return arg_graph
  1. 막대 놓아주는 함수 (1로 값을 변경해주는 함수)
  • else 문은 없어도되나, 혹시 몰라서 넣어두었다.
def put_the_stick(arg, sticks):
    sticks = list(map(int, sticks))
    x ,y = sticks[2]-1, sticks[3]-1
    n = sticks[0]
    for i in range(0,n):
        if sticks[1] == 0:
            arg[x][y+i] = 1
        elif sticks[1] == 1:
            arg[x+i][y] = 1
        else :
            print("Error")
    return arg

전체 작성 코드

# 격자판의 세로 : h , 격자판의 가로 : w , 막대의 개수 : n, 각 막대의 길이 : l, 막대를 놓는 방향 (d, 가로 0 세로 1)
# 막대를 놓는 가장 왼쪽, 위쪽의 위치 (x,y)
h,w = map(int,input().split(" "))
n = int(input())

#막대 크기/위치 정보 배열
sticks = []

for i in range(n):
    l,d,x,y = input().split(" ")
    sticks.append([l,d,x,y])

# 0으로 채워진 격자 만들기 (empty)
def made_graph(h,w):
    arg_graph = []
    for i in range(h):
        arg_graph.append([0]*w)
    return arg_graph

# 막대 놓기
def put_the_stick(arg, sticks):
    sticks = list(map(int, sticks))
    x ,y = sticks[2]-1, sticks[3]-1
    n = sticks[0]
    for i in range(0,n):
        if sticks[1] == 0:
            arg[x][y+i] = 1
        elif sticks[1] == 1:
            arg[x+i][y] = 1
        else :
            print("Error")
    return arg

arg = made_graph(h,w)
for i in range(0,n):
    result_arg = put_the_stick(arg, sticks[i])

for i in range(len(result_arg)):            # 세로 크기
    for j in range(len(result_arg[i])):     # 가로 크기
        print(result_arg[i][j], end=' ')
    print()

해당 코드를 작성하는데 있어 처음 격자를 생성하거나 그런 부분에 대해서는 어려움이 없었다.
이전에 이미지를 다루는 모듈이라고 코드잇에서 했던 강의가있는데 거기에서 빈값의 2차원 배열 만드는 것이 생각나서
그렇게 진행하였다.
(https://velog.io/@woonmong/codeit-python-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC-%EB%8B%A4%EB%A3%A8%EB%8A%94-%EB%AA%A8%EB%93%88-%EB%A7%8C%EB%93%A4%EA%B8%B0)

헷갈렸던 것은 처음에는 위치를 직접 찍어보지않고 머릿속에서 고민해서 결과를 도출해내려고 했는데,
일부러 배열의 첫 시작을 1,1로 맞춰서 진행을 해보려고 했는데 어떤 곳은 1로, 어떤 곳은 0으로 해놔서
그게 너무 헷갈려서 그냥 전부다 0으로 통일하고 필요값에 따라서 넣어주었다.
(index값을 출력할 일이 없으니까 그냥 이해하기 쉬운대로 통일해서 진행하였다.)

그렇게 하니까 머리 싸맨 시간보다 풀리는 시간이 훨씬 빠르더라.
이직 후 공부를 잠시 안했다가 다시 잡으니까 그새 또 까먹은 것 같다.
하루에 한 문제씩 꼭 풀어야지.

profile
#QA #woonmong

0개의 댓글