IT 정리용 블로그!

[이것이 취업을 위한 코딩테스트다] Chapter 4. 구현 본문

[도서] 이것이 취업을 위한 코딩테스트다 with 파이썬

[이것이 취업을 위한 코딩테스트다] Chapter 4. 구현

집가고시퍼 2022. 1. 27. 14:56
  • [4-1]
    Q : 1x1 크기의 정사각형 블록으로 이루어진 NxN 크기의 지도가 있다. 가장 왼쪽 위 좌표는 (1,1)이며, 가장 오른쪽 아래 좌표는 (N,N)에 해당한다. 여행가가 지도 위를 여행하는데, 시작 좌표는 항상 (1,1)이다.
    여행가가 이동할 계획서가 있다. 하나의 줄에 띄어쓰기를 하여 L,R,U,D의 문자들이 적혀 있다. 여행가가 NxN 크기의 지도를 벗어나려는 움직임은 무시된다. 첫 줄에는 N이 주어지고, 둘째 줄에는 A가 이동할 계획서의 내용이 주어진다. 여행가가 최종적으로 도착할 지점의 좌표를 공백으로 구분해 출력해라.

    A :
    사실 line 2에서 move_를 list 형태로 만들 필요 없이 input().split()만 해주면 알아서 move_에 list 형태로 들어간다. str 형태로 들어가는 것이 아니라.

    위 문제를 다른 형태로 구현해보면 아래와 같이 할 수 있다.




  • [4-2]
    Q : 정수 N(0~23)이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수의 개수를 구하는 프로그램을 작성하시오.

    A :
    처음에는 runtime을 줄이려 line 4를 빼고 분과 초만 이용해 3이 있는 경우의 수를 곱하고, 그 cnt에 N을 곱하려 했지만, N에도 3이 들어가는 경우를 간과했다.


  • [4-3]
    Q : 체스판은 8x8 좌표 평면이다. 나이트는 L자 형태로만 이동할 수 있으며, 수평으로 두 칸 이동한 뒤 수직으로 한 칸 이동하거나, 수직으로 두 칸 이동한 뒤 수평으로 한 칸 이동할 수 있다. 8x8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성해라. 행은 1~8로, 열은 a~h로 표현해 a1 같이 표현한다.

    A :
    ord()함수를 이용하면 해당 문자의 아스키 코드를 받을 수 있다.


  • [4-4]
    Q : 캐릭터가 1x1 크기의 정사각형으로 이루어진 NxM 크기의 맵에 있다. 각 칸은 육지 혹은 바다이고, 캐릭터는 동서남북 중 한 방향을 바라본다. 맵의 각 칸은 (A,B)로 나타낼 수 있고, A는 북쪽으로부터 떨어진 칸의 개수, B는 서쪽으로부터 떨어진 칸의 개수이다. 캐릭터는 상하좌우로 움직일 수 있고, 바다로는 갈 수 없다. 캐릭터는 다음과 같이 움직인다.
    1. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 갈 곳을 정한다.
    2. 캐릭터의 바로 왼쪽에 아직 가보지 않은 칸이 존재한다면, 왼쪽 방향으로 회전한 다음, 왼쪽으로 한 칸을 전진한다. 왼쪽 방향에 가보지 않은 칸이 없다면, 왼쪽 방향으로 회전만 하고 1단계로 돌아간다.
    3. 만약 네 방향 모두 이미 가본 칸이거나 바다로 되어있는 칸인 경우에는, 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아간다. 단, 뒤쪽 방향이 바다인 칸이라 뒤로 돌아갈 수 없는 경우에는 움직임을 멈춘다.

    매뉴얼에 따라 캐릭터를 이동시킨 뒤에, 캐릭터가 방문한 칸의 수를 출력하는 프로그램을 작성해라
    첫째 줄에는 맵의 세로크기 N과 가로크기 M이 공백으로 구분되어 입력된다. 둘째 줄에는 캐릭터가 있는 칸의 좌표 (A,B)와 바라보는 방향 d가 서로 공백으로 구분되어 주어진다. 방향 d의 값으로는 다음과 같이 4가지가 존재한다(0:북쪽, 1:동쪽, 2:남쪽, 3:서쪽). 셋째 줄부터 맵이 육지인지 바다인지에 대한 정보가 주어진다. N개의 줄에 맵의 상태가 북쪽부터 남쪽 순서대로, 각 줄의 데이터는 서쪽부터 동쪽 순서대로 주어진다(0:육지, 1:바다)

    A :
    line 21에서 모든 방향을 체크한 경우 cnt=4가 된다. 이때 dir은 원래 처음 direc 함수로 들어왔던 dir과 동일하기 때문에 뒤로 한 칸 가려면 a, b에서 dy,dx를 빼주면 된다. 그 때 뒤 칸이 바다라면(line 24), 51,51,51을 return한다. A,B의 크기 제한이 50까지이기 때문에 저렇게 설정해 주었다. line 35에서 이동을 d에 51이 반환될때 까지 계속한다.
    위 코드에서는 map_과 별도의 지도 known_을 만들어 주었다. line 30~31에서 방문한 지역은 1로 마킹한다. 하지만 line 24에서 known_에서는 뒤가 바다인 경우와 방문한 경우 모두 1이므로 known_이 아닌 map_을 사용했다. 다시 생각해 보니 애초이 line 31에서 방문한 지역을 2로 마킹한다면 굳이 두 2차원 list를 안써도 될 것 같다.
    그리고 line 37~39에서 현재 지도 상황과 방향을 print해서 캐릭터가 어떻게 이동하고 있는지 확인해 보았다. 오른쪽 예시를 보면 제대로 이동하고 있음을 확인할 수 있다.
Comments