본문 바로가기
Algorithm/Codeup

[코드업] Python 기초 100제 6098, 6097, 6096, 6093, 6092

by 수짱수짱 2022. 8. 9.

작성날짜: 2021/08/17

작성언어: Python


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

문제설명

 

입력/출력

pan=[]

for i in range(11):
    pan.append([])
    for j in range(11):
        pan[i].append(0)

        # 0인덱스 뺴고 10*10 크기의 미로 상자

for i in range(10):
    route=list(map(int,input().split()))
    for j in range(10):
        pan[i+1][j+1]=route[j]

# 개미는(2,2)부터 출발
x=2 # 세로
y=2 # 가로
while True: # 개미는 오른쪽이 벽이 아니라면 계속 오른쪽으로 간다.
    pan[x][y]=9

    if pan[x][y+1]==2: # 오른쪽에서 먹이찾은경우
        pan[x][y+1]=9
        break
    elif pan[x][y+1]==1 and pan[x+1][y]==1: # 움직일 수 없는 경우
        break
    elif x==10 and y==10: # 맨 아래의 가장 오른쪽에 도착한 경우
        pan[x][y]=0
        break

    if pan[x][y+1]==0: # 오른쪽이 벽이 아니라면
        y+=1
        #pan[x][y]=9 # 주석처리해도 반복문의 첫 문장에서 x, y좌표에 9대입해줘서 없어도 되는 문장!💛
    else: # 오른쪽이 벽이라면
        x+=1
        if pan[x][y]==2: # 여기 주의!! 오른쪽 벽이고 아래 쪽에 먹이 찾은 경우
            pan[x][y]=9  # 오른쪽이 벽인데 아래가 2 (간식이 있다면)
            break        # 아래로 갔다가(9대입) 반복문 탈출
        #pan[x][y]=9 # 주석처리해도 반복문의 첫 문장에서 x, y좌표에 9대입해줘서 없어도 되는 문장!💛




# 출력
#print()

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

수짱.py

 

m=[]
for i in range(12) :
  m.append([])
  for j in range(12) :
    m[i].append(0)

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

x = 2
y = 2
while True :
  if m[x][y] == 0 :
    m[x][y] = 9
  elif m[x][y] == 2 :
    m[x][y] = 9
    break

  if (m[x][y+1]==1 and m[x+1][y]==1) or (x==9 and y==9) :
    break

  if m[x][y+1] != 1 :
    y += 1
  elif m[x+1][y] != 1 :
    x += 1
    

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

모범답안.py

 

 

#

굳이 pan[x][y]=9로 대입해줄 필요가 없음 (오히려 2번 대입하게 되어서 비효율적 어차피 반복문 첫 문장에서 대입해준다.) 그냥 x와 y 좌표를 증가시키면서 (그냥 증가시키는게 아니라 오른쪽이 벽이 아니라면 오른쪽으로 이동, 오른쪽이 벽이라면 밑으로 이동 ) 이동한 위치가 0이라면 9로 바꿔주고 간식이라면(2라면) 반복문을 탈출하면 된다.

 

내 코드가 경우의수를 나타내기엔 좀 더 비효율적이다. break걸리는거를 전부 or 연산자로 묶어줘도 될 것 같다. 

#


6097 : [기초-리스트] 설탕과자 뽑기(py)

문제설명

 

입력/출력

pan=[]

h, w= map(int, input().split()) # 격자판의 세로,가로

if (h>101 or h<1) and (w>101 or w<1):
    print("1<=w, h<=100")
    exit()
else:
    for i in range(h+1): # 가로축은w ,세로축은 h
        pan.append([])
        for j in range(w+1):
            pan[i].append(0)  # 2차원리스트

            # 0 좌표는 사용 안할거임

n=int(input()) # 놓을 수 있는 막대의 개수 

if n<1 or n>10:
    print("1<= n <= 10")
    exit()




for i in range(n):
    l, d, x, y=map(int, input().split()) # l : 길이, d:방향, (x,y):좌표

    if not d in [0,1]:
        print("d=1 or d=0")
        exit()
    """
    if x<1 or x>100-h:
         print("1<= x <= 100-h")
         exit()

    if y<1 or y>100-w:
        print("1<= y <= 100-w") 
        exit()  
    """

    if d==0: # 가로, 가로를 증가시키려면 w 를증가 즉 y
        for i in range(l):
            pan[x][y]=1
            y+=1
            #x+=1

    else:  # 세로, 세로를 증가시키려면 h를 증가 즉 x
        for i in range(l):
            pan[x][y]=1
            x+=1
            #y+=1


# 출력
for i in range(1,h+1): # h가 x축
    for j in range(1,w+1): # w가 y축
        print(pan[i][j],end=' ')
    print()

수짱.py

 

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()

모범답안.py

 

 

#

h,w 만큼 2차원 배열 생성 (파이썬은 [][] 없어서 []만들고 이 안에 0으로 채워줘야함) 한다.

막대의 개수 n을 입력받고 n 만큼 입력을 받는다.

 

모범답안이랑 다른점은 변수 범위(예외처리)인데 이상하게 저기 긴글 주석처리된 부분은 넣으면 테스트 결과에서 탈락된다. 이유는 모르겠다... 

길이만큼 판에 그리는 것은 y+=1, x+=1 방식도 좋지만 for 변수를 사용해서 (+j , +i) 하는 것도 배워간다. 

#

 


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

문제설명

입력/출력

 

pan=[]
list1=[]

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

for i in range(1,20):

    list1=list(map(int,input().split()))

    for j in range(len(list1)):
        pan[i][j+1]=list1[j] # pan 인덱스는 1부터 시작하니까 +1



n=int(input()) 

if n<0 or n>10:
    print("1<= n <= 10")
    exit()

for i in range(n):
    x, y=map(int, input().split())  # (x,y) 해당 좌표는 제외.
    for j in range(1,20):
        if pan[x][j]==1: # 가로
            #if j==y:
           #     continue
            pan[x][j]=0
        elif pan[x][j]==0:
            #if j==y:
            #    continue
            pan[x][j]=1

        if pan[j][y]==1: # 세로
           # if j==x:
            #    continue
            pan[j][y]=0
        elif pan[j][y]==0:
           # if j==x:
            #    continue
            pan[j][y]=1


            """
            이 주석처리된 if continue과정을 왜 안 거쳐도 되냐면
            첫번째 if문에서 만약 3,3이 0에서 1로 바뀌면
            두번째 if문에서 다시 3,3이 1에서 0으로 바뀌기 때문에
            원본인 0(혹은 1)이 유지된다.
            근데 아예 안 바꾸고 유지하는 방법은 없을까?
            """

# 출력
for i in range(1,19+1): 
    for j in range(1,19+1):
        print(pan[i][j],end=' ')
    print()

수짱.py

 

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()

모범답안.py

 

 

 

#

처음에는 입력받은 좌표부분이 된다면 그 부분의 값은 바뀌지 않게 조건을 걸었는데 오류가 났다.

그래서 생각해보니 x좌표에서 y좌표의 증가, x좌표의 증가에서 y좌표 두가지 경우에 다 변하기 때문에(0->1->0) 결국 원본으로 돌아오는 사실을 깨달음. 그래서 조건을 뺏더니 통과되었다.

 

아예 처음부터 변하지 않게 해보려고 if j==x or j==y 일 때 continue하도록 했는데 이러면 pan[x][j] 뿐만아니라 pan[j][x]에서도 걸려버려서 오류난다. 예를들어 x=2, y=4 상황일 때 if j==x or j==y 조건을 걸면 pan[x][4] pan[2][y]에도 영향을 미치게 되어서 결과가 이상하게 나온다.

 

그리고 반복문 돌 때 마다 조건문 검사하는 것 보다 값을 바꾸고 다시 값을 바꾸게 하는게 효율적으로는 더 나을 거 같다. 아직 적절한 조건문을 찾진 못했다. 찾게되면 추후에 수정함

#

 


6093 : [기초-리스트] 이상한 출석 번호 부르기2(py)

문제설명

 

입력/출력

 

n=int(input())

random=input().split()

for i in range(n):
    random[i]=int(random[i]) 

# 이때 list(map(int,input().split()) 안 쓴 이유가 쥬피터 노트북 버전 안 맞아서 ㅇ
  


for i in range(n-1,-1,-1): # range ( 시작 , 끝 , 증감 )  단 ,끝은 포함하지않는다. [시작,끝)
    #print(i)
    print(random[i],end=' ')
    
    
    
# print(random[::-1])
# 리스트 역순으로 출력하기
# ex) random[3:0:-1] => 3번 인덱스부터 1번 인덱스까지(0번은 포함x) 역순으로 출력

수짱.py

 

n = int(input())
a = input().split()

for i in range(n) :
  a[i] = int(a[i])

for i in range(n-1, -1, -1):
  print(a[i], end=' ')

모범답안.py

 

 

#

주석에 있는 내용 그대로임 [::-1] 하면 리스트를 역순으로 출력한다.

[3:-1:-1]은 3인덱스부터 2,1,0 인덱스 순서로 출력한다 물론 마지막의 -1은 포함하지 않는다.

#

 


6092 : [기초-리스트] 이상한 출석 번호 부르기1(설명)(py)

문제설명

 

 

입력/출력

 

n=int(input())

a=input().split()

#print(a) # 문자열 리스트 형식으로 출력됨
for i in range(n):
    a[i]=int(a[i]) # 문자열 리스트를 다시 정수형으로 저장


#print(a) # 정수형으로 저장된 리스트 확인
count=[] 


for i in range(24): # 0부터 23까지 0으로 초기화 
    #count[i]=0 # count는 빈 리스트라서 인덱스로 접근할 수 없음
    count.append(0)
 

for i in range(len(a)):
    count[a[i]]+=1

for i in range(1,len(count)):
    print(count[i], end=' ')
    

# https://sanghyeok.tistory.com/m/3

수짱.py

 

n = int(input())
a = input().split()

for i in range(n) :
  a[i] = int(a[i])

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

for i in range(n) :
  d[a[i]] += 1

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

모범답안.py

 

#

비슷한데 내가 실수한 부분은 아무것도 없는 빈 리스트인 count에 접근하려고 해서 인덱스 오류가 떴음. 

접근하기전에 count리스트의 원소를 0으로 초기화해줘야한다.!!

#

'Algorithm > Codeup' 카테고리의 다른 글

[코드업|Python] 기초 100제 : 6015  (0) 2022.08.09