220807 답지 안 베끼길 잘했어

샨티(shanti)·2022년 8월 7일
0

TIL

목록 보기
64/145

하루를 마무리 하기 전, 오늘 있었던 일들을 잔잔히 되짚어봅니다.
성공과 실패의 모든 요소에서 '배울 점'을 찾아내어 기록하고,
더 성장하는 내일의 나를 위해 'action plan'을 세웁니다.

이게 얼마만의 모닝 TIL인지 모르겠다.
어제 좀 늦게 잤지만 그래도 패기있게 아침 7시에 일어나겠다고 알람을 맞춰놨는데
"이제는 일어날 시간이야~" 라고 깨우는 남편 덕에 8시 반에 겨우 겨우 추슬러 일어나고... 쩝.

그래도 잠은 깨야겠기에 목욕 싹 하고 바~로 컴터 들고 밖으로 나왔다.

사실 어제 밤에 마지막 강의에 탈탈 털리고 잔 터라
어떡하지 라는 걱정이 앞섰는데 그보다도 마음을 더 불편하게 했던 건 금요일에 풀어내지 못한 '프로그래머스 폰켓몬' 코딩도장.

꽤 열심히? 그래도 나름대로 '와 이거 될거같아!!!' 하고 시간을 들였는데
알고보니 문제 방향성을 완-전히 다르게 잡아 똥망하고.

다시 들여다보기 싫어 오늘까지 미루고 미뤄왔다.

오늘 아침엔 기필코 이 문제를 스스로 풀어보고 하루를 시작하리라 다짐했기에 컴퓨터 앞에 앉아 아래 4가지를 리마인드 하고 문제를 살폈다.

  1. 동료가 쉽댔다.
    주말 직전에 한참 스트레스를 받아하던 동료가 언듯 하는 얘기를 들었다. 폰켓몬 문제가 생각보다 쉽다고. 잘 생각해보면 그렇게 어려운 문제가 아니라고 하더라.
    물론 그는 코딩을 잘 하기에(ㅋㅋㅋ 내 기준) 씨알도 안맥히는 소리 한다며 웃었지만. 왠지 이번에는 그 동료의 말을 믿어보고 싶었다. 생각보다 쉽다는 말을 믿고 신뢰하고 문제를 향한 내 마음속의 허들을 낮추고자 노력했다.

  2. 지난 금요일과 같은 실수를 반복하지 않으리
    나는 이 문제를 보자마자 '순열'이라고 생각했다. 순서가 없는 뽑기 방식이었나...? 고딩때 3P2, 5C3 뭐 이런 따위의 것들을 배웠던 것 같은데 그걸 활용하는거라 생각하고 신나게 1시간 정도 풀었는데...알고보니 그걸 활용하는 문제가 아니었다.
    내 시간.. 내 1시간..
    오늘은 그 실수를 반복하지 않기 위해, 정말 문제를 푸는 중간 중간 다시 그 문제를 읽었다.
    굉장히 비효율적인 방법이기도 하다. 왜냐면 문제를 한번에 싹 정리하고 이해한 뒤에 풀기 시작하면 중간중간 흔들리는 일이 없지 않을까? 근데 왠지 모르게 나는 중간점검을 하지 않으면 자꾸 방향이 새는 것 같다는 느낌이 든다. 그래서 오늘 문제만큼은 꼭 중간점검을 하면서 이 방향성이 맞는지, 문제에서 요구하는 풀이가 맞는지를 계속 체크하며 풀었다.

  3. 주어진 시간 내에 안되면 걍 안되는거다.
    코딩도장 문제풀이 시간은 1시간이다. 1시간 내에 풀어보려고 갖은 노력을 하겠지만, 1시간이 넘어가면 과감히 버리기로 결정했다. 나에게는 너무나도 어려운 스프링이라는 강의가 쌓여있기 때문에!!

  4. 문제 앞에 써 있는 '해시', 'Greedy' 등의 방법론은 힌트일 뿐 얽매이지 말자
    이번 문제 앞에는 '해시'라는 카테고리가 붙어있었는데... 오마이갓~ 해시랑 아무리 좀 친해졌다 해도 이걸 활용할 자신은 없었다. 근데 지난번 노아님께 이 부분에 대해 물어보니 그건 힌트일 뿐 결국 우리가 아는 방법론으로 풀 수 있는 문제이니 너무 매이지 말라고 하셔서 오늘만큼은 그 방법에 매이지 않고 과감히 나의 방법(그게 비효율적인 방법이라 할지라도)과 논리로 문제를 풀어보리라 다짐했다.

위 4가지를 잊지 않기 위해 한번 더 상기시키며 문제를 풀기 시작..!


프로그래머스 폰켓몬 문제 풀이

결론적으로 나는 30분 정도의 시간을 들여 폰켓몬 문제를 해결했다.
내가 풀어낸 방식은 아래와 같다.

  1. 주석으로 경우의 수를 좀 써본다.

요즘 귀찮다는 이유로 주석을 활용하지 않으려고 하는 안좋은 습관이 생겼는데.. ㅠㅠ 모르면 주석으로 쓰고, 또는 노트로 써야 한다. 그래야 눈에 들어오지.
오늘은 카페에 급하게 나오느라 빈 종이를 가져오지 못해서 주석으로 문제의 조건이나 내가 기억해야 할 점을 적었다.

3종류의 폰켓몬이 총 4마리 있을 때 내가 뽑을 수 있는 폰켓몬의 수는 2마리(총 마리수 / 2)이고 이 2마리를 뽑는데 종류 가짓수의 max는 2

샘플 3가지를 위와 같이 정리했고, 내가 세운 다른 케이스를 추가해서 생각해보았다.
역시 머릿속으로만 생각하는 데에는 한계가 있어 메모장을 켜고 경우의 수 2가지 정도를 모두 세어보았다.

7종류의 폰켓몬 총 10마리 중에서 5마리를 선택하는 경우의 수를 구해야 한다면? 총 6개의 경우의 수가 나왔다.
이렇게 주석으로, 또 메모장으로 실제 적어보고 눈으로 확인해보니 문제 해결의 방법이 '순열'이라고 생각했던 내가 한심해지기 시작... 후.

자괴감이 몰려오기 전에 얼른 다음 과정으로 넘어갔다.


  1. 규칙 발견하기

사실 순서 없는 순열 갯수 구하기가 아니었단 사실에 현타가 와서 저 주석을 가만-히 들여다보는데 갑자기 머리를 한 대 맞은 것 같은 느낌이 들었다.
엥? 잠깐만. 이거 동료 말처럼 정말로 ... 생각보다 쉬운 문제인건가....?

의도한 건 아니었는데 주석을 보다보니 한가지 규칙이 눈에 들어왔다.

내가 뽑을 수 있는 폰켓몬의 총 마릿수가 2이고 종류는 3개일 때 답이 2,
내가 뽑을 수 있는 폰켓몬이 총 마릿수가 3이고 종류는 3개일 때 답이 3.

어?? 선택해야 할 폰켓몬 수가 종류 갯수보다 작을 때는 답이 마릿수가 되는건가...?

이게 눈에 들어오니 바로 확인을 해야 겠다는 생각에 인텔리제이를 켜고 if문을 써내려갔다.

// 총 폰켓몬 수 / 2 => 선택할 수 있는 폰켓몬의 총 마릿수(choiceNumber)
int choiceNumber = nums.length / 2;

// 폰켓몬이 들어있는 nums라는 array에서 중복값을 제거
int[] newArray = Arrays.stream(nums).distinct().toArray();

// 내가 뽑을 수 있는 폰켓몬 마릿수보다 폰켓몬의 종류갯수가 크거나 같다면? 마릿수가 정답!
if (choiceNumber <= newArray.length) {
      answer = choiceNumber;
    }

반대의 경우라면 답 역시 마릿수가 아닌 종류의 갯수일거라는 아이디어가 떠올랐지만
어쨌든 확인이 필요하니!! 내가 아까 적어둔 경우의 수를 가지고 확인하니.. 역시 맞았다.

// 데려갈 수 있는 폰켓몬의 총 마릿수보다 종류 갯수가 적다면? 종류 갯수가 정답!
 if (choiceNumber > newArray.length) {
      answer = newArray.length;
    }

와...
금요일 코딩도장 문제는 항상 난이도가 높아서 이번에도 한껏 쫄았는데
다행히 풀어내어 마음이 편해졌다 ㅠㅠㅠㅠ
물론 금요일까지 풀어야 한다는 기한은 넘겼지만, 그래도 이런 경험들이 쌓여야 자신감이 붙을거라고 꽤 오랫동안 생각만 해왔는데.
오늘 하루를 기분좋게 시작해서 정말정말 다행이고 또 행복하다.

나만의 제한사항을 걸어두고(동료 말을 신뢰하기, 1시간을 넘어가면 베끼기, 문제 방향성을 중간중간 확인하기) 문제를 풀어내어 더 뿌듯함이 컸다.
답지 안베끼길 정말 잘했다고 생각한 하루...

앞으로도 풀어내지 못할 코딩도장 문제가 산적하겠지만 (ㅎㅎ)
그럴 때마다 오늘과 같이 제한사항을 확실하게 걸어두고, 문제를 차근차근 풀어나가면 언젠가는 7개 중에 5개 이상은 맞추는 날이 오지 않을까? ㅎㅎㅎㅎ

화이팅. 오늘 스프링 강의 뽀개보자 제바알~!


제출한 답안과 소심한 정답화면 캡쳐는 아래에...

// 1. 총 개수 4, 종류 3, 2마리 뽑는데 맥스 종류 = 2
// 2. 총 개수 6, 종류 3, 3마리 뽑는 데 맥스 종류 = 3
// 3. 총 개수 6, 종류 2, 3마리 뽑는데 맥스 종류 = 2
// 가정. 3마리 뽑는데 종류가 5개면?

import java.util.Arrays;

public class Solution {
  public int solution(int[] nums) {
    int answer = 0;

    int choiceNumber = nums.length / 2;

    int[] newArray = Arrays.stream(nums).distinct().toArray();

    if (choiceNumber <= newArray.length) {
      answer = choiceNumber;
    }

    if (choiceNumber > newArray.length) {
      answer = newArray.length;
    }

    return answer;
  }
}

profile
가벼운 사진, 그렇지 못한 글

0개의 댓글