[코드업] 100제 (Python)

jckim22·2022년 9월 30일
0

[ALGORITHM] STUDY (PS)

목록 보기
1/86
post-thumbnail

★Python CodeUp 100제

코드업 100제에서 생각이 더 필요했던 문제 5문제를 뽑아보았다.

코드에 대한 설명은 주석으로 달아놓았다.





★문제풀이

코드에 대한 설명은 주석으로 달아놓았다.

6092. 이상한 출석 번호 부르기1

이 문제는 카운트하는 모든 요소가 0인 배열의 인덱스로 또 다른 배열의 값을 넣는점에서 생각이 더 필요한 문제였다.

n= int(input()) #번호가 불리는 횟수를 입력받는다
a=list(map(int,input().split())) #무작위 번호들을 횟수만큼 입력 받는다

arr=[0 for _ in range(23)] #arr이라는 23크기의 리스트를 0으로 초기화한다

for x in range(n):#불리는 숫자에서 1을 뺀 값이 인덱스와 일치하므로 n만큼 반복하면서 불리는 값이 나올 때마다 그 인덱스 번호에 +1 카운트를 한다
    arr[a[x]-1]+=1


for x in range(23):#카운트된 배열을 출력
    print(arr[x],end=" ")

6095. 바둑판에 흰 돌 놓기

이 문제는 이차원 배열을 사용한다는 점에서 전에 문제들 보다는 좀 더 생각이 필요했다.

n = int(input()) #흰 돌의 개수 입력
a= [[0 for _ in range(19)]for _ in range(19)]# 19*19 2차원 배열의 모든 요소를 0으로 초기화 한다.(바둑판)

for i in range(n):#흰 돌의 개수만큼 반복하여 반복할 때마다 흰 돌의 좌표를 입력 받고 그 좌표의 값을 1로 바꾼다.
    x, y = map(int, input().split())
    a[x-1][y-1]=1

for x in range(19):#흰 돌이 박힌 바둑판을 출력
    for y in range(19):
        print(a[x][y], end=" ")
    print()

6096. 바둑알 십자 뒤집기

이 문제는 문제 자체 난이도는 높지 않을 수 있지만 전 문제인 바둑판 문제보다 훨씬 높은 난이도의 문제이다.

2차원 배열의 행과 열을 제대로 이해하고 보다 자유롭게 사용한다는 점에서 생각이 더 필요한 문제였다.

arr = [list(map(int, input().split())) for _ in range(19)] #바둑판을 입력받는다
n=int(input()) #십자 뒤집기에 횟수 입력

for k in range(n):#십자 뒤집기 횟수 만큼 전체 반복
    a,b=map(int,input().split()) #뒤집기 할 때 마다 좌표 입력
    for x in range(19): #가로 한 줄을 다 돌게 되면서 한 줄에 있는 돌들을 반전 시킨다
        if(arr[a-1][x]==1): #a는 사람 기준 좌표이기 때문에 -1을 해준다.
            arr[a-1][x]=0
        else:
            arr[a-1][x]=1
    for y in range(19): #마찬가지로 세로 한 줄을 돌면서 반전 시킨다
        if(arr[y][b-1]==1):
            arr[y][b-1]=0
        else:
            arr[y][b-1]=1        
        
for x in range(19): #십자 뒤집기가 끝난 바둑돌을 출력
    for y in range(19):
        print(arr[x][y],end=' ')
    print()

6097 설탕과자 뽑기

이 문제는 입력 정보가 꽤 많았고 전 문제처럼 2차원 배열의 행과 열에 대해서 잘 이해하고 자유롭게 사용할 수 있어야했기에 생각이 더 필요한 문제로 선정했다.

w,h=map(int,input().split()) #가로 세로를 입력
arr=[[0]*h for _ in range(w)]#게임판 2차원 배열을 0으로 초기화
n=int(input()) #막대의 개수 입력

for i in range(n): #막대의 개수만큼 반복
    l,d,x,y = map(int,input().split()) #막대의 정보를 입력 받는다 (길이,방향,좌표)
    if(d==0): #방향이 가로이면
        for z in range(l): #막대의 길이만큼
            arr[x-1][y-1+z]=1 #원래 좌표에서 오른쪽으로 1씩 이동하며 1로 초기화한다
    else: #방향이 세로이면 반대로
        for z in range(l):
            arr[x-1+z][y-1]=1

for i in range(w): #막대가 놓여진 게임판 출력
    for j in range(h):
        print(arr[i][j],end=' ')
    print()

6098 성실한 개미

이 문제는 다른 문제보다 경우의 수를 차근차근 생각하지 않으면 테스트 케이스에서 막히기 쉬운 문제이기 때문에 생각이 더 필요한 문제로 선정했다.

2차원 배열 미로에서 당장에 예시 입력값만을 생각하고 알고리즘을 짜게 되면 다른 케이스에서 막힐 것이다.

arr=[list(map(int,input().split())) for _ in range(10)] #10*10 2차원 미로 입력

x=1 #현재 개미의 인덱스(좌표-1)
y=1 
while(arr[x][y]!=2): #최종적으로는 개미가 먹이를 만나면 반복문을 나오게 된다
    if(arr[x][y+1]!=1): #개미의 오른쪽이 1이 아니라면 오른쪽으로 이동한다
        arr[x][y] = 9
        y+=1
        
    else: #만약 오른쪽이 1이라면 2가지 경우의수가 존재한다
        if(arr[x+1][y]!=1): #밑이 1이 아닌 경우
            arr[x][y] = 9
            x+=1
        else: #갈 곳이 없는 경우
            break
    
        

arr[x][y]=9 #마지막으로 미로를 탈출한 지점까지 9로 초기화한다.

for i in range(10): #개미의 흔적을 출력
    for j in range(10):
        print(arr[i][j],end=' ')
    print()

profile
개발/보안

0개의 댓글