본문 바로가기

Python

[알고리즘_Programmers] 9주차 2번 문제 및 풀이

이번 포스팅에서는 "탑"이라는 문제에 대한 풀이를 진행하도록 하겠다.

 

우선 문제는 다음과 같다.

 

<문제>

 

  • 우선 문제 자체가 굉장히 길다. (딱봐도 읽기 싫게 생겼네...)
  • 그래도 문제를 안 읽으면 풀 수가 없으니, 천천히 읽어보고 문제를 풀어보았다! ^^ (지난 번처럼 삽질을 안하도록 문제를 꼼꼼하게 읽었다)
  • 문제 접근법을 생각해내는 것은 크게 어렵지 않았으므로, 머리 속으로 생각한 내용들을 천천히 코드로 구현해보았다.

<1. 나의 풀이>

  • 먼저 신호가 오른쪽에서 왼쪽 방향으로 전해지므로 reversed()를 사용해서 주어진 heights 리스트를 역순으로 바꿔주었다.
  • 그 다음, [(idx1, heights1), (idx2, heights2), ...]의 형태로 리스트를 만들어주기 위해 list comprehension을 사용하였다.
    • 예를 들면 [(5, 4), (4, 7), (3, 5), (2, 9), (1, 6)] 이런 식으로 만들어주기 위해서!
  • 그리고 나서 for문을 사용하여 반복문을 돌려주었는데, "수신 여부"를 의미하는 count를 만들어서 수신을 받았을 경우 1 값을 갖도록 해주었다.
  • count 값이 1 인 경우에는 해당 탑의 번호를 result 리스트에 넣어주고 반복문을 종료하게끔 만들어주었다.
    • 왜냐하면 count 값이 1 이라는 말은 수신을 받았다는 의미이기 때문이다.
  • 만약 탑의 높이를 비교했지만 count 값이 여전히 0 이면, 수신을 받은 탑이 없다는 의미이므로 0 을 result 리스트에 넣어주었다.
  • 마지막으로 맨 처음에 reversed를 사용해서 역순으로 작업을 수행해주었으므로, return 값을 반환할 때 다시 reversed()를 사용해서 원래 순서대로 반환해주었다.

 

<2. 다른 사람의 풀이>

  • 위와 같이 range( ) 함수-1을 사용하면 reversed를 해줄 필요가 없었다.
  • 또한 result탑의 개수(len(heights))만큼 0 으로 구성된 리스트라고 설정하고, 탑의 높이를 비교해가며 신호 수신 가능 여부를 확인해서 뒤의 0 값부터 수신 받은 탑의 번호로 변경해준다.

 

range( ) 함수를 활용해서 역순으로 처리해줄 수 있다는 것은 알고 있었지만, 실제로 문제가 나왔을 때 적용하지 못했다.

 

머리 속으로만 알고 구현을 하지 못하는 것은 온전한 나의 지식이 아니다.

 

이렇게 하나하나 배워가며 모든 것이 온전한 나의 지식이 되는 그날까지 파이팅하자!! :)