Problem Solving

톱니바퀴를 회전시킬 때는 방향과 회전시킬 톱니바퀴를 선택한다. 톱니바퀴와 맞닿은 다른 톱니바퀴의 극이 서로 다르다면 → 맞닿은 톱니바퀴는 해당 톱니바퀴의 반대방향으로 회전 모든 회전이 끝나면 12시방향이 S극이면 + 2^(N - 1) 점 3번 톱니바퀴는 맞닿아있는 4번 톱니바퀴와 극이 다르다. 1회전 시 3번 톱니바퀴는 반시계, 4번 톱니바퀴가 시계방향으로 움직인다. 이제 1번 바퀴를 시계 방향으로 움직인다. 2번 바퀴와 극이 다르므로 2번은 반시계방향으로 움직인다. 1,2,3번 바퀴가 12시방향에 S극이다. 따라서, 1 + 2 + 4 = 7점 K가 100으로 매우 작음 오른쪽 바퀴 회전 여부 → 현재 바퀴[2]와 다음 바퀴[6]이 서로 다른지 확인 왼쪽 바퀴 회전 여부 → 현재 바퀴[6]과 다음 바퀴[..
알아야 할 것 비트연산자 - 다른 프로그래밍 언어에서 사용하는 방식과 같다. - 추가적으로 `b'10001'` 과 같이 `b`를 붙여 2진수 형태의 문자열을 비트연산할 수 있다. - `b'1001' & b'001' = 1`CASE WHEN 문법 `if - else if - else`방식으로 사용할 수도, `switch - case`방식으로 작성할 수도 있다.if - else if - else방식 CASE WHEN (조건1) THEN (조건에 맞을 경우 대입할 값1) WHEN (조건2) THEN (조건에 맞을 경우 대입할 값2) ELSE (위 조건 모두에 해당하지 않을 경우 대입할 값3) END 기본 적으로 위와 같이 사용한다. 조건에는 서브 쿼리가 올 수도 있다..
코딩테스트 연습 - 전화번호 목록 이 문제는 길이에 따라 정렬한 뒤, 그 길이보다 짧은 번호들을 모두 확인해보는 것이 핵심이다. 나는 Set[]을 사용했는데, Set의 contains를 사용할 경우 O(1)의 시간으로 찾을 수 있기 때문이다. 따라서, 길이를 len이라고 뒀을 때, O(len)의 시간으로 해당 전화번호의 접두사가 있는지 확인할 수 있다. 정렬을 하는 이유는 길이가 긴 번호가 앞에 올 수 있는데, 이 때는 나중에 짧은 번호가 들어왔을 때 다른 번호의 접두사인지 확인할 수 없기 때문이다. 따라서, 반드시 정렬을 먼저해 접두사로 사용될 번호들을 저장해두고 확인해야 한다. 해당 전화번호에 접두사가 있는지 확인하는 로직은 아래와 같다. for(String number : phone_book){ i..
13913번: 숨바꼭질 4 처음에는 Move 클래스 안에 StringBuilder나 StringBuffer를 넣어서 이전의 경로를 복사해서 최종 경로를 찍도록 했는데 시간 초과가 났다. 아무래도 복사 비용과 새 인스턴스 생성하는 비용이 커서 그런 것 같다. 그래서 예전에 봤던 방법을 사용했는데 prev 배열에 직전 경로를 저장하는 방법이다. prev[a] = b 는 a로 가기위해서는 b를 거친다는 의미이다. 이후 아래와 같이 마지막 K부터 시작점 N까지의 경로를 추적해서 출력하면 된다. int index = K; while(index != N){ index = prev[index]; } 방문 처리 위치에 따라 직전 경로가 갱신이 될 수 있기 때문에 방문 처리 위치도 중요하다. static void BFS..
greatwhite
'Problem Solving' 카테고리의 글 목록 (4 Page)