본문 바로가기
공부/<이것이 코딩테스트다>

Ch4 구현

by 푸딩코딩 2023. 1. 9.
728x90
반응형

 

 

4-1문제

 

k=int(input())
arr=[['0' for i in range (k) ]for row in range (k)]

strarr= list(map(str,input().split())) #문자열 끊어서 저장
x=0 
y=0 #시작 좌표


for i in strarr:
    if i=='L':
        if(y==0):
            continue
        else:
            y-=1
    elif i=='R':
        if(y==k-1):
            continue
        else:
            y+=1
    elif i=='U':
        if(x==0):
            continue
        else:
            x-=1
    else:
        if(x==k-1):
            continue
        else:
            x+=1

print(x+1, y+1)

 

 

4-2 시각 문제

n=int(input())
count=0
##n=2라면, 

for i in range(n+1):
    for j in range (60):
        for k in range(60):
            if '3' in str(i)+str(j)+str(k): ##nn시 jj분 kk초 꼴에서 3이 나온다면 count++함 
                
                count+=1

print(count)

##00시 00분 00초에서 1시간당 3/13/23/30~39/43/53 -> 초:

 

 

4-3 왕실의 나이트

 

n, m=input().strip()##strip()은 한 글자씩 끊어서 저장받음

m=int(m)
#아아부터 고고|
cnt=0
if(m+2 <= 8): 
    if(chr(ord(n)+1)<='h'):
        cnt+=1
    if(chr(ord(n)-1)>='a'):
        cnt+=1
if(m-2>=1):    
    if(chr(ord(n)+1)<='h'):
        cnt+=1
    if(chr(ord(n)-1)>='a'):
        cnt+=1
if(chr(ord(n)+2) <='h'):
    if(m+1<=8):
        cnt+=1
    if(m-1>=1):
        cnt+=1
if(chr(ord(n)-2) >= 'a'):
    if(m+1<=8):
        cnt+=1
    if(m-1>=1):
        cnt+=1
        
print(cnt)

20분 제한 문제지만 25분이 걸렸다

풀면서 4-1 상하좌우 문제와 비슷하게 풀리지 않을까? 생각했는데 일단 무작정 

상상 하하 좌좌 우우씩 이동 후 다음단계 이동이 가능한지 확인하는 방식으로 풀었다.

 

답지의 풀이에서는 역시 steps =[ (-2,-1) , (-1,-2) .... (2,1),(1,2))] 의 8가지 이동 방향 리스트가 있었다.

 

**문자열에서 알파벳을 다음 알파벳혹은 이전 알파벳으로 변환하는 방법

chr(ord('a')+1) 꼴로 사용하면 b가 나온다.

chr(ord('b')-1) 꼴을 사용하면 a가 나온다.  

n, m=input().strip()
m=int(m)  #m은 숫자로 행 
n=int(ord(n)-ord('a'))+1   ##n은 알파벳으로 열, 1으로 만들어준다. 
steps=[(-2,-1),(-2,1),(2,-1),(2,1),(1,2),(1,-2),(-1,2),(-1,-2)]
cnt=0
for step in steps:
    row=m+step[0]
    col=n+step[1]
    if(row<=8 and row>=1 and col<=8 and col>=1):cnt+=1
        
print(cnt)

풀이를 참고해 다시 풀어본 모습!!

상하좌우 형태의 문제에서는, dx와 dy변수가 중요하게 쓰이는 것같아서 연습해보려고 다시 풀어봤다.

 

 

 

4-4 게임 개발

 

n, m=map(int,input().split())
a, b, d=map(int, input().split())


visit=[[0 for j in range(n)]for i in range(m)]
visit[a][b]=1

array=[]
for i in range(n):
    array.append(list(map(int, input().split())))
    
#북동남서 이동
dx=[-1,0,1,0]
dy=[0,1,0,-1]

def turn_left():
    global d
    d-=1
    if(d==-1):
        d=3
    
cnt=1
t_cnt=0
while True:
    turn_left()
    nx=a+dx[d]
    ny=b+dy[d]
    if(visit[nx][ny]==0 and array[nx][ny]==0):
        visit[nx][ny]=1 ##방문체크하고
        a=nx
        b=ny #좌표 바꿔준다
        cnt+=1 #카운트늘려준다
        turn_left() 
        t_cnt=0
        continue
    else:
        t_cnt+=1
    if(t_cnt==4):
        nx=a-dx[d]
        ny=b-dy[d]
        if array[nx][ny]==0:
            a=nx
            b=ny
        else:
            break
        t_cnt=0
        
print(cnt)

어려워서 조금 고민하고 바로 답을 봤는데, 내일 다시 풀어 볼 것!!

728x90
반응형