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

Jeony·2021년 9월 18일
0

codeup 기초 100제

목록 보기
96/98
post-thumbnail

문제

리스트

부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가...

"십(+)자 뒤집기를 해볼까?"하고 생각했다.

십자 뒤집기는
그 위치에 있는 모든 가로줄 돌의 색을 반대(1->0, 0->1)로 바꾼 후,
다시 그 위치에 있는 모든 세로줄 돌의 색을 반대로 바꾸는 것이다.
어떤 위치를 골라 집자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다.

바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.

예시

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

    if d[int(x)][j]==0 :
      d[int(x)][j]=1
    else :
      d[int(x)][j]=0

참고

리스트가 들어있는 리스트를 만들면?
가로번호, 세로번호를 사용해 2차원 형태의 데이터처럼 쉽게 기록하고 사용할 수 있다.
리스트이름[번호][번호] 형식으로 저장되어있는 값을 읽고 쓸 수 있다.

입력 예시

0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
2
10 10
12 12

출력 예시

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

답안

모델 답안

d=[]
for i in range(20) :
    d.append([])
    for j in range(20) :
        d[i].append(0)

for i in range(19) :
    a = input().split()
    for j in range(19) :
        d[i+1][j+1] = int(a[j])

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

        if d[x][j]==0 :
            d[x][j]=1
        else : d[x][j]=0

for i in range(1, 20) :
    for j in range(1, 20) :
        print(d[i][j], end=' ')
    print()

내 답안

column = []
for i in range(19):
    column.append([])
    column_input = input().split()
    for j in range(19):
        column[i].append(int(column_input[j]))

n = int(input())
for i in range(n):
    x, y = input().split()
    x, y = int(x)-1, int(y)-1

    for j in range(19):
        if column[x][j] != 0:
            column[x][j] = 0
        else:
            column[x][j] = 1

        if column[j][y] != 0:
            column[j][y] = 0
        else:
            column[j][y] = 1

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

풀이

이번 문제는 정말 많이 헤매었어요.
저는 오히려 입력은 받는 부분이 많이 헤매게 되더라고요!
저는 풀기 전에 먼저 해야할 일을 단계별로 나눠서 적어봤어요.
1. 바둑판 입력받기.
2. 입력 받은 바둑판을 중첩 리스트로 저장하기
3. 입력 총 갯수 n과 좌표 x, y 입력받기.
4. 입력 받은 좌표에 해당하는 가로 세로 리스트 위치 알아내기.
5. 0이면 1로, 1이면 0으로 값 바꾸기.

🔍모델 답안 풀이

1. 바둑판을 만들 변수 d를 만들고 빈 리스트로 초기화를 해준다.
2. for문으로 변수 d 안에 바둑판 크기인 0부터 19까지의 빈 리스트를 추가한다.
d = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
3. 2번에서 만든 for문 안에 중첩 for문을 만들어서 2에서 만든 리스트 안에 0부터 19까지 반복하며 0으로 채운다.
d = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0 . . . . . .

d=[]
for i in range(20) :
    d.append([])
    for j in range(20) :
        d[i].append(0)
  1. 바둑판을 만들었으니 이제 입력받아서 넣어야겠죠?
    for문으로 0 ~ 19까지 돌려가면서 한줄 한줄씩 19 * 19 크기의 바둑판을 입력 받아요!
    중첩 for문으로는 받은 한줄 한줄의 바둑판을 처음에 만들었던 d 중첩 리스트 바둑판에 넣어줘요.
for i in range(19) :
    a = input().split()
    for j in range(19) :
        d[i+1][j+1] = int(a[j])
  1. 좌표 값의 총 갯수를 입력받을 n 선언.
  2. 좌표 값의 총 갯수인 n만큼 반복해서 x, y 좌표 값 입력 받고 문자형을 정수형으로 형변환!
  3. 이제 좌표 x, y값을 받았으니 0은 1로 1은 0으로 바꿔줘야 하겠죠?
    중첩 for문으로 바둑판 크기만큼인 19번 반복시키면서 중첩 리스트로 만들어진 바둑판 d의 값을 바꾸어줘요!

    d[0~19][0]

    0 0 0 0 1 0 1 0 0 0 0 ⬅ d[0][0~19]
    0 0 0 0 1 0 1 0 0 0 0 ⬅ d[1][0~19]
    1 1 1 1 1 1 1 1 1 1 1 ⬅ d[2][0~19]
    0 0 0 0 1 0 1 0 0 0 0
    1 1 1 1 1 1 1 1 1 1 1
n = int(input())
for i in range(n) :
    x,y=input().split()
    x=int(x)
    y=int(y)
    for j in range(1, 20) :
        if d[j][y]==0 :
            d[j][y]=1
        else :
            d[j][y]=0
        if d[x][j]==0 :
            d[x][j]=1
        else : d[x][j]=0
  1. 중첩 for문을 돌려서 출력한다. 그런데 print(column[i][j], end=" ")이렇게만 쓰면 우리가 원하는 사각형으로 나오지 않는다. end= "" 때문에 이어져서 그렇다.
    한 줄을 end로 이었으면 print()로 띄우는 것을 반복해주어야 한다.
for i in range(1, 20) :
    for j in range(1, 20) :
        print(d[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개의 댓글