[TIL_2024.04.09.] 12번째 기록

Daily-Log·2024년 4월 9일
0

회고

목록 보기
13/26
post-thumbnail

오늘 SSAFY 공지 채널에 아래의 글이 올라왔다.

참여해보고 싶은데 마감일이 이번달이다..
심지어 회사가 참여할 수 있는게 아닌가..?? 싶은데

오늘 일과를 마무리하고 다시 봐야겠음

💫 오늘의 목표

오늘은 15:20에 병원 예약이 있어서 조퇴 예정임
그 전까지 진도를 많이 빼놔야지




PS 2문제 이상 풀기

오늘도 기출문제 모음에서 풀어보려고 한다.

1) 주사위 고르기

아 계속 논리가 꼬인다..

아래 흐름처럼 정리는 했는데, 어느 부분을 같이 실행할 수 있고 못할지에 대해서 결정하는게 어려웠다.

분류방법결과값
주사위 선택조합A : 1,4
1, 4번 주사위 선택
숫자 얻기순열[1,2], [1,3], [1,4] ...
1번 주사위에서 숫자 1을,
4번 주사위에서 각 2,3,4 숫자를 뽑음
비교순열승 : 596, 무 : 196, 패 : 504
A에서 얻은 숫자들과 B에서 얻은 숫자들을 비교
승패결정단순계산승리한 수가 가장 많은 경우를 return

구현을 어떻게 해야할지 모르겠어서 다른 사람들의 접근법을 보았는데

조합 + 브루트포스 + 이진탐색을 활용하는 문제

라고 한다..?


왜 이진탐색을 해야할까

  • 주사위는 10개 이내
  • 주사위의 눈은 6개
  • 눈의 수는 100 이하

위 조건들을 가지고 대입해보자


메인로직 : A와 B가 주사위를 선택하고 숫자를 얻고 이를 각각 합하여 비교를 통해 결과를 합산한다.

분류방법결과값시간복잡도
주사위 선택조합A : 1,4
1, 4번 주사위 선택
O(10C5)
숫자 얻기순열[1,2], [1,3], [1,4] ...
1번 주사위에서 숫자 1을,
4번 주사위에서 각 2,3,4 숫자를 뽑음
O(6^5 * 6^5)
비교순열승 : 596, 무 : 196, 패 : 504
A에서 얻은 숫자들과 B에서 얻은 숫자들을 비교
구했다는 전제로 O(1)
승패결정단순계산승리한 수가 가장 많은 경우를 returnO(1)

추가조건) A가 주사위를 고르면 나머지 주사위는 B것이 된다.

=> 10C5 x 6^5 x 6^5 = 15237476352 = 1.~ ×10^10

100억 이상이므로 불가능하다.


그러면 어느 경우에서 줄일 수 있을까

메인로직을 다시 가져와서 분해해보자.

메인로직 : A와 B가 주사위를 선택하고 숫자를 얻고 이를 각각 합하여 비교를 통해 결과를 합산한다.

1) 주사위를 선택하는 부분에서 줄일까?
모든 경우를 봐야 알 수 있으므로 줄일 수 없다.

2) 주사위를 얻은 뒤 각 눈을 얻는 경우에서 줄일까?
이 상황에선 가장 유력하지만..
그러면 모든 경우를 합산할 수 없다.


어디일까.. 줄일 수 있는 부분이..


합산하지 않아도 높은 확률임을 보일 수 있나?
아으.. 생각이 잘 안된다

2024 카카오 겨울 인턴십 코딩테스트 문제해설 을 결국 참고해서 아이디어를 얻기로 했다.

시간복잡도를 줄이기 위해 A와 B의 주사위를 한꺼번에 모두 시뮬레이션해 승패를 판단하는 대신, A와 B의 주사위를 따로 시뮬레이션하는 아이디어가 필요합니다.

따로 시뮬레이션 한다..?

아 그건가

시간복잡도 전략 #1

곱하기더하기로 바꿀 수 있어야한다.

이게 보통 전략인데
그러면 A를 굴려서(6^5) 모든 경우의 수를 저장하고, B도 굴려서(6^5) 모든 경우를 저장한다.

그리고?

...

아아아아 알 것 같다!
우선 A가 가질 수 있는 모든 조합의 합과 B가 가질 수 있는 모든 조합의 합을 가졌다고 생각해보자.

A : 1,1,1,2,3,4,5,6,7
B : 1,1,1,1,1,6,7,8,11

여기서 A만 이분탐색을 통해 이기는 경우를 저장하면 된다!

idx가 0~2일 때 A[idx]는 1이다.
B에 이분탐색을 해서 1보다 작은 경우를 찾으면 없으므로 0

idx가 3일 때 A[3]은 2이다.
B에 이분탐색을 해서 2보다 작은 경우를 찾으면 인덱스 4까지 이므로 5를 더한다

idx가 4일 때 A[4]은 3이다.
B에 이분탐색을 해서 3보다 작은 경우를 찾으면 인덱스 4까지 이므로 5를 더한다

이렇게 반복하면 모든 이기는 경우의 수를 구할 수 있음!


이걸 의도한 문제인지 확인하기 위해 다시 해설을 보니 맞았음!

그런데 꼭 이분탐색이 아니라 누적 합, 투 포인터 등의 기법으로도 가능하구나



[PCCP 기출문제] 1번 / 붕대 감기

로직은 다 맞는데 왜 하나가 틀렸을까

그렇게 한참 고민을 했는데

맞췄음..

틀렸던 이유는
연속 시간(conti)과 시전시간(t)로 비교해서 추가 회복량을 추가해야 했는데.. 변수를 잘못 넣었음



오늘의 코드 기록




profile
대충 뭐든 먹어요

0개의 댓글

관련 채용 정보