코딩테스트/그외(소프티어 등)

소프티어 3번, 4번 문제 해설!

RyanKwon 2021. 8. 16. 17:50
728x90

3번 문제 코드만 보고싶다면 링크
4번 문제 코드만 보고싶다면 링크

불과 2~3일?전만 해도 사실 앞으로 소프티어에서 문제를 풀 일이 있을까.. 싶은 마음이 들었었다. 그런데 그러고 나서 크롬에서는 예제 실습이 된다는걸 알고 나니까 또 뭐랄까 문제를 풀고싶어져버렸다. 사실 리트코드에 있는 문제들도 좋은게 많기는 하지만 음.. 좀 안좋은 문제들도 있긴 하니까. 가령 스택카테고리에서 문제를 푸는데 내가 생각한 스택문제들이 나오지 않는 경우가 많달까. 전에 어디서 그런 글을 봤었다. 리트코드는 사람들이 추천 비추천을 할 수 있어서 추천수가 비추천수에 비해 월등히 많은 문제들을 풀면 다소 좋은 문제들을 선별할 수 있다고. 틀린 말은 아니지만 내가 원하는 카테고리이면서.. 그런 조건을 만족하고 그런 문제들을 찾기가 꽤 힘들다. 차라리 소프티어는 그래도 삼성 청년 아카데미처럼 나름 현대자동차에서 자기들의 잠재적 인재 채용을 위해서 만든 웹페이지라서 문제들이 전반적으로 퀄이 좋을거라는 믿음이 있다. 그리고 풀어본 바에 따르면 실제로 조잡한 문제가 없는 점은 좋다. 예제가 없고, 내가 제출한 코드가 틀린 경우에 어느 부분에서 틀렸는지 맞은 부분이 있기는 한건지 알려주지를 않아서 디버깅이 조금 귀찮긴 하지만..

우선 3번문제 해설부터 보자. 3번문제는 기본 스택문제라고 봐도 무방하다. 2차원 배열의 어느 부분에서 장애물을 찾으면 그거랑 연결되어진 부분들을 다 찾아서 하나의 장애물로 인식을 하면 된다. 아주 기본 스택문제와 조금 다른 점은 여기에서는 장애물의 전체 갯수와 더불어 각 장애물의 크기를 반환하라고 했다는 점이다. 그거야 뭐.. 사이에 적당한 변수를 넣어서 스택에서 하나하나 꺼낼때마다 1을 더해주면 되는 부분이다. 크게 어렵지 않은 문제이다. 사실 내가 생각했을때에는 2번이랑 그렇게 다른 방식의 풀이가 필요한 문제가 아닌데 왜 2번은 어렵고 3번은 쉬운지 의문이긴하다. 실제로도 나도 2번은 아직 못 푼 상태이니까. 그래도 이 문제는 한번만에 통과해서 기분이 좋다. 아주 기본적인 스택문제라고 볼 수 있다.

다음 4번 문제. 4번 문제는 1~8까지의 숫자들이 임의의 순서로 입력되어지는데 그게 1 2 3 4 5 6 7 8 이렇게 순서대로 입력이 되면. Ascending으로 반환하고, 8부터 1까지 순서라면 descending으로 그리고 그 외의 경우는 mixed로반환을 하면 되는 문제다. 딱 들어도 예외처리를 해야하기는 커녕 2개의 경우 외에는 모두 mixed로 반환하면 되는, 뭐랄까.. 다소 극단적인 문제라서 정말 아무 생각없이 코드를 짜고 싶으면 그냥 1부터 8까지 그리고 그 역순으로 된 리스트를 미리 만든 다음 인풋이 그거랑 같은지 확인하는 형식으로 코드를 짜도 되긴 한다. 다만 나는 문제 자체가 엄청나게 단순한만큼 그런식으로 코드를 짜고 싶진 않았다. 그래서 나는 처음부터 끝까지 입력값을 확인하면서 그 다음 값이 더 크면(ascending 시) True, 그렇지 않으면 False가 입력된 리스트를 만들어서 전부 true인 경우 ascending을 반환하고 하나라도 false가 있으면 mixed를 반환하는 형식으로 코드를 짜봤다. 물론 길이가 짧아서 시간이나 공간적인 면에서 깔끔하게 짠다고 해서 이점이 있는건 아니지만 개인적으로는 sort나 for문 보다는 all any같은 bool을 활용하는게 더 깔끔하게 코드를 짤 수 있는 방법인 것 같아서 앞으로도 가능하다면 이런 방식으로 코드를 짜볼려고 할 것 같다.

3번문제랑 4번문제 둘다 별 두개짜리라서 풀기가 어렵지 않을거라고 생각했긴 하다. 실제로도 꽤 쉽게 풀리는 문제들이고 이런 문제들에서는 오히려 어떻게 해야 코드를 더 깔끔하게 짧게 더 일반적이게 짤 수 있는지 고민해봐야 하는 것 같다. 두 문제 다 실행시간, 소요 메모리는 깃허브에 써놨으니 궁금하면 확인고고!

728x90