2024. 12. 9. 14:35 ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 과정 4일차 - 2 (24.12.09)

junslee 2024. 12. 9. 14:35

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분 넘어서 퇴실 버튼

==> 내일은 기본 내용 + 정렬 파이썬으로 구현!!

반응형