코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (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 정상우.
코딍코딍

코딩기록

1449번 : 수리공 항승
알고리즘/백준

1449번 : 수리공 항승

2022. 6. 29. 01:13

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

 

1449번: 수리공 항승

첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나

www.acmicpc.net

 

 

문제

 

 

코드

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int l = sc.nextInt(); sc.nextLine();
        int arr[] = new int[n];
        
        for(int i=0;i<n;i++)
            arr[i] = sc.nextInt();
        Arrays.sort(arr);
        
        int sum=0;
        for(int i=0;i<n;i++) {
            int len=0;
            for(int j=i;;j++) {
                if(j==n-1) {
                    sum++;
                    i=j; break;
                }
                if(len+(arr[j+1]-arr[j]+1)<=l)
                    len+=arr[j+1]-arr[j];
                else {
                    sum++;
                    i=j; break;
                }
            }
        }
        System.out.println(sum);
    }
}

 

 

해결방법

물이 새는 곳의 위치 받아서 오름차순으로 정렬한 후에, 반복문을 사용해 "1개의 테이프로 붙일 수 있는 범위를 구하기"를 반복하여 테이프 수를 구해 문제를 해결하였다.

아쉬운 점은 이중 반복문 안에 if(j==n-1)을 사용하여서 코드가 더러워졌다. 한 번 다시 바꿔봐야겠다.

 

 

다른 사람의 코드

import java.io.*;
import java.util.*;
public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] t = br.readLine().split(" ");
		int  N = Integer.parseInt(t[0]);
		int  L = Integer.parseInt(t[1]);
		int pos[] = new int[1001];
		int tape=0;
		String[] input = br.readLine().split(" ");
		for(int i=0; i<N; i++) {
			pos[Integer.parseInt(input[i])] = 1;
		}


		for(int i=1;i<=1000;i++) {
			if(pos[i]!= 0) {
				i+=L-1;
				tape++;
			}
		}

		System.out.println(tape);
	}

}
인덱스를 사용해 푼 코드인데 훨씬 간편한 것 같다.
"물이 샌 곳 위치 발견하면 테이프로 막아주고 막은 범위만큼 값 더하기"를 반복하여 해결한 코드.

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

1343번 : 폴리오미노  (0) 2022.07.04
2847번 : 게임을 만든 동준이  (0) 2022.06.30
1543번 : 문서 검색  (0) 2022.06.29
1339번 : 단어 수학  (0) 2022.06.28
1049번 : 기타줄  (0) 2022.06.28
    '알고리즘/백준' 카테고리의 다른 글
    • 1343번 : 폴리오미노
    • 2847번 : 게임을 만든 동준이
    • 1543번 : 문서 검색
    • 1339번 : 단어 수학
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바