자바 강의, 코테 문제
문제 설명
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
import java.util.ArrayList;
class Solution {
public int[] solution(int[] numbers) {
int[] answer = {};
ArrayList <Integer> al= new ArrayList<>();
for (int i=0; i<numbers.length-1; i++) {
for (int j=i+1; j<numbers.length; j++) {
al.add(numbers[i]+numbers[j]);
}
}
answer=al.stream().sorted().distinct().mapToInt(Integer::intValue).toArray();
return answer;
}
}
스트림을 언젠간 써서 풀어보고 싶었는데 뭔가 각이 보여서 써서 풀었다. 확실히 엄청 빠르게 풀린다. 스트림이 익숙치 않아서 더 어려웠다면 이렇게 못 풀었을 수도..
문제 설명
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
Map <String,Integer> map = Map.of(
"zero",0,"one", 1,"two",2,"three",3,"four",4,"five",5,"six",6,"seven",7,"eight",8 ,"nine",9
);
String s1 = s;
for (String map1: map.keySet()) {
if (s.contains(map1)){
s1=s1.replace(map1,String.valueOf(map.get(map1)));
}
}
answer=Integer.parseInt(s1);
return answer;
}
}
Map <k,v> map = new HashMap<>(); // 맵 객체 생성 및 선언
Map.of // 불변 Map 생성
Map<k,v>: 인터페이스이며, Key-Value(키-값) 쌍을 저장하는 자료구조
Map 종류별 특징
Map의 주요 기능
Map을 쓰면 풀기 쉽겠다라고 생각은 했지만 사용법을 잘 몰라서 오래 걸렸다.
추상 클래스의 목적: 기본적으로 클래스이며, 상속, 확장하여 사용하기 위해 사용
인터페이스의 목적: 해당 인터페이스를 구현한 객체들에 대한 동일한 사용방법과
동작을 보장하기 위해 사용
추상 클래스
-관련성이 있는 클래스에서 공통 부분을 이용하려는 경우
-공통으로 가지는 메서드와 필드가 많거나, public 이외의 접근자 선언이 필요한 경우
-non-static, non-final 필드 선언이 필요한 경우(각 인스턴스에서 상태 변경을 위한
메서드가 필요할 경우)
인터페이스
-관련성이 없는 클래스에서 공통 부분을 이용하려는 경우
-특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지 신경
쓰지 않는 경우
-다중상속을 허용하고 싶은 경우
위의 사진과 같이 iv, cv, lv와 같은 개념
class Outer {
private int outerIv = 0;
static int outerCv = 0;
class InstanceInner {
int iiv = outerIv; // 외부 클래스의 private멤버도 접근가능하다.
int iiv2 = outerCv;
}
static class StaticInner {
// 스태틱 클래스는 외부 클래스의 인스턴스멤버에 접근할 수 없다.
// int siv = outerIv;
static int scv = outerCv;
}
void myMethod() {
int lv = 0;
final int LV = 0; // JDK1.8부터 final 생략 가능
class LocalInner {
int liv = outerIv;
int liv2 = outerCv;
// 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다.
// int liv3 = lv; // 에러!!!(JDK1.8부터 에러 아님)
int liv4 = LV; // OK
}
}
}
지역변수가 지역이너클래스보다 빨리 끝날 수 있으므로 외부 클래스의 lv를 쓰면
에러 발생하지만 1.8부턴 값이 변경되지 않으면 상수 취급해서 final을 생략 가능
class Outer2 {
class InstanceInner {
int iv = 100;
}
static class StaticInner {
int iv = 200;
static int cv = 300;
}
void myMethod() {
class LocalInner {
int iv = 400;
}
}
}
class Ex7_15 {
public static void main(String[] args) {
// 인스턴스클래스의 인스턴스를 생성하려면
// 외부 클래스의 인스턴스를 먼저 생성해야 한다.
Outer2 oc = new Outer2();
Outer2.InstanceInner ii = oc.new InstanceInner();
System.out.println("ii.iv : "+ ii.iv);
System.out.println("Outer2.StaticInner.cv : "+Outer2.StaticInner.cv);
// 스태틱 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 된다.
Outer2.StaticInner si = new Outer2.StaticInner();
System.out.println("si.iv : "+ si.iv);
}
}
class Outer3 {
int value = 10; // Outer3.this.value
class Inner {
int value = 20; // this.value
void method1() {
int value = 30;
System.out.println(" value :" + value); // 내부 클래스 lv
System.out.println(" this.value :" + this.value); // 내부 클래스 iv
System.out.println("Outer3.this.value :" + Outer3.this.value); // 외부 클래스 iv
}
}
}
class Ex7_16 {
public static void main(String args[]) {
Outer3 outer = new Outer3();
Outer3.Inner inner = outer.new Inner();
inner.method1();
}
}
-컴파일 에러: 컴파일할 때 발생하는 에러
-런타임 에러: 실행할 때 발생하는 에러
-논리적 에러: 작성 의도와 다르게 동작
-에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
-예외(exception): 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적: 프로그램의 비정상 종료를 막고, 정상적인 실행 상태를 유지하는 것
Exception클래스+자손 클래스들: 사용자의 실수와 같은 외적인 요인에 의해 발생하는
예외
RuntimeException클래스+자손 클래스들: 프로그래머의 실수로 발생하는 예외
try {
// 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType1 e1) {
// 예외가 발생했을 때 실행할 코드
}catch (ExceptionType2 e2) {
// 예외가 발생했을 때 실행할 코드
}
내부 클래스 부분은 코드가 길어서 지저분해 보일 수도 있지만 글로 설명하면 다시 봤을 때 이해가 잘 안 될 것 같아서 어쩔 수 없다. 그리고 공부 시간을 늘리고 있는데 확실히 12시간은 좀 피곤하다.. 나 화이팅!