[algorithm] 카드 섞이, 수식 연산, 비트연산, ( ) < > 괄호 문제

markyang92·2021년 8월 4일
0

algorithm

목록 보기
7/13

카드 섞이

  • (start_idx + Move) % N = 최종_배열_idx

수식 연산

  • 쌍이되는 연산

X + Y = X | Y 검출기

  • X가 주어 질 때, X+Y = X|Y가 되는 수식의 y 를 찾기
    • X ^ 1111 나온 결과 값에서, 0인 부분은 무조건 0을 'y'의 비트에 넣어야한다.
    • X ^ 1111 나온 결과 값에서, 1인 부분은 Don't Care로 'y'의 비트에 넣을 수 있다.
    • 오른쪽 부터 채우면 y의 값을 오름차순으로 구할 수 있다.

괄호 ( ) 문제

  • ((((( ))().. 가 나오는 괄호 문제는 대표적으로 stack으로 푸는 것이다.
    하지만, 쉽게만 나오긴 힘들고 가령 틀린 (()()()( 괄호문을 최소한의 변경으로 바꾸어라 문제

  • Balance Check
  • stack: <list>로 받았다 가정한다.
    • Precheck
    1. stack[0]( 이어야한다.
    2. stack[-1]) 이어야한다.
  • 여기서 이제 순차적으로 탐색한다.
  1. 순차탐색
bal=0
for i in range(0,len(stack)):
    if stack[i] == '(':
        bal+=1
    elif stack[i] == ')':
        bal-=1

순차 탐색 중 bal<0이 된다는 것은 (가 앞에 없는데 )가 먼저 있는 것이므로 '바꾸어줘야하는 상황'이다.
따라서 순차 탐색 중 bal<0이되면 (로 바꾸자!!!

bal=0
for i in range(0,len(stack)):
    if stack[i] == '(':
        bal+=1
    elif stack[i] == ')':
        bal-=1
    if bal < 0:
        stack[i]='(' # 강제로 ) -> ( 로 바꾼다.
        bal=1	     # ( 로 바꿨으니 밸런스는 1이된다.

  1. 순차탐색 후, 체크
  • 결국 순차탐색 후 bal=0이면 완벽하게 정렬되었다.
    • 하지만, bal>0 인 경우는 ((((같이 ( 괄호가 더 많이 남아 있고 종료되었다는 것이다.
    • 간단히 bal/2 만 조정하면 (())bal=0으로 완성된다.

괄호가 섞인 이진트리

  • 조직도는 보스<부하1><부하2> 형태로 보스의 부하는 최대 두 명이 될 수 있고 부하가 있는 경우 <부하<부하의부하1><부하의부하2>>안에 적혀있다. 부하가 없는 경우는 <>으로 표현된다.

예를 들어, 0<1<3<><>><4<7<><>><>>><2<5<><8<><>>><6<><>>> 로 되어 있는 조직도를 분석하면 아래와 같은 형태가 된다


  • 괄호와 이진트리를 섞은 문제다.
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글