250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)
    • AI Life (0)
      • 생각 넓히기 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • Python
  • 프로그래머스
  • DP
  • Front-end
  • AI
  • 선형대수
  • 구현
  • ios
  • 파이썬
  • certificate
  • ADsP
  • 개발자
  • 백준
  • 카카오
  • 문제풀이
  • 브루트포스
  • data
  • uArm
  • 코딩테스트
  • 머신러닝
  • 자바
  • SpringMVC
  • JPA
  • BFS
  • 개발
  • JAVA8
  • BOJ
  • 알고리즘
  • java
  • swift

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim

Hello World!

[카카오] 단체사진찍기 (java)
CodingTest/Programmers

[카카오] 단체사진찍기 (java)

2022. 1. 16. 17:23
728x90
728x90

문제링크

https://programmers.co.kr/learn/courses/30/lessons/1835

 

코딩테스트 연습 - 단체사진 찍기

단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두

programmers.co.kr

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
 브루트포스 순열

카카오 프렌즈 캐릭터 8명이 원하는 순서대로 사진을 찍을 수 있는 횟수를 구하는 문제이다. 캐릭터가 순서대로 서는 경우의수는 8!이며 최대로 들어올 수 있는 조건이 100개이다. 따라서 최악의 경우 $O(8!*100)$의 시간이 걸리게 된다. 따라서, 브루트포스로 문제를 해결할 수 있다.

 

순열로 문제를 해결해주었다. 이름에 대한 정보를 미리 배열에 저장해두고 Map을 사용해서 이름과 그 캐릭터의 위치를 정수로 넣어주었다. 그리고, 조건들을 확인하여 넣을 수 있는지 체크하고 넣을 수 있다면 넣어주면 된다.

구현코드

package pgm_1835;

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int solution(int n, String[] data) {
        int answer = 0;

        char[] names = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
        int[] permutation = {1,2,3,4,5,6,7,8};
        Map<Character,Integer> position = new HashMap<>();
        do {
            switchPosition(names, permutation, position);
            if(checkCondition(n, data, position))
                answer++;
        }while (nextPermutation(permutation,8));

        return answer;
    }

    private boolean checkCondition(int n, String[] data, Map<Character, Integer> position) {
        int i;
        for(i = 0; i < n; i++){
            Integer positionA = position.get(data[i].charAt(0));
            Integer positionB = position.get(data[i].charAt(2));
            int dis = Math.abs(positionA - positionB);
            if(data[i].charAt(3) == '=' && dis-1 != data[i].charAt(4)-'0'){
                break;
            }
            else if(data[i].charAt(3) == '<' && dis-1 > data[i].charAt(4)-'0'-1){
                break;
            }
            else if(data[i].charAt(3) == '>' && dis-1 < data[i].charAt(4)-'0'+1){
                break;
            }
        }
        if(i != n){
            return false;
        }
        return true;
    }

    private void switchPosition(char[] names, int[] permutation, Map<Character, Integer> position) {
        for(int i = 0; i < names.length; i++){
            position.put(names[i], permutation[i]);
        }
    }

    private boolean nextPermutation(int[] numbers, int n){
        int prevIndex;
        int nextIndex = n-1;
        int changeIndex = -1;

        for(int i = n-2; i >= 0; i--){
            prevIndex = nextIndex;
            nextIndex = i;

            if(numbers[nextIndex] < numbers[prevIndex]){
                changeIndex = nextIndex;
                break;
            }
        }

        if(changeIndex == -1)
            return false;

        for(int i = n-1; i > changeIndex; i--){
            if(numbers[i] > numbers[changeIndex]){
                int temp = numbers[i];
                numbers[i] = numbers[changeIndex];
                numbers[changeIndex] = temp;
                break;
            }
        }
        while(++changeIndex < --n){
            int temp = numbers[n];
            numbers[n] = numbers[changeIndex];
            numbers[changeIndex] = temp;
        }
        return true;
    }
}

 

시간복잡도

조건의 개수가 n 캐릭터가 c개 있다면 시간 복잡도는 $O( n*C!)$이 된다.

잘못된 지식이나 궁금한 내용이 있을 경우 편하게 댓글 남겨주시면 감사하겠습니다 :)

 

728x90
728x90
저작자표시 비영리 (새창열림)

'CodingTest > Programmers' 카테고리의 다른 글

[카카오] k진수에서 소수 개수 구하기 (java)  (0) 2022.01.22
[카카오] 주차 요금 계산 (java)  (0) 2022.01.20
[카카오] 오픈채팅방 (java)  (0) 2022.01.15
[카카오] 신고 결과 받기 (java)  (0) 2022.01.15
[카카오] 카카오 프렌즈 컬러링북 (java)  (0) 2022.01.02
    'CodingTest/Programmers' 카테고리의 다른 글
    • [카카오] k진수에서 소수 개수 구하기 (java)
    • [카카오] 주차 요금 계산 (java)
    • [카카오] 오픈채팅방 (java)
    • [카카오] 신고 결과 받기 (java)
    JinSeopKim
    JinSeopKim
    기록📚

    티스토리툴바