[CodeUp 기초 100제] 6097번 풀이 with 파이썬(python)

Jeony·2021년 9월 18일
0

codeup 기초 100제

목록 보기
97/98
post-thumbnail

문제

리스트

부모님과 함께 놀러간 영일이는
설탕과자(설탕을 녹여 물고기 등의 모양을 만든 것) 뽑기를 보게 되었다.

길이가 다른 몇 개의 막대를 바둑판과 같은 격자판에 놓는데,

막대에 있는 설탕과자 이름 아래에 있는 번호를 뽑으면 설탕과자를 가져가는 게임이었다.
(잉어, 붕어, 용 등 여러 가지가 적혀있다.)

격자판의 세로(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 1 0 0 0
0 0 1 0 1
0 0 1 0 1
0 0 1 0 1
0 0 0 0 1

답안

모델 답안

h,w = input().split()
h = int(h)
w = int(w)

m = []
for i in range(h+1) :
    m.append([])
    for j in range(w+1) :
        m[i].append(0)

n = int(input())
for i in range(n) :
    l,d,x,y = input().split()
    if int(d)==0 :
        for j in range(int(l)):
            m[int(x)][int(y)+j] = 1
    else :
        for j in range(int(l)) :
            m[int(x)+j][int(y)] = 1

for i in range(1, h+1) :
    for j in range(1, w+1) :
        print(m[i][j], end=' ')
    print()

내 답안

h, w = input().split()
h, w = int(h), int(w)
n = int(input())

column = []
for i in range(h):
    column.append([])
    for j in range(w):
        column[i].append(0)


for i in range(n):
    l, d, x, y = input().split()
    l, d, x, y = int(l), int(d), int(x)-1, int(y)-1
    
    for j in range(l):
        if d != 0:
            column[x][y] = 1
            x += 1
        else:
            column[x][y] = 1
            y += 1

for i in range(h):
    for j in range(w):
        print(column[i][j], end=" ")
    print()

풀이

이번 문제 많이 어려웠어요.
자 바로 풀이 갑니다!

🔍모델 답안 풀이

1. 입력 형식대로 입력 변수를 선언해줍니다.

h,w = input().split()
h = int(h)
w = int(w)
  1. 자 이제 저번부터 해왔던 바둑판을 만듭니다. 바둑판의 크기를 입력 받았으므로 그걸 반복으로 활용해서 만들어요!
    m = []
    for i in range(h+1) :
    m.append([])
    for j in range(w+1) :
    m[i].append(0)
  2. l,d,x,y를 몇 회 입력할 것인지 입력하는 n을 선언 해줍니다.
    for문을 사용해서 l,d,x,y를 n회 입력받도록 해줍니다.
  3. 이제 이 문제의 핵심이예요.
    x, y의 좌표에서부터 d가 0이면 가로로, 1이면 세로로 l(엘) 크기만큼 +1해주는 작업을 해야합니다.
    1) 먼저 if문을 써서 d가 0이냐 1이냐를 구분해줍니다.
    2) 각각의 if문 조건 안에 for문을 쓰고 반복 횟수는 l(엘)만큼 바둑판 m에 좌표 x, y를 넣고 d가 0이면 가로니까 y에 +1(j)를 해주고 그 자리를 1로 만들어 줍니다.

    m[0~4][0]

    1 1 0 0 0⬅ m[0][0~4] 가로는 이거처럼 2번째 리스트가 늘어나야함
    0 0 1 0 1⬅ m[1][0~4]
    0 0 1 0 1
    0 0 1 0 1
    0 0 0 0 1
n = int(input())
for i in range(n) :
    l,d,x,y = input().split()
    if int(d)==0 :
        for j in range(int(l)):
            m[int(x)][int(y)+j] = 1
    else :
        for j in range(int(l)) :
            m[int(x)+j][int(y)] = 1
  1. 중첩 for문을 돌려서 출력한다. 그런데 print(column[i][j], end=" ")이렇게만 쓰면 우리가 원하는 사각형으로 나오지 않는다. end= "" 때문에 이어져서 그렇다.
    한 줄을 end로 이었으면 print()로 띄우는 것을 반복해주어야 한다.
for i in range(1, h+1) :
    for j in range(1, w+1) :
        print(m[i][j], end=' ')
    print()

👻 끝! 👽

input(): 프롬프트를 띄워서 사용자의 입력 받을 수 있게 해준다.
(단, 입력 받은 것은 문자열로 저장된다. print(type()))으로 type() 괄호 안에 변수를 넣고 찍으면 정수인지, 문자열인지, 무슨 타입인지 확일 할 수 있다!)

int(n): 위의 input()에서 말했듯이 input으로 받은 값은 문자열로 저장된다.
산술을 하기 위해, 문자열을 정수로 변환시켜주는 int()를 써서 변환시켜준다.

[ ] list: 변수 안에 여러가지의 값을 넣을 수 있다.
선언 예시)
a = []
b = ["a", "b", "c"]

출력 예시)
print(a[]) -> 빈공간
print(b[0]) -> a
print(b[1]) -> b
print(b) -> ["a", "b", "c"]

for문: 반복을 데이터가 남을 때까지 밑에 내용 계속 반복 실행!
for i in 데이터:
(들여쓰기칸) 실행문

ex)

for i in [1, 2 ,3]:
    print(i)
출력: 1
     2
     3

데이터에는 iterable이 들어갈 수 있다.

range(): 괄호 안에 들어가는 숫자만큼의 수열을 표현해준다.
range(3) -> 0, 1, 2 (0부터 3직전까지 표현)
range(1, 3) -> 1, 2 (1부터 시작해서 3직전까지 표현)
range(1, 3, +2) -> 1 (1부터 시작해서 2씩 늘려가서 3직전까지 표현. (1 + 2는 3이므로 3직전까지 표현))

print(): 괄호 안의 내용을 출력!

profile
알고리즘으로 문제를 해결하자 (ʘ言ʘ╬)

0개의 댓글