은세고화
뚜렷한 기억보단 흐릿한 잉크를
은세고화
전체 방문자
오늘
어제
  • 분류 전체보기 (95)
    • TDD (2)
      • 학점 산출 프로그램 (2)
    • IT (43)
      • 부스트코스 (18)
      • CS50 (3)
      • 도서추천 알고리즘 (2)
      • 스터디 일정 (3)
      • 스프링 (3)
      • 프로젝트 개발 중 발생한 에러 (8)
      • 웹개발 (3)
      • DB (3)
    • 독서 후기 (12)
      • 도서 (12)
    • e북 (3)
    • 알고리즘 (26)
    • 프로젝트 (6)
      • 향수 (6)
    • 회고 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
은세고화

뚜렷한 기억보단 흐릿한 잉크를

알고리즘

[프로그래머스] 혼자 놀기의 달인 자바

2022. 10. 13. 00:26
반응형

 

https://school.programmers.co.kr/learn/courses/30/lessons/131130?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

접근 방법

처음에 cards안에 card를 기준으로 방문체크를 하면서 dfs를 순회했는데 테케5번에서 에러가 낫다.

코드를 자세히 보니 dfs로 들어갈 때 현재 내 배열이 아니라 다음 배열에 true표시를 하는 것 같았고 card로 순회하지 않고 배열 인덱스를 기준으로 순회하니 해결됐다.

 

틀렸던 코드

package programmers.level2;

import java.util.ArrayList;
import java.util.Collections;

public class 혼자놀기의달인 {
    static boolean[] visited;
    static ArrayList<Integer> list = new ArrayList<>();
    public static void main(String[] args) {
        int[] cards = {2,1,4,3,7,5,6};
        System.out.println(solution(cards));
    }

    public static int solution(int[] cards) {
        visited = new boolean[101];
        for (int i = 0; i < cards.length; i++) {
            if(visited[cards[i]]) continue;
            dfs(cards, cards[i]-1, 0);
        }
        if (list.size() == 1) return 0;
        Collections.sort(list, Collections.reverseOrder());
        return list.get(0) * list.get(1);
    }

    private static void dfs(int[] cards, int card, int count) {
        if (visited[card]) {
            list.add(count);
            return;
        }
        visited[card] = true;
        dfs(cards, cards[card]-1, count+1);
    }
}

 

정답 코드

package programmers.level2;

import java.util.ArrayList;
import java.util.Collections;

public class 혼자놀기의달인 {
    static boolean[] visited;
    static ArrayList<Integer> list = new ArrayList<>();
    public static void main(String[] args) {
        int[] cards = {2,1,4,3,7,5,6};
        System.out.println(solution(cards));
    }

    public static int solution(int[] cards) {
        visited = new boolean[cards.length];
        for (int i = 0; i < cards.length; i++) {
            if(visited[i]) continue;
            dfs(cards, i, 0);
        }
        if (list.size() == 1) return 0;
        Collections.sort(list, Collections.reverseOrder());
        return list.get(0) * list.get(1);
    }

    private static void dfs(int[] cards, int index, int count) {
        if (visited[index]) {
            list.add(count);
            return;
        }
        visited[index] = true;
        dfs(cards, cards[index]-1, count+1);
    }
}

 

 

**추가

첫 코드가 틀린 이유는

        for (int i = 0; i < cards.length; i++) {
            if(visited[cards[i]]) continue;
            dfs(cards, cards[i]-1, 0);
        }

여기서 방문체크를 할 때 cards[i]에 -1을 빼주지 않아서 발생한 에러였다

반응형
저작자표시 (새창열림)

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

[JAVA 자바] 프로그래머스 과제 진행하기  (2) 2023.06.09
[JAVA 자바] 백준 2179  (1) 2023.05.25
여행경로 자바  (0) 2022.09.06
백준 1003 피보나치 함수 자바  (1) 2022.03.22
백준 14889 자바 스타트와 링크  (1) 2022.03.22
    '알고리즘' 카테고리의 다른 글
    • [JAVA 자바] 프로그래머스 과제 진행하기
    • [JAVA 자바] 백준 2179
    • 여행경로 자바
    • 백준 1003 피보나치 함수 자바
    은세고화
    은세고화

    티스토리툴바