2020년 7월 3일 금요일

[프로그래머스] 전화번호 목록 (자바/Java)

문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
  • 각 전화번호의 길이는 1 이상 20 이하입니다.
입출력 예제
phone_bookreturn
[119976742231195524421]false
[123,456,789]true
[12,123,1235,567,88]false
입출력 예 설명
입출력 예 #1
앞에서 설명한 예와 같습니다.
입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.

알림
2019년 5월 13일, 테스트 케이스가 변경되었습니다. 이로 인해 이전에 통과하던 코드가 더 이상 통과하지 않을 수 있습니다.



class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
       
        for(int i=0; i<phone_book.length; i++) {
            for(int j=0; j<phone_book.length; j++) {
                if(i!=j && phone_book[j].startsWith(phone_book[i]))
                    return false;
            }
        }
       
        return answer;
    }
}

2020년 7월 1일 수요일

[프로그래머스] 다리를 지나는 트럭(자바/Java)

문제 설명
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.
예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.
경과 시간다리를 지난 트럭다리를 건너는 트럭대기 트럭
0[][][7,4,5,6]
1~2[][7][4,5,6]
3[7][4][5,6]
4[7][4,5][6]
5[7,4][5][6]
6~7[7,4,5][6][]
8[7,4,5,6][][]
따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.
solution 함수의 매개변수로 다리 길이 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.
제한 조건
  • bridge_length는 1 이상 10,000 이하입니다.
  • weight는 1 이상 10,000 이하입니다.
  • truck_weights의 길이는 1 이상 10,000 이하입니다.
  • 모든 트럭의 무게는 1 이상 weight 이하입니다.
입출력 예
bridge_lengthweighttruck_weightsreturn
210[7,4,5,6]8
100100[10]101
100100[10,10,10,10,10,10,10,10,10,10]110
※ 공지 - 2020년 4월 06일 테스트케이스가 추가되었습니다.

import java.util.Queue;
import java.util.LinkedList;

class Solution {
    static class Truck {
        int weight;
        int index;
       
        public Truck(int weight, int index) {
            this.weight = weight;
            this.index = index;
        }
    }   // Truck 클래스
   
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        int time = 0;   // 시간
        int onBridgeWeight = 0; // 다리 위 무게
       
        // 다리 건너기 전 대기 트럭 큐
        Queue<Truck> q_wait = new LinkedList<>();
        // 다리 건너는 중인 트럭 큐
        Queue<Truck> q_cross = new LinkedList<>();
       
        // 대기 큐에 트럭들 넣기
        for(int w : truck_weights) {
            q_wait.add(new Truck(w, 0)); // 무게가 w이고, index가 0인 트럭들 add
        }
       
        // 다리 위 무게에 대기 큐의 트럭 무게를 더한다.
        onBridgeWeight += q_wait.peek().weight;
       
        // 다리 위를 건너는 트럭 큐에 대기 큐의 트럭을 추가한다.
        q_cross.add(q_wait.poll());
       
        // 다리 위에 트럭이 있다면 시간을 증가시키고 트럭을 이동시킨다.
        while(!q_cross.isEmpty()) {
            time++;
           
            // 다리 위에 있는 트럭을 움직인다. (다리 위 트럭 큐의 index를 증가시킴)
            for(Truck t : q_cross) {
                t.index++;
            }
           
            // 다리 끝에 도착하면 다리 위 무게에서 트럭 무게를 빼고 다리 위 트럭 큐에서 제거한다.
            if(q_cross.peek().index > bridge_length) {
                onBridgeWeight -= q_cross.poll().weight;
            }
           
            // 대기 큐에 트럭이 남아있으면 무게를 고려하여 다리 위로 옮긴다.
            if(!q_wait.isEmpty() && q_wait.peek().weight + onBridgeWeight <= weight) {
                onBridgeWeight += q_wait.peek().weight;
                q_wait.peek().index++;
                q_cross.add(q_wait.poll());
            }
        } // While의 끝
       
        answer = time;
       
        return answer;
    }
}

[프로그래머스] 기능개발(자바/Java)

문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한 사항
  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
입출력 예
progressesspeedsreturn
[93,30,55][1,30,5][2,1]
입출력 예 설명
첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.

import java.util.Queue;
import
java.util.LinkedList;

class
Solution {
   
public int[] solution(int[] progresses, int[] speeds) {
       
int[] pro = progresses;
       
Queue<Integer> result = new LinkedList<>();
        int
index = 0, count = 0;

        while
(index < pro.length) {
           
for(int i=0; i<pro.length; i++) {
                pro[i] += speeds[i]
;
           
}

           
if(pro[index] >= 100) {
               
while(index < pro.length && pro[index] >= 100) {
                    index++
;
                   
count++;
               
}
                result.offer(count)
;
               
count = 0;
           
}
        }

       
int[] answer = new int[result.size()];

        for
(int i=0; i<answer.length; i++) {
            answer[i] = result.poll()
;
       
}

       
return answer;
   
}
}

2020년 2월 5일 수요일

Vue 에서 replace() 사용 시 오류

Vue 에서 str.replace() 사용 시 다음과 같은 오류가 난다.

mounted hook: "TypeError: str.replace is not a function"

str.toString().replace("," , ""); 이런 식으로 써야 에러가 해결된다.

[Tips] 위와 같이 replace()를 사용하면 첫 번째 콤마만 빈 칸으로 변환된다.
모든 문자열의 콤마를 변환하려면 정규표현식을 사용해야 한다.
ex) str.toString().replace(/,/gi , "");

2020년 2월 4일 화요일

Spring Boot, Vue.js deserializer 오류 해결법

Java, MariaDB, Spring Boot, Vue.js 사용 중 났던 에러이다.
프론트 엔드에서 input 타입이 time 인 입력 폼으로 시간을 입력받아 저장하고 불러 올 때 시간의 형식 때문인지 다음과 같은 에러 문구가 떴다.

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class java.sql.Time]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.sql.Time`, problem: null
 at [Source: (PushbackInputStream); line: 1, column: 88] (through reference chain: com.upffice.model.ScheduleDto["sche_start_time"])] with root cause

JSON 파싱할 때 시간 형식이 달라서 생기는 문제 같았다. 여러 블로그들을 떠돌다가 해결법을 찾았다.

* 참고 사이트 : https://stackoverflow.com/questions/38777194/jackson-and-java-sql-time-serialization-deserialization/47688916

1. 다음과 같은 클래스를 생성한다.

public class SqlTimeDeserializer extends JsonDeserializer<Time> {
    @Override    public Time deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        return Time.valueOf(jp.getValueAsString() + ":00");    }
}

2. 데이터 model 부분에서 Time 타입의 컬럼에 해당하는 부분에 다음과 같이 annotation을 추가한다.

@JsonFormat(pattern = "HH:mm")
@JsonDeserialize(using = SqlTimeDeserializer.class)
@Column(name = "sche_start_time")
private Time sche_start_time;





2019년 9월 1일 일요일

[JAVA] 5명의 성적을 입력받고 성적, 총점, 평균, 학점, 등수 출력하기

import java.util.Scanner;

public class Day08Ex03 {

static final int MAX = 5;
public static void main(String[] args) {
// 성적출력 프로그램
// 5명의 성적을 입력받아 출력하는 프로그램
// 입력 : 성명, 국어점수, 영어점수, 수학점수를 입력받아서
// 출력사항 : 입력내용 출력되고 / 학생별 총점, 학생별 평균, 학생별 평균의 학점, 학생별 등수

String[] name = new String[MAX];
int[] kor = new int[MAX];
int[] eng = new int[MAX];
int[] math = new int[MAX];

int[] total = new int[MAX];
double[] avg = new double[MAX];
String[] grade = new String[MAX];
int[] rank = new int[MAX];

Scanner sc = new Scanner(System.in);

for(int i=0; i<MAX; i++){
System.out.print((i+1) + "번 학생의 이름을 입력하세요>>");
name[i] = sc.next();

do {
System.out.print((i + 1) + "번 학생의 국어성적을 입력하세요>>");
kor[i] = sc.nextInt();
} while (kor[i] < 0 || kor[i] > 100);
do {
System.out.print((i + 1) + "번 학생의 영어성적을 입력하세요>>");
} while (eng[i] < 0 || eng[i] > 100);
eng[i] = sc.nextInt();
do {
System.out.print((i + 1) + "번 학생의 수학성적을 입력하세요>>");
math[i] = sc.nextInt();
} while (math[i] < 0 || math[i] > 100);

total[i] = kor[i] + eng[i] + math[i]; // total
avg[i] = total[i] / 3; // avg

if(avg[i]>=90){
grade[i] = "A";
}else if(avg[i]>=80){
grade[i] = "B";
}else if(avg[i]>=70){
grade[i] = "C";
}else if(avg[i]>=60){
grade[i] = "D";
}else{
grade[i] = "F";
}

rank[i] = 1; // 등수를 모두 1로 초기화

} //for 입력, 총합, 평균 연산까지

for(int i=0; i<MAX; i++){
for(int j=0; j<MAX; j++){
if(i!=j && avg[i]<avg[j]){ // 똑같은건 건너뛰기
rank[i]++;
}
}

}

System.out.println("성명\t국어\t영어\t수학\t총점\t평균\t학점\t등수");
System.out.println("------------------------------------------------------------");

for(int i=0; i<MAX; i++){
System.out.printf("%s\t%d\t%d\t%d\t%d\t%.1f\t%s\t%d",
name[i], kor[i], eng[i], math[i], total[i], avg[i], grade[i], rank[i]);
System.out.println();

}

sc.close();
} // main

}

[JAVA] 배열 - 1차원 배열 합치기 / 2차원 배열에 넣기


import java.util.Arrays;

public class Day09Homework {

// 금요일 과제
public static void main(String[] args) {
int[] ar1 = { 10, 20, 30 };
int[] ar2 = { 50, 60, 70, 80 };

int[] ar3 = concatArr(ar1, ar2); // 2개의 배열 합치기 : ar1뒤에 ar2이 붙게 만듦.
int[][] ar4 = mkArr(ar1, ar2); // 2개의 배열을 2차원 배열로 만들기

printArr(ar3);
printArr(ar4);

} // main

static int[] concatArr(int[] a, int[] b){
int[] result = new int[a.length+b.length];

for(int i=0; i<a.length + b.length; i++){
if(i<a.length){
result[i] = a[i];
}else{
result[i] = b[i-a.length];
}
} //for
return result;
}

static int[][] mkArr(int[] a, int[] b) {

int[][] result = {a,b};
return result;
}

static void printArr(int[] a) {
System.out.println("1차원배열>>>");
System.out.println(Arrays.toString(a));
} // printArr() : 1차원 배열

static void printArr(int[][] a) {
System.out.println("2차원배열>>>");
for (int i = 0; i < a.length; i++) {
System.out.println(Arrays.toString(a[i]));
} // for문 - 배열의 행부분만 출력하면 한줄 씩 나오니까.

} // printArr() : 2차원 배열

}

[JAVA] 배열 예제 - 복권(lottery)

<45개 숫자 중 중복되지 않는 6개의 숫자 뽑기 여러 예제>

import java.util.Arrays;
import java.util.Random;

public class Day07Lottery {

static Random rand = new Random();

public static void main(String[] args) {
// 로또 번호 생성기
int[] lotto = new int[6];
int cnt = 0;

while (cnt < 6) {
lotto[cnt] = 1 + rand.nextInt(45);

for (int i = 0; i < cnt; i++) {
if (lotto[i] == lotto[cnt]) { // lotto[0]부터 lotto[cnt]까지 비교
cnt--; // 값이 중복이면, 값을 새로 넣고, 다시 비교해봐야 함. 해당 lotto[cnt]반복 위해 cnt--.
} // if
} // for

cnt++;
} // while

System.out.println(Arrays.toString(lotto));
}

public static void test02(String[] args) {
// 로또 번호 생성기-boolean 이용
int[] lotto = new int[6];
int cnt = 0;
boolean overlap = false; // 중복 여부 검사

while (cnt < 6) {
lotto[cnt] = 1 + rand.nextInt(45); // 1~45 중 랜덤한 6개의 숫자를 배열 lotto에 넣는다.

for (int i = 0; i < cnt; i++) {
overlap = lotto[i] == lotto[cnt]; // overlap이 true : 중복이 true면 다음 if문 실행.
if (overlap) {
cnt--;
} // if
} // for

cnt++;
} // while

System.out.println(Arrays.toString(lotto));
} //test02

public static void test03(String[] args) {
int[] lotto = new int[6];
boolean overlap = false;

for(int i =0; i<6; i++){
lotto[i] = 1+rand.nextInt(45);

for(int j=0; j<i; j++){
overlap = lotto[i]==lotto[j];
if(overlap){
i--;
}
} // for-j

} // for-i

System.out.println(Arrays.toString(lotto));

} // test03

}

======================================================
<추가 예제>

import java.util.Arrays;
import java.util.Random;

public class Day08Homework_lottery {
static Random rand = new Random();
static final int MAX = 45;

public static void test01(String[] args) {
// TODO Auto-generated method stub
int[] lotto = new int[6];
int cnt =0;

aaa: while (cnt < 6) {
lotto[cnt] = 1 + rand.nextInt(45);

for(int i=0; i<cnt; i++){
if(lotto[cnt]==lotto[i]){
continue aaa;
}
}

cnt++;
} // while

System.out.println(Arrays.toString(lotto));
} // test01

public static void test02(String[] args) {
int[] lotto = new int[6];
int cnt = 0;

while (cnt < 6) {
lotto[cnt] = 1 + rand.nextInt(45);
for(int i=0; i<cnt; i++){
if(lotto[cnt]==lotto[i]){
lotto[cnt] = 1 + rand.nextInt(45);
i = -1;
}
}
cnt++;
} // while
System.out.println(Arrays.toString(lotto));
} //test02

public static void test03(String[] args) {
int[] lotto = new int[6];
int cnt = 0;

while (cnt < 6) {
lotto[cnt] = 1 + rand.nextInt(45);
for(int i=0; i<cnt; i++){
if(lotto[cnt]==lotto[i]){
cnt--;
break;
}
}
cnt++;
} // while
System.out.println(Arrays.toString(lotto));
} //test03

public static void test04(String[] args) {
int[] lotto = new int[6];
int cnt = 0;

while (cnt < 6) {
int number = 1 + rand.nextInt(45);
boolean flag =true;

for(int i=0; i<cnt; i++){
if(number==lotto[i]){
flag = false;
break;
}
}
if(flag){
lotto[cnt] = number;
cnt++;
}
} // while
System.out.println(Arrays.toString(lotto));
} //test04

public static void test05(String[] args) {
int[] balls = new int[MAX];
int[] lotto = new int[6];
int cnt = 0;

for(int i =0; i<MAX; i++){
balls[i] = i+1; // balls에 1~45 넣기
}

while(cnt<lotto.length){
int idx = rand.nextInt(MAX); // 0~44
if(balls[idx] !=0){
lotto[cnt] = balls[idx];
balls[idx] = 0;
cnt++;
}
}

System.out.println(Arrays.toString(lotto));

} //test05

public static void test06(String[] args) {
boolean[] flags = new boolean[MAX]; // 초기화 안 해도 기본값 false
int[] lotto = new int[6];
int cnt = 0;

while(cnt<lotto.length){
int idx = rand.nextInt(MAX);
if(flags[idx] != true){
lotto[cnt] = idx+1;
flags[idx] = true;
cnt++;
}

} // while

System.out.println(Arrays.toString(lotto));
} //test06

public static void main(String[] args) {
int[] balls = new int[MAX];
int cnt =0;
while(cnt<6){
int idx = rand.nextInt(MAX);
if(balls[idx]==0){
balls[idx] = idx+1;
cnt++;
} // if
} // while

for(int i=0; i<MAX; i++){
if(balls[i]!=0){
System.out.print(balls[i] + " ");
}
} // for

} // test07 - 순서대로 정렬도 된다.

}


[JAVA] 구구단 3행 3열 출력, 입력받아서 3열씩 출력하기

<구구단 3행 3열 출력하기>

public class Day07Homework3 {

public static void test01(String[] args) {
// 구구단 3행 3열
int dan =2;

for (dan = 2; dan <= 9; dan += 3) {
for(int i =0; i<3; i++){
System.out.print(dan+i<10 ? " <" + (dan+i) + "단>\t" : "");
}
System.out.println();
for(int i=1; i<=9; i++){
for(int j =0; j<3; j++){
String str = (dan+j) + "*" + i + "=" + (dan+j)*i;
System.out.print(dan+j<10 ? str + "\t" : "");
}
System.out.println();
}
}

} // test01


}

==========================================================
<시작과 끝나는 단 입력 받아서 구구단 3열씩 출력하기>

import java.util.Scanner;

public class Day07Homework5 {
static Scanner scan = new Scanner(System.in);
static final int MIN = 2;
static final int MAX = 9;

public static void main(String[] args) {

int startDan=MIN, endDan=MAX;

System.out.println("시작 단 입력>>>");
startDan = scan.nextInt();
while(startDan<MIN || startDan>MAX){
System.out.println("다시 입력(" + MIN +"~" + MAX + ")>>>");
startDan = scan.nextInt();
} // while : 시작 단 유효성 검사

System.out.println("끝나는 단 입력>>>");
endDan = scan.nextInt();
while(endDan<MIN || endDan>MAX){
System.out.println("다시 입력(" + MIN +"~" + MAX + ")>>>");
endDan = scan.nextInt();
} // while : 끝나는 단 유효성 검사

if(startDan>endDan){
int tmp = startDan;
startDan = endDan;
endDan = tmp;
}

// 3행 3열로 출력

for (int dan = startDan; dan <= endDan; dan += 3) {
for(int i=0; i<3; i++){
System.out.print(dan+i<10 && dan+i <=(endDan)? " <" + (dan+i) + "단>\t" : "");
}
System.out.println();
for(int i=1; i<=9; i++){
for(int j =0; j<3; j++){
String str = (dan+j) + "*" + i + "=" + (dan+j)*i;
System.out.print(dan+j<10 && dan+j <=(endDan)? str + "\t" : "");
}
System.out.println();
}
}

} //main

}

[JAVA] 배열 예제 - 월, 일을 입력 받고 1년이 며칠 남았는지 출력 / 100일 후 날짜 출력


import java.util.Scanner;

public class Day06Ex04 {
static Scanner scan = new Scanner(System.in);

public static void test01(String[] args) {

int[] days = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int month, day;
int total = 0;

// ex)
// 월 입력 : 8
// 일 입력: 27
// -> 1년이 ?일 남았습니다.
System.out.println("월 입력 : ");
month = scan.nextInt();

System.out.println("일 입력 : ");
day = scan.nextInt();

for (int i = 0; i < month - 1; i++) {
total += days[i];
}
total += day;

System.out.println("1년이 " + (365 - total) + "일 남았습니다");


} // end of test01

public static void main(String[] args) {
// 과제 : 월, 일을 입력 받고 100일 후 날짜 출력
int[] days = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int month, day;
int day2 = 100;

System.out.println("월 입력 : ");
month = scan.nextInt();

System.out.println("일 입력 : ");
day = scan.nextInt();

day2 = day2 -(days[month-1] -day); // 입력받은 첫 번째 달 따로 처리

while (day2 > days[month%12]) {
if ((month%12) == 0) {
month = 1;
} else {
month++;
} // if-else : 다음 년도로 넘어갔을 경우 처리

day = days[month - 1];
day2 = day2 - day;
} // while

month++;

System.out.println("입력하신 날짜의 100일 뒤는 " + month + "월 " + day2 + "일 입니다.");

} // end of test02

}

========================================================
<100일 뒤 날짜 출력 다른 코드>

import java.util.Scanner;

import static java.lang.System.out;

public class Day07Homework2 {
static Scanner scan = new Scanner(System.in);
public static void hw1(String[] args) {
// 100일 뒤 날짜 계산
Scanner scan = new Scanner(System.in);
int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int month, day; // 입력받을 날짜
int dMonth, dDay; // 100일 후 날짜
int total = 0;

out.print("Input month>>>");
month = scan.nextInt();

out.print("Input day>>>");
day = scan.nextInt();


out.printf("%d월%d일의 100일 후는", month, day);

// total에 현재 달의 남은 날짜를 저장.
// 현재 달 : month, 현재 달의 인덱스 :month-1
total = days[month-1] - day;
int i = month; // 현재 달의 다음 달.
while(total < 100){
i %= 12; // 12월 일 때 처리
total += days[i];
i++;
}
// 무조건 100보다 크다.
dDay = days[i-1]-(total-100);
dMonth = i;

scan.close(); // scanner 종료
out.printf("%d월%d일입니다.\n", dMonth, dDay);

} // end of hw1 - 날짜 세기 total에 더하는 법

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int month, day; // 입력받을 날짜
int dMonth, dDay; // 100일 후 날짜
int total = 100;

out.print("Input month>>>");
month = scan.nextInt();

out.print("Input day>>>");
day = scan.nextInt();

out.printf("%d월%d일의 100일 후는", month, day);

total = 100 - (days[month-1] - day); // 현재 달의 남은 날짜를 빼준다.
int i = month%12;

while(total > days[i]){
total = total - days[i];
i++;
i %=12;
}

dMonth = i + 1;
dDay = total;


out.printf("%d월%d일입니다.\n", dMonth, dDay);

scan.close(); // scanner 종료
} // end of hw2 - 날짜 세기 total에서 빼는 법

}

[프로그래머스] 프린터 (자바/Java)

문제 설명 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은...