[코드트리 조별과제] 특정 조건에 맞게 k개 중에 1개를 n번 뽑기 (백트레킹, 자바)

2024. 7. 28. 23:26·알고리즘

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

문제

1이상 K이하의 숫자를 하나 고르는 행위를 N번 반복하여 나올 수 있는 모든 서로 다른 순서쌍을 구해주는 프로그램을 작성해보세요. 단, 연속하여 같은 숫자가 3번 이상 나오는 경우는 제외합니다.

예를 들어 K이 2, N이 3인 경우 다음과 같이 6개의 조합이 가능합니다.

1 1 2

1 2 1

1 2 2

2 1 1

2 1 2

2 2 1

입력 형식

첫째 줄에 K와 N이 공백을 사이에 두고 주어집니다.

1≤K≤4

1≤N≤8

출력 형식

조건을 만족하는 서로 다른 순서쌍의 개수 만큼의 줄에 걸쳐 한 줄에 하나씩 순서쌍의 상태를 공백을 사이에 두고 출력합니다. 이때 앞에서 부터 봤을 때 사전순으로 앞선 순서쌍부터 출력합니다.

풀이

백트레킹으로 수의 조합을 구하는데 조건메 맞게(여기서는 하나의 숫자가 연속 3번 이상 나오지 않도록) 조건 처리를 해주면된다. 3번 이상 연속되었는지 확인하기 위해 필요한 변수 num(앞에 온 숫자) 와 count(연속 개수)를 재귀함수의 파라미터로 설정하여 문제를 풀었다.

JAVA 코드

import java.io.*;
import java.util.*;

public class Main {

    static int K, N, arr[];
    static StringBuilder sb = new StringBuilder(); 

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        StringTokenizer st = new StringTokenizer(br.readLine()); 

        K = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken()); 

        arr = new int[N]; 
        solve(0, 0, 0);

        System.out.println(sb); 
    }

    static void solve(int cnt, int num, int count){
        if(cnt >= N){
            for(int i=0; i<N; i++){
                sb.append(arr[i]).append(" "); 
            }
            sb.append("\n"); 
            return; 
        }

        for(int i=1; i<=K; i++){
            if(num == i){
                if((count+1) >= 3) continue; 
                arr[cnt] = i; 
                solve(cnt+1, num, count+1);
            }else{
                arr[cnt] = i; 
                solve(cnt+1, i, 1); 
            }
        }
    }


}
저작자표시 비영리 변경금지

'알고리즘' 카테고리의 다른 글

[BOJ1068] 트리  (1) 2024.11.16
[코드트리 조별과제] 부분 수열의 합이 K (누적합)  (1) 2024.08.20
[코드트리 조별과제] 두 수의 합 (HashMap)  (0) 2024.08.18
[코드트리 조별과제] 알바로 부자 되기  (0) 2024.08.11
[코드트리 조별과제] 사각형 채우기 2  (0) 2024.08.04
'알고리즘' 카테고리의 다른 글
  • [코드트리 조별과제] 부분 수열의 합이 K (누적합)
  • [코드트리 조별과제] 두 수의 합 (HashMap)
  • [코드트리 조별과제] 알바로 부자 되기
  • [코드트리 조별과제] 사각형 채우기 2
l'avenirJun
l'avenirJun
  • l'avenirJun
    오늘도 꾸준히 개발
    l'avenirJun
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 📚 개발자의 서재 N
        • 객체지향의 사실과 오해
        • Good Code, Bad Code
        • 도메인 주도 개발 시작하기 N
      • 🔧 트러블 슈팅
      • Java
      • Spring
      • 운영체제
        • 공룡책 학습
      • 알고리즘
      • GIT
      • 면접 지식
      • Spring 단기심화 2기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    타입
    유스케이스
    표현 영역
    good code bad code
    협력
    리포지터리
    도메인 모델
    DIP
    코드트리
    specification
    객체
    매핑 구현
    애그리거트 루트
    애그리거트
    가독성
    코딩테스트
    역할
    책임
    메시지
    오블완
    객체지향의 사실과 오해
    책임-주도 설계
    추상화
    도메인 주도 개발 시작하기
    인터페이스
    티스토리챌린지
    모듈화
    코드 계약
    캡슐화
    코딩트리조별과제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
l'avenirJun
[코드트리 조별과제] 특정 조건에 맞게 k개 중에 1개를 n번 뽑기 (백트레킹, 자바)
상단으로

티스토리툴바