코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/SWEA

[SWEA] 1952번 : 수영장

2023. 11. 16. 11:48

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpFQaAQMDFAUq&categoryId=AV5PpFQaAQMDFAUq&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제

 

입력

 

출력

 

 


소스코드

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

class Solution {
    static int arr[], price[];
    static ArrayList<Integer> isMonth;
    static int result;

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

        int t = Integer.parseInt(br.readLine());
        for (int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine());
            price = new int[4];
            price[0] = Integer.parseInt(st.nextToken());
            price[1] = Integer.parseInt(st.nextToken());
            price[2] = Integer.parseInt(st.nextToken());
            price[3] = Integer.parseInt(st.nextToken());

            st = new StringTokenizer(br.readLine());
            arr = new int[13];
            isMonth = new ArrayList<>();
            for (int j = 1; j <= 12; j++) {
                arr[j] = Integer.parseInt(st.nextToken());
                if (arr[j] != 0) {
                    isMonth.add(j);
                }
            }
            result = price[3];
            dfs(0, 0);
            sb.append("#" + (i + 1) + " " + result + "\n");
        }
        System.out.println(sb);
    }

    static void dfs(int idx, int sum) {
        if (idx >= isMonth.size()) {
            if (result > sum) result = sum;
            return;
        }

        for (int i = 0; i < 3; i++) {
            if (i == 0) { // 1일
                dfs(idx + 1, sum + (price[i] * arr[isMonth.get(idx)]));
            } else if (i == 1) { // 1달
                dfs(idx + 1, sum + price[i]);
            } else if (i == 2) { // 3달
                dfs(idx + 3, sum + price[i]);
            }
        }
    }
}

 

해결 방법

  1. 달마다 이용계획, 이용권 요금, 이용계획이 있는 달을 각각 배열에 저장한다.
  2. DFS 탐색을 진행한다. 이용계획이 있는 달을 1일, 1달, 3달 이용하는 경우를 모두 확인한다.
  3. 이용계획이 있는 달의 범위를 초과하는 경우 result와 현재 가격을 비교한다.

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

[SWEA] 2382번 : 미생물 격리  (1) 2024.01.28
[SWEA] 1284번 : 수도 요금 경쟁  (1) 2023.11.16
[SWEA] 7272번 : 안경이 없어!  (0) 2023.11.10
[SWEA] 2105번 : 디저트 카페  (0) 2023.11.09
[SWEA] 1953번 : 탈주범 검거  (0) 2023.11.08
    '알고리즘/SWEA' 카테고리의 다른 글
    • [SWEA] 2382번 : 미생물 격리
    • [SWEA] 1284번 : 수도 요금 경쟁
    • [SWEA] 7272번 : 안경이 없어!
    • [SWEA] 2105번 : 디저트 카페
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바