ABOUT ME

Today
Yesterday
Total
  • [코딩 테스트 합격자 되기] 구현 문제 (좌표)
    알고리즘/코딩테스트 문제 정리 2024. 12. 30. 23:22

    참고: 코딩 테스트 합격자 되기: 파이썬 편 122p

     


     

    ☄️ 문제 접근 및 내 생각

    1. 구현 부분에서 어떻게 방법을 떠올릴지 감이 전혀 오지 않아서 문제 분석을 보면서 이해하고 풀어보고자 함
    2. 중복이 없는 것에 대한 문제를 풀 때는 조건을 직접 구현하는 것보다도 set()을 떠올려서 될지 말지 파악하는 것이 첫번째임
    3. 음수 단위로 가게 되면 배열에서 인덱스로 나타낼 수 없으니 중심을 (5, 5)로 옮긴다는데 인덱스가 무슨 상관인지 아직 모르겠음
    4.  A-B로 이동하는 거랑 B-A로 이동하는 걸 어떻게 하나로 표현할까 생각했는데 여기는 걍 둘 다 집어넣는 걸 보고 좀 더 간단하게 생각하자는 생각을 함
    5. 구현 문제에서는 동작을 나눌 수 있는만큼 나누어서 구현하는 것이 편하다.

    소요시간: 30분

     


    🌈 파이썬 코드

    dirs = 'ULURRDLLU'
    
    def move_location(x, y, dir):
        if dir == 'U':
            x, y = x, y + 1
        elif dir == 'D':
            x, y = x, y - 1
        elif dir == 'L':
            x, y = x - 1, y
        elif dir == 'R':
            x, y = x + 1, y
        return x, y
    
    def is_valid_move(x, y):
        return 0 <= x < 11 and 0 <= y < 11
    
    
    def solution(dirs):
        x, y = 5, 5
        result = set()
        for i in dirs:
            nx, ny = move_location(x, y, i)
            if not is_valid_move(nx, ny):
                continue
            result.add((x, y, nx, ny))
            result.add((nx, ny, x, y))
            x, y = nx, ny
        return len(result) // 2
    
    print(solution(dirs))
    • x, y의 값을 업데이트 하는 과정에서 상당히 편안한 문법임을 느꼈음
    • (0, 0)으로 해도 상관없을 것 같음을 느꼈음

     

    🌈 자바스크립트 코드

    const dirs = "ULURRDLLU";
    
    function valid_move(x, y) {
      return -5 <= x && x < 5 && -5 <= y && y < 5;
    }
    
    function move_location(x, y, dir) {
      if (dir == "U") {
        [x, y] = [x, y + 1];
      } else if (dir == "D") {
        [x, y] = [x, y - 1];
      } else if (dir == "L") {
        [x, y] = [x - 1, y];
      } else if (dir == "R") {
        [x, y] = [x + 1, y];
      }
      return [x, y];
    }
    
    function solution(dirs) {
      let position = [0, 0];
      const result = new Set();
      [...dirs].forEach((dir) => {
        const [nx, ny] = move_location(...position, dir);
    
        if (!valid_move(nx, ny)) {
          return;
        }
        result.add(JSON.stringify([nx, ny, ...position]));
        result.add(JSON.stringify([...position, nx, ny]));
        position = [nx, ny];
      });
      return result.size / 2;
    }
    
    console.log(solution(dirs));
    • 일단 valid_move 부분부터 너무 귀찮게 생겼음
    • forEach 내부에서는 continue를 사용할 수 없다.
      • forEach는 함수 호출 방식으로 반복문을 처리하기 때문에 콜백 함수 내부에서 제어 흐름 키워드인 continue를 사용할 수 없다 그렇기에 return을 통해서 대체할 수 있다.
    • result의 길이를 구하는 것은 size임 length가 아님
    • set에 값을 넣을 때 배열로 집어넣으면 주소값이 들어가니깐 각자 다르게 됨 그래서 stringfy를 할 것임

     

    댓글

Designed by Tistory.