04_cotest
코테!!
-- 구현 : 주어진 상황을 코드화!!
-- 정렬 : 알고리즘 --> 어떻게 할 것인가!!
-- 탐색 : DFS/BFS + etc 알고리즘 ++ 최단거리..
-- 최단거리 : 다익스트라알고, 마샬~~,...
**********************************************
-- DP,, Hash etc... //마이너한 주제
==> 코테는 100점 만점 task!! 가 아님!!
지원자들을 필터링!!! --> 적정 수준 이상!!
3/4 이상 맞추는 게임!!
==> 하,하,중,중,상,상
01_구현_지도상이동

# 주제 : 구현 // 책 "이것이 코딩테스트다" 출처
--> 주어진 문제들을 코드로 작성하는 것이 핵심!!
(특별한 알고리즘을 적용하지 않는 유형!! 보통 구현 주제!!)
--> 평면상에서 이동!! 다양한 주제에서 사용이 됨!!
(탐색, 최단거리 etc)
# 문제 상황
1) 좌표를 도입을 하면 편하지 않을까!!!!
==> 단, 수학시간에 사용했던 좌표 세팅과는 조금 다르게 세팅!!!
문제에서 주어진대로 하다보니....
2) N크기의 정사각형 : ==> (1,1) ~~~ (N,N) in
3) 이동에 대한 4가지 종류 : LRUD
==> 코드화 : 좌표를 도입을 해서 이동에 대한 표현!!!!!
임의의 위치 (x,y) 에 있을 때
L : (x, y-1)
R : (x, y+1)
U : (x-1, y)
D : (x+1, y)
====> 기준과 본인의 세팅에 따라서 다를 수 있음!!
+++ 파이썬으로 어떻게 할지는 여러 스타일!!!!
4) 전체 흐름!!!!!
--> 입력으로 주어지는 지시사항들을 다 수행을 해야함!!! for
==> 체크 : 지시사항대로 움직인다면,,,in/out 체크!!! ===> if
안쪽으로 yes --> 나의 위치 좌표값을 갱신!!!
---> 위의 지시사항을 다 하고,,,,맨 마지막에 있는 나의 위치!!!
===> LRUD에 대한 코드화 작업!!!!!
임의의 위치 (x,y) 에 있을 때
L : (x, y-1)
R : (x, y+1)
U : (x-1, y)
D : (x+1, y)
===> 증감에 대해서,,,갱신의 관점으로 다시...
나중 = 지금 + 얼마나 변하면 될까요...( cnt = cnt + 1)
(x, y) ===> L : (x,y) + (0, -1) = (x+0, y-1)
R : (x,y) + (0, +1) = (x+0, y+1)
U : (x,y) + (-1, 0) = (x-1, y+0)
D : (x,y) + (+1, 0) = (x+1, y+0)
# style1) 이동에 대한 부분을 dict로 구현!!!!
move_dict = {
"L":[0, -1],
"R":[0,1],
"U":[-1,0],
"D":[1,0]
}
move_dict
move_dict["R"]
# 지금 (3,4)에 있는 상태에서 R의 지시사항을 받아서 이동한다면,,
# 어디로 갈까?
3 + move_dict["R"][0], 4+move_dict["R"][1]
# Style2) 리스트로 표현!!!!!!

move_types = ["L","R","U","D"]
dx = [0, 0, -1, 1 ]
dy = [-1, 1, 0, 0 ]
idx = 1
print(move_types[idx])
print(dx[idx])
print(dy[idx])
# (3,4)에서 R으로 간다면,,,,
idx = 1 # R 지시사항의 순서!!!!
3+dx[idx], 4+dy[idx]
참고) ["L","R","U","D"] 원하는 리스트에서 값을 중심으로
그 값의 위치 인덱스를 찾는 기능 : 파이썬 --> 리스트 -->메서드!!
주의!!!) 중복된 원소가 있다면,,,가장 앞에 있는 위치만 리턴!!!
["U","D","L",'R',"U","R","R"].index("R")
# dict Style1 사용해서
1) 주어진 입력 사항 세팅
n=5
plans = ["R","R","R","U","D","D"]
2) 문제 상황 & 초기 값에 대한 세팅!!
==> 내가 지금 어디에 있는지에 position : (x,y) --> etc...
# pos = (1,1)
x,y = 1,1
==> 문제 조건 상 출발점의 자표를 (1,1)로 했기 때문에!!
3) LRUD 이동에 대한 세팅 : dict/ list / etc ...
move_dict = { "L":[0, -1], "R":[0,1], "U":[-1,0], "D":[1,0]}
==> 문제 상황에 대한 세팅은 끝!!
4) 본격적으로 주어진 입력에 대해서 수행하는 코드!!
이 문제의 가장 큰 틀 : 입력으로 받은 plans를 다 돌려가면서..
--> 그 해당 plan으로 좌표를 이동해봐서...
--> if 인/아웃 판별!!
: 인바운드가 가능할 때만 이동하는 룰에 맞춰서 좌표 갱신!!
for plan in plans: #지시 사항들을 롤링 !!
# 지금 위치에서 지시사항대로 움직인다면 .... 어디로 갈지 정보!!
# 주의 !! 아직 지금 위치에서 갱신은 하면 안됨!!
next_x = x + move_dict[plan][0]
next_y = y + move_dict[plan][1]
# => 시킨대로 한다면,,, 어디로 갈지에 대한 예상 좌표값..
# 잠시!! 이동이 가능한 곳인지 체크!!
# 연습용으로 아웃바운드를 기준으로 하겠습니다.
if next_x < 1 or next_x >n or next_y<1 or next_y >n:
# 아웃바운드
continue
else:
# 인바운드!!
# 할 일 : 진짜 이동하면 됨!! ==> 좌표값을 갱신!!
x,y = next_x, next_y
print(x,y)
#print(plan)
# 코테 연습을 하실 때 제일 중요한 과정!!!
1. 이해가 안되면,,, 여러 방법을 찾아보고,,,
그 중에서 일단 눈에 잘 들어오거나, 나와 비슷하게 한 방법을 중시믕로
"완벽하게 이해"
2. 다시 본인이 하려는 방식대로 정리!!!!**********
3. 여러번 반복적으로 하셔야 함!! --> 툭 치면 손이 알아서 가도록!!
4. +++ 나와 다른 방법 중에서 좋은 것들이 있는지 체크!!!
==> 나의 방식을 수정!!
==> 좋은 방법의 특징/ 장점이 무엇인지 체크!
# 코드 정리
n = 5
plans = ["R","R","R","U","D","D"]
#######################
x,y = 1,1
move_dict = { "L":[0, -1],"R":[0,1],"U":[-1,0], "D":[1,0] }
for plan in plans: # 지시사항들을 롤링!!!! //롤링 뜻 : 목표를 다시 수립해보는것
next_x = x + move_dict[plan][0]
next_y = y + move_dict[plan][1]
if next_x < 1 or next_x >n or next_y < 1 or next_y > n:
continue
else:
x, y = next_x, next_y
print(x,y)
# 동일한 방법인데,,,,리스트로 해보자!!!!
n = 5
plans = ["R","R","R","U","D","D"]
################### ###################
x,y = 1,1
# move_dict = { "L":[0, -1],"R":[0,1],"U":[-1,0], "D":[1,0] }
move_types = ["L","R","U","D"]
dx = [ 0, 0, -1, 1 ]
dy = [-1, 1, 0, 0 ]
for plan in plans:
# +++ 지시사항에 대한 정수 인덱스를 찾아야 함!!!!
# m1) .index()
# m2) 그냥 for문으로 돌려도 상관 없음!!!!
for i in range(len(move_types)): # 상수 4개 --> 0,1,2,3
# 어떤 지시사항에 걸리는지 인덱스 찾아..
if plan == move_types[i]:
next_x = x + dx[i]
next_y = y + dx[i]
# dict에서는...
# next_x = x + move_dict[plan][0]
# next_y = y + move_dict[plan][1]
################### ###################
if next_x < 1 or next_x >n or next_y < 1 or next_y > n:
continue
else:
x, y = next_x, next_y
print(x,y)
# 동일한 방법인데,,,,리스트로 해보자!!!! //잡지식 추가
n = 5
plans = ["R","R","R","U","D","D"]
###################
x,y = 1,1
# move_dict = { "L":[0, -1],"R":[0,1],"U":[-1,0], "D":[1,0] }
move_types = ["L","R","U","D"]
dx = [ 0, 0, -1, 1 ]
dy = [-1, 1, 0, 0 ]
for plan in plans:
# +++ 지시사항에 대한 정수 인덱스를 찾아야 함!!!!
# m1) .index()
# m2) 그냥 for문으로 돌려도 상관 없음!!!!
i = move_types.index(plan)
next_x = x + dx[i]
next_y = y + dy[i]
# next_x = x + move_dict[plan][0]
# next_y = y + move_dict[plan][1]
# for i in range(len(move_types)): # 상수 4개 --> 0,1,2,3
# # 어떤 지시사항에 걸리는지 인덱스 찾아...
# if plan == move_types[i]:
# next_x = x + dx[i]
# next_y = y + dy[i]
# dict에서는...
# next_x = x + move_dict[plan][0]
# next_y = y + move_dict[plan][1]
##########################
if next_x < 1 or next_x >n or next_y < 1 or next_y > n:
continue
else:
x, y = next_x, next_y
print(x,y)
# 정리
1. 문제 상황을 이해 +++ 분석!!
2. 문제 주어진 조건들을 / 상황들을 어떻게 표현할까?
==> 파이썬의 자료형, 세팅,
==> 세팅/자료형에 맞는 표현/ 규칙!!
3. 코드의 큰 틀을 생각하면서 하나씩 세팅을 기반으로 풀어나가면 됨!!
+ 하다보면 빠지거나 에러 처리를 놓치면... 경고/에러 -> 수정해 나가면 됨!!
+ 파이썬의 잡다한 기능을 알면 편하다!!
4. 이런 평면상의 움직임을 표현할 때 : 좌표도입!!
좌표도입 ==> 숫자표현 ==> 수식으로 규칙이나 룰을 기술하기가 용이!!
단, 100%는 아님!!
02_구현_L자이동


# L자 이동에 대한 코드화!!
dict /list ? ==> 명확하게 어떤 L이동인지 상관없으니..
그냥 대충 list로 하면 되겠죠!!
==> (x,y) 임의의 위치에 있다고 하면...(이동 증가)
l_moves = [
[-2,-1],
[-2,1],
[2,-1],
[2,1],
[1,-2],
[1,2],
[-1,-2],
[-1,2]
]
l_moves
==> 주어진 지도는 8 by 8 고정된 평면에서 움직임!!
( 유사한 점은 2D에서 움직인다!!)
==> but 앞의 지도 문제와 다른 점은 위치에 숫자 + 알파벳!!
==> 숫자로 좌표를 표현하는 것이 편하지 않을까!!
+++ in/out : 좌표의 부등식
+++ L이동 : 좌표 도입해서 각기 가로 /세로 표현!!
단, 앞에 문제에서는 LRUD로 이동을 했다고 하면,
L자의 8가지 패턴으로 이동을 함!!
이 문제의 큰 틀
==> 정해진 8가지 L 패턴을 다 해보면 됨!!
if 이동할 수 있다면 (안쪽)
할 일 : 카운팅!!
# 참고) 좌표에 대해서 숫자만 있는 것이 아니라 문자로 있음;;;
==> 문자를 숫자로 변경!!
기존 좌표 : (가로 문자, 세로 숫자)
----> (가로 숫자, 세로 숫자)
why?? L자 이동에 대한 표현을 좌표상 숫자가 용이하기에!!
+ in/out 에 대한 조건 표현도 부등식을 사용하기에!!
ord("a")
ord("b")
# a1 --> (1,1)
# c2 --> (3,2)
==> 숫자로 통일하기 위해서 a-1, b-2, c-3...
in_txt = "a1"
row = int(in_txt[1])
col = ord(in_txt[0]) - ord("a") + 1 # 기준 숫자를 1로 세팅하기 위한 꼼수
print(row, col)
==> 자동상의 이동에 대한 표현이 +/- 활용해서 표현이 가능함!!
+ 인/아웃에 대한 표현도 부등식을 사용할 수 있음!!
==> 2차원적인 독립적인 x,y 가로는 어떤지, 세로는 어떤지
독립적으로 생각을 하거나, 규칙화를 하는데 도움!!
# 문제의 큰 틀!!
==> 위에서 정의한 l_moves를 다 돌려가면서.. : for
if 그 이동이 (in)./out 체크 :부등식!!
in 조건 만족하면 할 일 : 카운팅!!
# 카운팅 변수
count = 0
# 8가지 이동 패턴 : for
for move in l_moves:
print(move)
# 1) 일단 지금 위치에서 이동해봐!!
# 2) 그렇게 이동할 수 있냐? N
# ---> IN : count += 1
### 코드 작성
in_txt = "c2" # ---> 6가지
row = int(in_txt[1])
col = ord(in_txt[0]) - ord("a") + 1 # 기준 숫자를 1로 세팅하기 위한 꼼수
# --> 입력 좌표에 대한 처리
# 8가지 이동에 대한 표현
l_moves = [[-2,-1],[-2,1],[2,-1],[2,1],[1,-2],[1,2],[-1,-2],[-1,2]]
# 카운팅에 대한
count = 0
# -------------------------------- 세팅 끝!!! ------
for move in l_moves:
# 1) 일단 이동해봐!!!!
next_row = row + move[0]
next_col = col + move[1]
# 2) 이렇게 이동하면 이동이 가능한지 체크: in중심
if next_row>=1 and next_row<=8 and next_col>=1 and next_col<=8:
# 8 by 8 지도 안에 있는 경우!!!!
# 할 일 ; 카운팅
count += 1
print(count)
### 정리!!
기존에 있던 / 본인이 알던 문제들과 풀어야 하는 문제가 어떻게 이용!!
==> 핵심적인 부분이나 설정, 세팅, 푸는 방식!!
==> 주어진 문제에 잘 적용!!! 활용!!!
**** 공부할 때 하는 기본 유형들을 달달달 해야 하지 않을까!!!
여러 방식에 대해서!!!!
03_구현_카카오키패드
# 프로그래머스 사이트
---> solution 함수!!!
---> 입력에 부분에 있어서는 굳이 변경을 잘 하지 않음!!!
def solution(numbers, hand):
answer = ' '
##########
--> 문제에서 주어진 상황에 맞는 코드를 작성!!!!
입력 + 주어진 상황 + 요청한 출력!!!!!
참고) 외부 패키지 : 사용할 수 있는 리스트,,,
참고) 다른 기능적인 부분을 외부 함수를 만들어서 호출!!
##########
return answer
# 문제 이해를 위한 정리
- 엄지 손가락만 사용한다(왼엄, 오엄)
- 초기 위치 : L(*), R(#)
- 이동 경우 : LRUD움직(단, 대각선은 X, 수직 / 수평)
- 버튼의 종류에 따라서 case by case --> if
1) 1,4,7 : 무조건 왼손
2) 3,6,9 : 무존건 오른손
3) 2,5,8,0 : 가장 가까운 거리!!!! 거리???어떻게???
3-1) 거리가 다를 때 : 가까운 손
3-2) 거리가 같을 떄 : 어느손 잡이
결국 solution 함수 제출
입력 : numbers --> 누를 숫자들(리스트) [ 원소수 1~1000], 0~9
hand --> 무슨 손 잡이(문자열) ["left", "right"]
출력 : answer --> 문자열
입력으로 준 numbers에 해다하는 누른 손을 문자열!!!
L/R을 사용해서 이어진(공백없는)문자열!!!
거리 : 직교거리(가로로 얼마 + 세로로 얼마)
==> 대각선 거리X
==> 가로사이의 거리 + 세로 사이의 거리
==> 이거 최악의 경우1000개 지시사항 중에서 1/3 : 함수.
세팅 : 위치pos & 거리도 계산!!
=====> 키패드 평면 : 좌표화!!!!
# 큰 틀 : 눌러야 하는 버튼을 돌리면 됨!!!
for num in numbers:
if 1/4/7:
무조건 왼손
elif 3/6/9
무조건 오른손
else/elif 2/5/8/0
++ 양손에서의 이 버튼 사이의 거리!!!!
==> 여러번 사용될 것 같음!!!! 함수!!!!
( 입력 : 손의위치, 누를 버튼) --> 출력 : 직선거리
D_L, D_R
if 거리가 다를 때:
짧은 거리 거리 손을 선택!!!!
else: # 거리가 같을 때
hands 입력 변수의 정보를 사용!!!
==> 거리는 어떻게 할까??? 위치????
===> 문제에서는 대 놓고 좌표/ 축/ 기준 이런 말이 없음!!!
: 없으면 본인 편한대로 만들면 됨!!!!(숫자로 좌표!!!!)
: 숫자로 좌표 =
** 오늘 한 내용들 복습!!
==> 키패드 문제를 풀어 보세요!!
** 이해가 안되는 것은 꼭 질문하고 넘어가세요!!
==> 스스로 안 보고 정리/ 본인 스타일
** 50분 넘어서 퇴실 버튼
==> 내일은 기본 내용 + 정렬 파이썬으로 구현!!
'ASAC 빅데이터 분석가 7기 > ASAC 일일 기록' 카테고리의 다른 글
| ASAC 빅데이터 분석가 과정 5일차 - 2 (24.12.10) (0) | 2024.12.10 |
|---|---|
| ASAC 빅데이터 분석가 과정 5일차 - 1 (24.12.10) (0) | 2024.12.10 |
| ASAC 빅데이터 분석가 과정 4일차 - 1 (24.12.09) (0) | 2024.12.09 |
| ASAC 빅데이터 분석가 과정 3일차 - 2 (24.12.06) (0) | 2024.12.06 |
| ASAC 빅데이터 분석가 과정 3일차 - 1 (24.12.06) (0) | 2024.12.06 |