3 minute read


1. 코드업 100제 문제 풀기

  Python 기초 문제들로 구성되어서 무난하게 총 2시간 정도 시간을 투자하여 무난히 다 풀 수 있었다. 아래에는 100제 문제들 중 정답률이 낮은 2개를 정리하였다.

2. 코드업 100제 문제 2개

6096 : [기초-리스트] 바둑알 십자 뒤집기

문제 링크

https://codeup.kr/problem.php?id=6096

문제 설명

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

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

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

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

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

입력

바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다. 십자 뒤집기 횟수(n)가 입력된다. 십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다.

출력

십자 뒤집기 결과를 출력한다.

arr = []

for i in range(19) :
    arr.append(list(map(int, input().split())))
n = int(input())

for i in range(n) :
    x, y = map(int, input().split())
    
    # 입력받은 x, y 좌표의 가로줄, 세로줄을 반복문을 통해서 1을 더하고 2로 나눔 (반전 효과)
    for j in range(19) :
        arr[j][y-1] = (arr[j][y-1] + 1) % 2
        arr[x-1][j] = (arr[x-1][j] + 1) % 2
    
for i in range(19) :
    for j in range(19) :
        print(arr[i][j], end = ' ')
    print('')

6098 : [기초-리스트] 성실한 개미

문제 링크

https://codeup.kr/problem.php?id=6098

문제 설명

본 문제는 python 의 빠른 기초 학습을 위해 설계된 문제로서 python 코드 제출을 기준으로 설명되어 있습니다.

영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.

왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데, 그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.

개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다. (오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)

이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.

미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지 오른쪽 또는 아래쪽으로만 움직였다.

미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고, 먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.

단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는 더이상 이동하지 않고 그 곳에 머무른다고 가정한다.

미로 상자의 테두리는 모두 벽으로 되어 있으며, 개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.

입력

10*10 크기의 미로 상자의 구조와 먹이의 위치가 입력된다.

출력

성실한 개미가 이동한 경로를 9로 표시해 출력한다.

x, y = 1, 1
arr = [[0 for i in range(10)] for j in range(10)]

for i in range(10) : arr[i] = list(map(int, input().split()))

while True : 
    # 만약 현재 위치가 2(먹이)이면 9(이동경로)로 값을 바꾸고 반복문 나가기
    if arr[x][y] == 2 : 
        arr[x][y] = 9
        break
    # 아니면 그냥 9(이동경로)로 값을 바꾸기
    else : 
        arr[x][y] = 9
    
    # 현재 위차가 (9,9)이면 더이상 갈 곳이 없으므로 나가기
    if x == 9 and y == 9 : break
    
    # 현재 위치가 (?, 9)이면 우측으로는 못가므로 아래쪽으로 갈수 있으면 가고 아니면 나가기
    elif y == 9 :
        if arr[x+1][y] == 1 : break
        else :
            x += 1
            continue

    # 현재 위치가 (9, ?)이면 아래로는 못가므로 오른쪽으로 갈수 있으면 가고 아니면 나가기 
    elif x == 9 :
        if arr[x][y+1] == 1 : break
        else : 
            y += 1
            continue
    
    # 평상시에는 우측, 아래 순서로 이동하기 
    else :
        if arr[x][y+1] != 1 :
            y += 1
            continue
        elif arr[x+1][y] != 1 :
            x += 1
            continue
        else : 
            break            
    
for i in range(10) :
    print(*arr[i])



3. 문제들을 풀어본 후기

  1. 코드업 기초 100제 문제는 교육 목적의 문제들로서 파이썬에 대한 개념이 확립안되어있는 상태에서도 풀기 좋다.
  2. 이제까지 공부한 것들을 정리할 수 있어서 좋았다.
  3. 빠른 시간에 많은 문제들을 풀어보니 성취감 또한 충전되었다!

Comments