10451번

2023. 2. 20. 09:22·CS 이론/알고리즘
728x90

https://www.acmicpc.net/problem/10451

 

10451번: 순열 사이클

1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러 가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 \(\begin{pmatrix} 1 & 2 &3&4&5&6&7&8 \\  3

www.acmicpc.net

이번 문제는 순열 사이클의 갯수를 찾는 문제였다. 그런데 이 문제는 11724번과 로직이 똑같았다.

BFS로 탐색을 진행하면서 탐색이 끝날때마다 카운트를 세면 되는 로직이었다.

 

가장 기본적인 BFS라고 생각할 수 있다.

그래서 오늘은 BFS에 대해서 간단하게 정리해보려고 한다.

 

BFS란 한국말로 너비우선탐색이다.

너비를 우선 탐색한다는게 무슨뜻인가? 말그대로 시작노드에서 그에 인접한 노드들을 탐색하고,

그 다음 인접 노드들을 탐색하면서 물방울이 물웅덩이에 떨어지면 퍼지는 것처럼 탐색하는 방법이라고 이미지를 생각하면 된다.

 

그래서 BFS는 DFS(깊이 우선 탐색)과 다르게 Queue를 사용한다.

 

Queue에 인접한 노드들을 넣고, 하나씩 꺼내면서 꺼낸 노드에 인접한 노드들을 확인하는 방식이다.

그래서 DFS와는 다르게 항상 최단거리, 최소값을 구할 수 있다.

 

하지만 이 문제에서는 값과는 상관없이 방문처리로 사이클을 찾고, 사이클을 찾은 횟수를 기록하는 문제이다.

 

그래서 정답코드는 아래와 같다.

package backjoon.b10451;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class b10451 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int step = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<step; i++){
            int N = Integer.parseInt(br.readLine());
            Graph g = new Graph(N);
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j=1; j<=N; j++){
                g.addEdge(j,Integer.parseInt(st.nextToken()));
            }
            int count = 0;
            for(int j=1; j<=N; j++){
                if(!g.visit[j]) {
                    g.bfs(j);
                    count++;
                }
            }
            sb.append(count).append("\n");
        }
        System.out.println(sb);
    }
}
class Graph{
    LinkedList<Integer>[] adj;
    boolean[] visit;

    Queue<Integer> queue;
    public Graph(int N) {
        adj = new LinkedList[N+1];
        visit = new boolean[N+1];
        for(int i=0; i<=N; i++){
            adj[i]=new LinkedList<>();
        }
        queue = new LinkedList<>();
    }

    public void addEdge(int u, int v){
        adj[u].add(v);
    }

    public void bfs(int R){
        queue.add(R);
        visit[R]=true;
        while (!queue.isEmpty()){
            int tmp = queue.poll();
            for(int i : adj[tmp]){
                if(visit[i])continue;
                queue.add(i);
                visit[i]=true;
            }
        }
    }
}
728x90

'CS 이론 > 알고리즘' 카테고리의 다른 글

24313번  (0) 2023.02.22
9466번(사이클 찾기)  (0) 2023.02.21
4963번  (0) 2023.02.18
10816번  (0) 2023.02.16
1021번  (1) 2023.02.15
'CS 이론/알고리즘' 카테고리의 다른 글
  • 24313번
  • 9466번(사이클 찾기)
  • 4963번
  • 10816번
Bello's
Bello's
개발하는 벨로
  • Bello's
    벨로의 개발일지
    Bello's
  • 전체
    오늘
    어제
    • 분류 전체보기 (199)
      • 노예 일지 (7)
        • 스타트업 노예일지 (3)
      • CS 이론 (81)
        • 학과 수업 (4)
        • 알고리즘 (64)
        • 시스템 프로그래밍 (3)
        • 데이터 통신 (1)
        • 운영체제 (2)
        • 데이터베이스 (1)
      • project (3)
      • 나는 감자다. (4)
      • Spring (27)
      • 모각코 (45)
        • 절개와지조(모각코) (7)
        • 어쩌다보니 박준태가 조장이조 (11)
        • 어쩌다보니 박준태가 또 조장이조 (12)
      • LikeLion🦁 (20)
      • 캘리포니아 감자 (4)
      • OpenSource Contribute (1)
      • 우아한테크벨로 (1)
        • 프리코스 회고록 (6)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    자바
    백준
    타임리프
    회고록
    모각코
    8기
    어렵다
    감자
    Spring
    뛰슈
    DFS
    BFS
    절개와지조
    티스토리챌린지
    오블완
    프리코스
    그래프 순회
    누적합
    나는 감자
    JPA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Bello's
10451번
상단으로

티스토리툴바