[코테] 프로그래머스 레벨0 - 코드리뷰

김재연·2023년 6월 27일
0
post-thumbnail

프로그래머스 코테 입문 레벨0 인상깊었던 문제 & 코드 리뷰

0. 소인수분해하기

2부터 n이랑 나누는데 나머지가 0이면 소인수 O, 0이 아니면 1씩 늘리고 n으로 나눌때까지 반복

d = 2
while d <= n:
	if n % d == 0:
		answer.append(d) # 이때 d가 소인수
		n = n // d
	else:
		d += 1

1. 등수 매기기

내 코드

🌊flow🌊

  1. 점수들의 합을 기존 순서를 유지한 것(a)과 내림차순으로 정렬한 것(b) 2개를 만든다.
  2. 기존 순서를 따라 앞에서부터 등수를 찾는다. 즉, 기존 순서인 a의 순서대로 b에는 a의 원소 i가 어디에 위치해있는지 인덱스를 찾는다.

🗝️Point🗝️

  • 내림차순으로 정렬한 후에 (인덱스+1)를 등수로 활용하기
    ex) [100, 90, 80] 이면 0번째 원소 100점이 1등, 2번째 원소 80점이 3등
  • index()는 가장 앞에 있는 값만 보내주기 때문에 같은 점수에 대해 공동순위 매기기가 가능하다.
    ex) [100, 90, 90, 80] 이면 0번째 원소 100점이 1등, 2번째 원소 90점이 2등, 3번째 원소 90점도 2등(index(90)은 2번째 90점만 찾음)

✏️memo✏️

a의 순서대로 b에서 찾는거, 공동순위 매기기가 엄청나게 헷갈렸다. 느낀점은 최대한 구현이 편하도록 제한사항을 둬주는 느낌 (원래 2,3등 기록이 똑같으면 둘다 동메달을 주는건데 여기서는 은메달을 주는 것처럼) 그러니까 제한사항도 꼼꼼히 따져봐야겠다.


2. 저주의 숫자3

내 코드

🌊flow🌊

  1. n번만큼 숫자를 1씩 늘리는 과정을 반복할 것이다.
  2. 늘린 숫자가 3의 배수이거나 3이 들어간 숫자라면 3의 배수도 아니고 3이 안들어간 숫자가 될때까지 더 늘린다.

🗝️Point🗝️

  • 숫자 n을 <0부터 1씩 n번 늘려간다>라고 생각한다.
  • 일반적으로는 한번에 1씩 늘리지만, 거지같은 3x 마을에서는 제한조건에 걸리면 한번에 1보다 더 크게 늘리는 것이다.

✏️memo✏️

진짜 이거 규칙을 못찾아서 진짜 별.. 하....... 내가 너네한테 저주 더 내릴거다
아무튼 40이라고 했을때 이걸 <0부터 1씩 40번 늘린 숫자>라는 논리가 정말 죽어도 생각이 안나더라... 숫자에 대한 새로운 접근방법을 안거에 의의를 두자...


3. 특이한 정렬

원래 코드

다른사람 코드 보고 고친 코드

🌊flow🌊

  1. n과의 거리차이로 먼저 정렬하고, n과의 거리차이가 같다면 큰수부터 정렬한다.

🗝️Point🗝️

  • sorted()key를 통하여 정렬할 기준을 정할 수 있다.
    기본값은 오름차순이기 때문에 내림차순으로 하려면 -를 붙이면 된다.
    ex) sorted(array, key = lambda x: f(x)) 라면, lambdax에는 정렬할 배열인 array의 "원소 하나"가 들어간다고 생각하면 되겠다. array의 원소 x를 함수 f(x) 에 넣어 나온 결과값을 기준으로 정렬한다는 뜻이다.

  • 튜플을 사용해서 key에 정렬에 고려할 조건을 여러개 넣을 수도 있다.
    ex) sorted(array, key = lambda x: (f(x), g(x))) 라면, 일단 f(x)를 기준으로 정렬한 다음에, 값이 같은 원소가 있으면 얘네는 g(x)를 기준으로 정렬한다는 뜻이다.

✏️memo✏️

sorted()에 이런 좋은 기능이 있는 줄 알았으면 저런 헛짓거리는 안했을텐데... 정말 알아야 푸는구나. 몰라서 못풀었던 문제


4. 안전지대

쪽팔려서 진짜 내 코드는 세상에서 날려버렸고 다른 사람 코드 보고 고친 코드

🌊flow🌊

  1. 2차원배열인 board에서 지뢰의 좌표를 찾는다.
  2. 지뢰 좌표를 기준으로 위험지역인 좌표들을 계산한다. (지뢰좌표 포함)
  3. 위험지역들을 중복을 허용하지 않는 집합으로 모은다.
  4. 위험지역 좌표를 모은 집합에서 board의 범위를 벗어나지 않는 좌표들만 센다.
  5. 전체개수에서 4번에서 센 위험지역 개수를 뺀다.

🗝️Point🗝️

  • 좌표는 튜플을 사용하여 나타낸다.
  • 이차원배열은 인덱스를 벗어나면 에러가 나지만, 튜플은 전혀 상관이 없다는 점⭐ 이차원배열에서 접근할 수 없는 좌표도 튜플로는 나타낼 수 있다는게 간과하지 말아야 할 포인트

✏️memo✏️

학교 다닐때 이런 이차원배열 문제가 시험에 나온적이 있는거 같은데... 그때 이걸 알았으면 맞출 수 있었을텐데... 그때도 못풀고.. 지금도 못풀고...


5. 겹치는 선분의 길이

내 코드

🌊flow🌊

  1. 선분 [i, j]를 길이가 1인 선분 [i, i+1], [i+1, i+2], ..., [j-1, j]으로 쪼갠다.
  2. 쪼갠 선분들을 중복을 허용하는 리스트에 넣는다.
  3. 동일한 쪼갠 선분들을 중복을 허용하지 않는 집합에도 넣는다.
  4. 집합에 있는 쪼갠 선분들을 하나씩 돌면서 2번에서 생성한 리스트에 몇개 있는지를 세고, 2개 이상 있을 시에 선분이 겹친 것으로 판단하여 정답 개수에 1을 더한다.

🗝️Point🗝️

  • 주어진 '선분'에 집중하는게 아니라 '축'에 초점을 두어 몇개의 선분이 이 지점을 지나는지를 센다.
  • 나는 구간으로 문제를 풀었지만, 똑같은 논리로 점을 세서 문제를 풀 수도 있다.

✏️memo✏️

처음에는 선분에만 정신 팔려서 감도 못잡았는데 '집합'을 이용해서 푼다는 힌트를 보고 아! 해서 풀었다. 집합.. 집합 활용을 잘하자.

profile
일기장같은 공부기록📝

0개의 댓글