자바 강의, 코테 문제
문제 설명
3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다. 수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.
설명이 부족한 것 같아서 두 선수가 양쪽에서 먹기 시작하여 0(물)까지 먼저 도달한 사람이 이기게 된다. food 배열 [1, 3, 4, 6]이 주어졌을 때 인덱스 0은 무조건 물 한 개고, 그다음이 칼로리가 적은 순서이다. 위 배열의 결과값으로 "1223330333221"가 되게끔 해야 한다.
class Solution {
public String solution(int[] food) {
String answer = "";
StringBuilder sb = new StringBuilder();
for (int i= 1; i<food.length; i++) {
for (int j=0; j<food[i]/2; j++) {
sb.append(i);
}
}
StringBuilder sb1 = new StringBuilder();
sb1.append(sb);
sb1.reverse();
sb.append(0);
sb.append(sb1);
answer=sb.toString();
return answer;
}
}
물(0)을 기준으로 양쪽이 데칼코마니처럼 되어 있기 때문에 앞 부분 먼저 구하고 나서 0을 따로 붙여주고 뒤집은 것을 더하여 풀었고, 원래는 sb값을 sb1에 대입하여 뒤집으면 되겠다고 생각했는데 참조형이라서 원래의 것도 뒤집혀 버리게 된다. 그래서 따로 객체 생성해서 더해주었다.
try-catch문은 if문과 달리, try블럭이나 catch블럭 내에 포함된 문장이 하나뿐이어도 괄호{} 생략 x
-try 블럭 내에서 예외가 발생한 경우:
1. 발생한 예외와 일치하는 catch블럭이 있는지 확인
2. 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-
catch문을 빠져나가서 그 다음 문장을 계속해서 수행. 만일 일치하는 catch블럭을 찾
지 못하면, 예외 처리 안 되고 비정상 종료
-try블럭 내에서 예외가 발생하지 않은 경우:
1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속함.
Exception이 선언된 catch블럭은 예외의 최고 조상이라 모든 예외 처리가 가능해서
마지막 catch블럭에 작성
예외가 발생하면 예외 객체가 만들어지는데 객체에 예외 정보나 메서드들을 가지고
있음.
printStackTrace() // 예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외
메시지를 화면에 출력
getMessage() // 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있음
위의 메서드를 사용한 예제
class Ex8_5 {
public static void main(String args[]) {
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(0/0); // 예외발생!!!
System.out.println(4); // 실행되지 않는다.
} catch (ArithmeticException ae) {
ae.printStackTrace();
System.out.println("예외메시지 : " + ae.getMessage());
} // try-catch의 끝
System.out.println(6);
} // main메서드의 끝
}
출력결과:
-내용이 같은 catch블럭을 하나로 합친 것(JDK1.7부터)
부모 자식 관계에서 내용이 같은 경우는 멀티 catch블럭을 사용하지 말고 부모타입의
매개변수 즉 다형성을 이용하면 부모 자식 둘다 가능
멀티 catch블럭으로 작성한 다음 그 매개변수로 한쪽의 메서드만 호출할 수 없음.
양쪽의 공통된 멤버만 사용가능
이유: 매개변수에 어떤 객체가 들어올 지 모르기 때문에 에러
굳이 사용하려면 위의 사진처럼 해야 함. 근데 이렇게 사용할거면 멀티 catch 블럭
으로 만들면 안 됨.
예외 클래스의 객체를 만들고 throw를 이용해 예외를 발생시킴
예외 발생 기본 구조
throw new 예외클래스("예외 메시지");
ex)
class Ex8_6 {
public static void main(String args[]) {
try {
Exception e = new Exception("고의로 발생시켰음.");
throw e; // 예외를 발생시킴
// throw new Exception("고의로 발생시켰음."); 위의 두 문장 합친 것
} catch (Exception e) {
System.out.println("에러 메시지 : " + e.getMessage());
e.printStackTrace();
}
System.out.println("프로그램이 정상 종료되었음.");
}
}
출력 결과:
checked 예외(Exception과 그 자손들):
컴파일러가 예외 처리 여부를 체크(예외 처리 필수)
unchecked 예외(RuntimeException과 자손들):
컴파일러가 예외 처리 여부를 체크 안 함(예외 처리 선택)
checked는 예외 처리를 안 하면 컴파일 에러가 발생하고 unchecked는 컴파일은 되지만
예외가 발생 안 하는 건 아님.
예외 선언: 메서드가 호출 시 발생가능한 예외를 호출하는 쪽에 알리는 것
오늘 본 캠프가 점점 다가오니까 여러 가지로 생각할 것이 너무 많아서 집중이 별로 안 됐다. 걱정도 되기도 하고 뭐 이런저런..?