[codeup]6096 : 바둑알 십자 뒤집기(py)

Tieck

·

2021. 9. 2. 00:59

문제 :

가로 19칸, 세로 19칸인 바둑판 위에 놓여있는 바둑돌의 현황을 입력받는다.

흰색 돌과 검은색 돌은 0과 1로 서로 다르게 표현한다.

바둑돌이 놓인 임의의 위치(x,y)를 입력받는다.

입력받은 모든 가로줄x 돌의 색을 반대로 바꾼다.

그 후 입력받은 모든 세로줄y 돌의 색을 반대로 바꾼다.

 

n개의 좌표를 입력받아 뒤집기한 결과를 출력하라.

단, n은 10이하의 자연수이다.

 

 

예시: 

#임의의 좌표를 n번 입력받아 순서대로 x좌표, y좌표에 할당
for i in range(n) :
  x,y=input().split()
  
  
  #세로줄 색 변경
  #중첩리스트(2차원)에서 y번째 리스트의 값을 순서대로 접근 후 변경
  
  for j in range(1, 20) :
    if d[j][int(y)]==0 :
      d[j][int(y)]=1
    else :
      d[j][int(y)]=0
  
  
  
  #가로줄 색 변경
  #중첩리스트(2차원)에서 모든 리스트의 x번째 인덱스에 접근해 값을 변경
    if d[int(x)][j]==0 :
      d[int(x)][j]=1
    else :
      d[int(x)][j]=0

 

예시 코드는 임의의 좌표 (x,y)를 n번 입력받고, 색을 반대로 바꾸는 코드다.

 

 

직접 작성한 코드:

#list comprehension
d = [list(map(int,input().split())) for _ in range(19)]

        
n = int(input())


for i in range(n) :

    # map(function,iterable)
    x,y=map(int,input().split())
    
    #19*19판을 직관적으로 구현하기 위해 range(19)사용
	for j in range(19):
        if  d[x-1][j] == 0:
            d[x-1][j] = 1
        else:
            d[x-1][j] = 0


    for j in range(19):
        if  d[j][y-1] == 0:
            d[j][y-1] = 1
        else:
            d[j][y-1] = 0
    

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

 

List comprehension

[대괄호]를 이용해 리스트를 초기화 하는 방식
반복문과 조건문을 사용
2차원 리스트를 초기화할 때 유용

 

#list comprehension
#d = [list(map(int,input().split())) for _ in range(19)]


#nomal
d= []
for _ in range(19):
    d.append(list(map(int,input().split())))

list comprehension을 사용해 초기화한 코드가 더 간결하다.

 

반복문에서의 언더바(_)

반복문의 코드는 반복하지만, 반복 횟수를 참조하지 않을 때 언더바(_)를 사용

 

 

map( function, iterable )

첫 번째 매개변수 : 함수

두 번째 매개변수 : 반복가능한iterable 자료형    list, tuple 등

 

 


 

잘못된 습관 :

  1. 코드 작성 후 검토 없이 바로 제출(실행)하기
  2. 주어진 문제의 입력 형태를 정확하게 파악하지 않고 코드 작성

 

 

 

잘못된 습관 : 코드 작성 후 검토 없이 바로 제출(실행)하기

컴파일러가 아닌 codeup 텍스트 에디터에서 코드 작성(변경) 후 바로 제출하기

실행 여부를 확인하지 않고, 디버깅도 하지 않은 채 바로 제출해서 다수의 오답을 받음.

 

피드백:

컴파일러에서 코드 작성하자.

그리고, 입력 예시를 사용하여 디버깅하자.

 

 

 

 

codeup 6096, 채점 상황

 

 

잘못된 습관: 주어진 문제의 입력 형태를 정확하게 파악하지 않고 코드 작성

입력의 개수 n을 먼저 입력받도록 코드를 작성했기 때문에 에러 발생.

순서만 바꾸면 되는 간단한 에러였지만 해결하기까지 1시간이 소요됨.

 

피드백:

손으로 바로 코딩을 시작하기에 앞서, 머리로 맥락을 파악하고 구조를 그리자.

 

 

 

 

 


 

들여쓰기 논쟁 : tab vs space bar

tab

1번 입력

띄어쓰기 편집(제거)시 편리함

 

space bar

4번 입력

표준

에디터와 상관 없이 동일한 형태 유지

 

 

 

 


공백문자(space bar) 4번을 사용하는 것이 표준이다.

하지만 입력횟수의 차이 때문에 탭(tab)을 사용한다.

이런 논쟁을 접하고, 처음 배울 때부터 tab을 사용한 내 코드 스타일을 되돌아봤다.

 

tab 방식에서 space bar 방식으로 전환하기로 했다.

 

유휴상태idle인 엄지손가락의 활용도util를 높이고

새끼손가락의 활용도util를 낮출 수 있기 때문이다.

 

 

tab키 방식의 타이핑 횟수가 작다는 부분이 매력적인 장점이지만,

새끼손가락은 ctrl, alt, left shift, win 만으로 활용도가 높아 쉽게 피로해진다.

 

또한 기초 단계 학습에서 표준을 따르는 것이 더 좋은 학습법이라고 생각한다.

그래서 space bar를 사용하는 방식을 따라야겠다.


 

 

참고

들여쓰기 100년 전쟁, Tab vs Space, 2글자 vs 4글자 (yona.io)