강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

송유진님의 프로필 이미지
송유진

작성한 질문수

2026 코딩테스트 올인원 [JAVA]

[문제풀이] 홍팀청팀

part5. 청팀홍팀 풀이 질문 드립니다.

작성

·

17

·

수정됨

0

안녕하세요! 남노씨님 덕분에 강의 잘 들으며 학습중입니다. part5.청팀홍팀 풀이로 보여주신 것에서 질문이 있습니다.


문제의 Input 예시 이해가 잘 되지 않았습니다.
제가 혼자 생각했을 때는, 주어진 friends[][] 배열을 인접리스트로 만들어야한다고 생각했고, 서로는 쌍방이니 양방향 그래프. 양방향 값을 인접리스트에 넣어주어야 한다고 생각했습니다. 근데 input 예시를 보니, 예시1은 서로 양방향 없이 구성되어있고, 예시2는 인접리스트처럼 서로 양방향으로 구성되어있습니다. 이상황에서 인접리스트를 구성하려니 예시2로는 중복이 발생하더라구요.


1. 예시 1,2 기준이 달라보이는데 어떻게 해석해야 좋을까요?

2. 양방향 그래프=무방향 그래프 같다고 볼 수 있나요? 이 문제의 경우 어떤 그래프인지, 구현의 차이점이 있는지 궁금합니다.

3. 풀이에서는 인접리스트를 별도로 안만들고, 받은 배열 자체를 인접리스트인것처럼 바로 사용하였는데, 이전 풀이와 비교해서 왜 이렇게 사용하였는지 궁금합니다. (문제에서 캐치할 수 있는 차이점이 뭘지)


4. dfs/bfs에서 사용하는 자료구조(큐,재귀/스택)는 풀이에 사용하지 않으셨는데 문제 상 필요 없는건지, 이분그래프일 때 사용 안해도 되는지 궁금합니다. (일단 bfs 큐 사용한 구조 만들고 시작했는데 이렇게 접근하면 안되는걸까요?ㅠㅠ)

이해 도와주시면 감사하겠습니다 :)

답변 2

1

개발남노씨님의 프로필 이미지
개발남노씨
지식공유자

안녕하세요 유진님. 답변드리겠습니다.

1. 와 맞네요.. 이건 제가 실수한게 맞습니다. 결론만 말씀드리면 예시 2가 문제에서 제시한 대칭적(양방향)규칙을 따른거고, 예시 1은 [[1, 2], [0, 2], [0, 1]] (보충설명하자면 [0: [1, 2], 1: [0, 2], 2: [0, 1]]) 이렇게 변경되어야 되겠네요. 짚어주셔서 감사합니다.

2. 양방향그래프 == 무방향그래프 같다고 보시면 됩니다. 이 문제는 양방향(무방향)그래프를 노리고만든 문제입니다.

3. 입력값이 어떤 형태인지 이해를 해야되는데, 문제에서 보면
friends[i]는 i번째 학생과 친구인 학생들의 번호를 나타냈다고 했잖아요. 이게 즉 i번째 인덱스에는 i번 노드랑 연결되어있는 노드들을 나열해놓겠다 == 인접리스트에 대한 설명.

그래서 friends는 그 자체로 인접리스트가 됩니다.
이전 문제는 보통 간선리스트 형태의 입력값이였을 겁니다. 간선리스트는 문제에서 이렇게 표현될거에요.
"친구 관계를 나타내는 m개의 간선 정보가 주어집니다."

인접리스트일때는
예시 2번 friends = [[1, 2], [0, 3], [0], [1]]

간선리스트라면?
n = 4 (학생 수)
edges = [[0, 1], [0, 2], [1, 3]]

4. 강의영상에서 dfs(재귀)를 사용한 풀이를 보여드렸는데, BFS(queue 사용한 구조)를 사용하셔도 됩니다. 잘 하신겁니다. 한번 작성해서 답글에 남겨서 저도 보여주시겠어요?


이해에 도움이 되었을까요!? 궁금한거 있으면 편하게 질문 주세요~!

0

송유진님의 프로필 이미지
송유진
질문자

빠른 답변 감사합니다 덕분에 이해 되었어요!

아래는 dfs로 구현한 코드입니다. ide에서 테스트 케이스 결과는 맞게 나오는데 문제사이트에서 돌리니 시간초과가 나더라구요. 혹시 원인을 확인해주실 수 있을까요?🥲

public boolean solution(int[][] friends) {
    int[] visited = new int[friends.length];
    Arrays.fill(visited, -1);

    for(int i=0; i<friends.length; i++) {
        if(visited[i] == -1) {
            if(!bfsFail2(i,friends,visited)) {
                return false;
            }
        }
    }

    return true;
}

    public boolean bfs(int start, int[][] friends, int[] visited) {
        Queue<Integer> q = new ArrayDeque<>();
        q.offer(start);
        visited[start] = 1;

        while(!q.isEmpty()) {
            int cur = q.poll();

            for(int nxt : friends[cur]) {
                int nxtTeam = visited[cur] == 0 ? 1 : 0; // nxt의 팀 배정
                if(visited[nxt] < 0) { // 아직 미방문
                    q.offer(nxt);
                    visited[nxt] = nxtTeam;
                }else if(visited[nxt] != nxtTeam) { // 이미 방문했는데 팀 배정 불일치 (false)
                    return false;
                }
            }
        }
        return true;
    }
개발남노씨님의 프로필 이미지
개발남노씨
지식공유자

CleanShot 2026-01-12 at 01.03.55@2x.png

nxtTeam의 색 배정을 for문 밖에 해도 될거같은데요? 한번만 실행되게!

이거 수정해보실래요

송유진님의 프로필 이미지
송유진

작성한 질문수

질문하기