🔎

답안

 
  • for문 버전
import java.util.ArrayList; public class Q2 { public static void main(String[] args) { int 돌의내구도[] = {5, 3, 4, 1, 3, 8, 3}; 독[] 독배열 = { new 독("루비독", "95년생", 3, 4), new 독("피치독", "95년생", 3, 3), new 독("씨-독", "72년생", 2, 1), new 독("코볼독", "59년생", 1, 1) }; solution(돌의내구도, 독배열); } public static void solution(int[] 돌의내구도, 독[] 독배열) { ArrayList<String> answer = new ArrayList<String>(); for (독 i : 독배열) { int 독의위치 = 0; boolean flag = true; while (독의위치 < 돌의내구도.length) { 독의위치 += i.점프력; if (독의위치 > 돌의내구도.length) { break; } 돌의내구도[독의위치 - 1] -= i.몸무게; if (돌의내구도[독의위치 - 1] < 0) { flag = false; break; } } if (flag) { answer.add(i.이름); } } System.out.println(answer); } } class 독 { String 이름; String 나이; int 점프력; int 몸무게; public 독 (String 이름, String 나이, int 점프력, int 몸무게) { this.이름 = 이름; this.나이 = 나이; this.점프력 = 점프력; this.몸무게 = 몸무게; } }
 
  • while 무한루프
import java.util.ArrayList; public class Q2 { public static void main(String[] args) { int 돌의내구도[] = {5, 3, 4, 1, 3, 8, 3}; 독[] 독배열 = { new 독("루비독", "95년생", 3, 4), new 독("피치독", "95년생", 3, 3), new 독("씨-독", "72년생", 2, 1), new 독("코볼독", "59년생", 1, 1) }; solution(돌의내구도, 독배열); } public static void solution(int[] 돌의내구도, 독[] 독배열) { ArrayList<String> answer = new ArrayList<String>(); for (독 i : 독배열) { int 독의위치 = 0; boolean flag = true; while (true) { 독의위치 += i.점프력; if (독의위치 > 돌의내구도.length) { break; } 돌의내구도[독의위치 - 1] -= i.몸무게; if (돌의내구도[독의위치 - 1] < 0) { flag = false; break; } } if (flag) { answer.add(i.이름); } } System.out.println(answer); } } class 독 { String 이름; String 나이; int 점프력; int 몸무게; public 독 (String 이름, String 나이, int 점프력, int 몸무게) { this.이름 = 이름; this.나이 = 나이; this.점프력 = 점프력; this.몸무게 = 몸무게; } }
 

1. 문제 파악

  1. 독이 점프를 시작할 곳은 0부터이고, 독의 점프력이 2라면 두 번째 돌을 밟아야 합니다. 하지만 돌의 위치를 중심으로 봤을 땐 인덱스가 0부터 시작해야 하므로 두 번째 돌은 1번 인덱스의 돌에 해당합니다.
  1. 독들이 차례대로 다리를 건너야 하는데 돌에는 내구도가 있기 때문에 돌을 밟을 때마다 독의 몸무게만큼의 내구도를 감소시켜야 합니다.
  1. 어떤 돌의 내구도가 0보다 작아서 해당 돌을 밟을 수 없을 때에도 독의 점프력에 따라 그 돌을 밟지 않고도 다리를 건널 수 있기 때문에 이 조건 또한 확인해야 합니다.

2. 풀이

  1. 모든 독을 확인해 봐야 하기 때문에 독의 수만큼 반복문을 돌려서 확인합니다.
  1. 독의 위치는 독의 점프력만큼 더합니다.
    1. 독의위치 += i.점프력; if (독의위치 > 돌의내구도.length) { break; }
       
  1. 문제 설명에서 말씀 드렸던 것처럼 돌 배열의 인덱스를 유념하여 독의 위치 -1에 해당하는 돌의 내구도에서 독의 무게만큼 빼주어 돌의 내구도를 감소시킵니다.
    1. 돌의내구도[독의위치 - 1] -= i.몸무게;
       
  1. 돌의 내구도가 0보다 작은지 확인하여 물에 빠지는 독을 flag 변수를 false로 갱신해 줍니다.
    1. if (돌의내구도[독의위치 - 1] < 0) { flag = false; break; }
       
  1. flag가 true이면 다리를 무사히 건넜다는 의미이기 때문에 answer에 추가합니다.
    1. if (flag) { answer.add(i.이름); }