포포's 코딩&일상 기록

7월 18일 화요일 코테 -알고리즘 특강 : dy dx 테크닉 본문

코테/특강

7월 18일 화요일 코테 -알고리즘 특강 : dy dx 테크닉

포포252 2023. 7. 18. 19:47

 

 

7월 18일 화요일 코테

 

알고리즘 특강에서 푼 문제들이다. 

dx, dy 테크닉을 새롭게 배웠는데 

이런방법이 있구나 싶다 ㅠㅠ 

 

-  문제 1 : 방향에 맞춰 이동 

 

코드 

 

co=int(input())
start=[0,0]

for i in range(co):
    b,c= input().strip().split()
    c=int(c)
    B = ['W','S','N','E']
    dx,dy = [-1,0,0,1],[0,-1,+1,0]

    num_dir = B.index(b)
    for j in range(c): #이거대신 곱하는거 해도되더라... c 만큼... 
        start[0] += dx[num_dir]
        start[1] += dy[num_dir]

print(start[0],start[1])

 

새롭게 알게된것 

 

반복문 안쓰고도 할수있다... 

 

주의할점

문제 꼼꼼히 읽기... 

 

 

 

 

-  문제 2:  문자에 따른명령 2 -> 방향고려  : 부족.. 다시풀기.. 

 

코드 

 

1트

start = [0,0]

dir_num = 0 #기존방향 

N = input() # 여기에 split() 하면안됨.. 

dx,dy = [0,1,0,-1],[1,0,-1,0]

for i in N :
    
    if i == 'R' :
        dir_num = (dir_num +1) % 4
       

    elif i =='L':
        dir_num = (dir_num -1 +4) %4
    
    elif i =='F':
        #print("dir_num:", dir_num)
        start[0] += dx[dir_num]
        start[1] += dy[dir_num]


print(start[0],start[1])

 

 

2트 

start =[0,0]

order = input() 

dx,dy = [0,+1,0,-1],[+1,0,-1,0]
dir_num=0

for i in order:
    if i == 'L': # 반시계 
        dir_num = (dir_num+3)%4
    elif i == 'R': # 시계
        dir_num =(dir_num+1)%4

    elif i == 'F': #이동
        start[0] +=dx[dir_num]
        start[1] +=dy[dir_num]


print(start[0],start[1])

 

새롭게 알게된것 

 

input() 하고 split() 하면.. 리스트형태로 담기는게 아니라.. 각각 하나씩.. 떼어져서 담기는거인듯.. 

a,b = input().split() 하면 앞에있는거 두개만 담기고

c= input().split() 하면 앞에있는거 하나만 담기고 나머지 값은 날아가는듯.. 

 

차라리 리스트로 담고싶으면 

c= input() 만 하던가.. ( 문자열로담겨서 이터레이션 형태로.. for 문에서 하나씩 가져와서 쓸수있음) 

 

c = list(input().split()) 하던가. . . 해야할듯. .. 

 

주의할점

 

문자값 비교할때 

i == F : 

로하면안됨.. 

문자열이라 'F' 처럼 따옴표 처리 해줘야함. 

 

시계/반시계 구분 잘하기.. 실수조심 

 

 

연관성있는 명령문은 또 묶을수있음 ( 회전을 if 문 안쓰고 이렇게도 할수있따.. ) 

 

 

-  문제 3 : 1이 3개이상 있는 위치 

 

코드 

 

n = int(input())

a=[]
for k in range(n):
    line= list(map(int,input().strip().split())) 
    a.append(line)



def in_range(x,y):
    return (0 <= x < n) and (0 <= y < n) 

#1 합 구해서 리스트에 넣기 
sum_of_one = [] 

di,dj = [0,1,0,-1],[1,0,-1,0]


for i in range(n):
    for j in range(n):
        count=0 

        for b in range(4):
            ddi = i +di[b]     
            ddj = j +dj[b]
            
            if in_range(ddi,ddj) and a[ddi][ddj]==1:
                count+=1


        sum_of_one.append(count)


over3 = 0 

for p in sum_of_one:
    if p >=3 : 
        over3 +=1 


print(over3)

 

새롭게 알게된것 

 

 

 

주의할점

 line= list(map(int,input().strip().split()))  

입력받은걸 숫자로 변경해줘야한다.. .

그냥리스트에 넣으면 문자가 됨.. 

 

 

 

 

-  문제 4 : 빙빙돌며 사각형 채우기 ** 삼성 자주나옴 

코드 

 

n,m = map(int,input().strip().split())

a= [[0 for _ in range(m)] for _ in range(n)] 

di,dj = [0,1,0,-1],[1,0,-1,0]

def in_range(i,j):
    return 0 <= i < n and 0 <= j < m # 여기에 n,m 조심.. j 는 m까지임 



i,j,d = 0,0,0 

num =1 
while num <= n*m:
    a[i][j] = num

    if num == n*m:
        break 

    #방향 확인용
    ji = i+di[d]
    jj= j+dj[d]

    if not in_range(ji,jj) or a[ji][jj] != 0:
        d = (d+1) % 4

    #직진
    i = i+di[d]
    j= j+dj[d]

    #넣을 값 변경 
    num +=1 


#출력 
for i in range(n):
    print(*a[i])

새롭게 알게된것 

좋은코드는.. 내가 10년뒤에 봐도 내가 알아볼수있어야한다.. 

그래서 주석이 중요한것임!! 

주석은 나를위해 다는것임 

처음공부하는 사람일수록 주석이 큰효과를 발휘함 

 

 

* 언패킹을 이용해서 이차원 배열을 출력할수 있다.

 

 

주의할점

 

in_range 체크할때 i 는 n 까지, j 는 m 까지임