일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 정처기 인강 추천
- 코딩테스트실력진단
- 그램 액정 교체비용
- 폰 잃어버렸을때
- 정처기 실기
- 싸피 추천인
- 정보처리기사 준비물
- 갤럭시 위치추적
- SSAFY
- LG 서비스센터 영업시간
- #코드트리 #코딩테스트 #코딩테스트실력진단
- 폰 도난
- 코딩테스트
- 싸피 모집설명회 다시보기
- 싸피 혜택
- gram 액정 교체
- 정처기 후기
- 코드트리
- 인디노래 추천
- 싸피 모집설명회
- 싸피 11기
- 싸피 지원자격
- 학생메일
- 삼성 싸피 지원
- 정보처리기사 실기
- 싸피 추천코드
- 삼성 싸피
- 폰 위치추적
- 봄 노래
- 폰 찾기
- Today
- Total
포포's 코딩&일상 기록
7월 18일 화요일 코테 -알고리즘 특강 : dy dx 테크닉 본문
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 까지임

'코테 > 특강' 카테고리의 다른 글
Back Tracking 문풀 개념 복습 (0) | 2023.07.30 |
---|---|
7월 29일 토요일 코테: 기말고사 : 계속 시도해봤지만 틀린 문제 (0) | 2023.07.29 |
7월 29일 토요일 코테 : 기말고사 : 정답 맞춘 문제 (0) | 2023.07.29 |
7월 24일 월요일 코테 : 알고리즘 강의 - backtracking (0) | 2023.07.25 |
7월 20일 목요일 코테 : 알고리즘 강의 - 시뮬레이션 (0) | 2023.07.20 |