내배캠 사전캠프 TIL 17일차

오병택·2025년 2월 10일

내배캠

목록 보기
17/73

학습 요약

자바 강의, 코테

코테

프로그래머스 level1 - 시저 암호

문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

class Solution {
    public String solution(String s, int n) {
        String answer = "";
        StringBuilder sb = new StringBuilder();
        char [] s1 = s.toCharArray();
        for (int i=0; i<s1.length; i++) {
            if (Character.isUpperCase(s1[i]) && s1[i]+n<=90) {
                sb.append((char)(s1[i]+n));
            }else if (Character.isUpperCase(s1[i]) && s1[i]+n>90) {
                sb.append((char)(s1[i]+n-26));
            }else if (Character.isLowerCase(s1[i]) && s1[i]+n<=122) {
                sb.append((char)(s1[i]+n)); // 'z'를 넘지 않으면 그냥 그대로 문자를 밀어서 민만큼의 문자가 나오게 함
            }else if (Character.isLowerCase(s1[i]) && s1[i]+n>122) {
                sb.append((char)(s1[i]+n-26));  // 'z'의 아스키 코드를 넘어가게 되면 알파벳 수만큼 빼주면 그 문자의 아스키 코드가 되어서 char형으로 형변환 해줌
            }else {
                sb.append(' ');
            }
        }
        answer=sb.toString();
        return answer;
    }
}

어제 풀다가 만 문제인데 오늘 다시 이어서 풀었다. 아스키 코드가 떠올라서 이용해서 풀었다.

프로그래머스 level1 - 가장 가까운 같은 글자

문제 설명
문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다. 예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다. 문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.

class Solution {
    public int[] solution(String s) {
        int[] answer = new int [s.length()];
        char [] s1 = s.toCharArray();
        for (int i=0; i<s1.length; i++) {
            int lastindex = s.lastIndexOf(s1[i],i-1); // s1[i]에 해당하는 문자가 i-1를 포함해서 그전까지 같은 문자가 있다면 그 인덱스를 반환하고 아니면 -1을 반환
            if (lastindex==-1) {
                answer[i]=-1;
            }else {
                answer[i]=i-lastindex; 
            }
        }
        return answer;
    }
}

이건 나름대로 하고 있었는데 중간에 막혀서 풀이를 보고 했다.
lastIndexOf(char ch, int fromIndex) // 문자가 마지막으로 등장하는 인덱스를 반환, 없다면 -1 반환. 반점 앞에 문자열 넣고 문자열로도 가능.

JAVA 강의

참조형 매개변수
객체를 메서드의 매개변수로 전달하면, 객체의 참조값(주소)가 복사
ex)

class Data2 { int x; }

class Ex6_7 {
	public static void main(String[] args) {
		Data2 d = new Data2();
		d.x = 10;
		System.out.println("main() : x = " + d.x); // 10

		change(d); // d의 주소를 복사하여 같은 객체를 가리키게 됨. 1000
		System.out.println("After change(d)");
		System.out.println("main() : x = " + d.x); 1000
	}

	static void change(Data2 d) { 
		d.x = 1000;
		System.out.println("change() : x = " + d.x);
	}
}

참조형 반환타입
ex)

class Data3 { int x; }

class Ex6_8 {
	public static void main(String[] args) {
		Data3 d = new Data3();
		d.x = 10;

		Data3 d2 = copy(d); 
		System.out.println("d.x ="+d.x); // 10
		System.out.println("d2.x="+d2.x); // 10
	}

	static Data3 copy(Data3 d) {
		Data3 tmp = new Data3();    // 새로운 객체 tmp를 생성한다.

		tmp.x = d.x;  // d.x의 값을 tmp.x에 복사한다.

		return tmp;   // 복사한 객체의 주소를 반환한다.
	}
}

iv를 써서 메서드 정의하면 im(인스턴스 메서드) 아니면 cm(클래스 메서드)

im은 cm을 호출 가능하지만 cm은 im을 호출x 이유: 인스턴스 멤버들은 객체 생성 후
사용가능한데 cm은 언제나 사용가능해서 객체가 생성됐는지 모르기 때문.

오버로딩 ex)

void println() // 괄호 안에 뭐가 들어가는 지에 따라 바뀜

생성자: 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
-이름이 클래스 이름과 같아야 함
-리턴값이 없음
-모든 클래스는 반드시 생성자를 가져야 함

기본 생성자:
-매개변수가 없는 생성자
-생성자가 하나도 없을 때, 컴파일러가 자동 추가

기본 생성자를 항상 넣어주는 게 좋음

매개 변수가 있는 생성자:
ex)

class Car {
	String color;	
	String gearType;	
	int door;			

	Car() {}

	Car(String c, String g, int d) {
		color = c;
		gearType = g;
		door = d;
	}
}


class Ex6_12 {
	public static void main(String[] args) {
		Car c1 = new Car();
		c1.color    = "white";
		c1.gearType = "auto";
		c1.door = 4; // 이렇게 변수를 초기화하는 것과

		Car c2 = new Car("white", "auto", 4); // 이렇게 초기화하는 것은 같은 의미.

		System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
		System.out.println("c2의 color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
	}
}

생성자 this():
-같은 클래스의 생성자에서 다른 생성자 호출할 때 사용
-다른 생성자 호출 시 첫 줄에서만 사용 가능

참조변수 this:
-인스턴스 자신을 가리키는 참조변수
-인스턴스 메서드(생성자 포함)에서 사용 가능
-lv와 iv 구별할 때 사용
iv의 진짜 이름은 this.변수. 앞에 this생략 가능하지만 이름이 같을 땐
구별을 위해서 this를 붙여야 함

멤버변수(iv,cv)의 초기화
1. 명시적 초기화(=). 간단 초기화
2. 초기화 블럭: 복잡 초기화
-iv 초기화 블럭: {}
-cv 초기화 블럭: static {}
3. 생성자: 복잡 초기화, iv 초기화

초기화 순서:
cv-> iv

상속:
-기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용)
-두 클래스를 부모와 자식으로 관계를 맺어주는 것

상속을 여러 개 하고 싶다면 비중 높은 클래스 하나만 상속 관계로하고, 나머지는
포함 관계로 함.

참조변수 super:
-객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
-조상의 멤버를 자신의 멤버와 구별할 때 사용

조상의 생성자 super():
-조상의 생성자를 호출할 때 사용
-조상의 멤버는 조상의 생성자를 호출해서 초기화

패키지:
-서로 관련된 클래스의 묶음
-클래스는 클래스파일(*.class), 패키지는 폴더, 하위 패키지는 하위 폴더
-클래스의 실제 이름은 패키지를 포함.(java.lang.String)

패키지 선언:
-패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
-같은 소스 파일의 클래스들은 모두 같은 패키지에 속함

import문:
-클래스를 사용할 때 패키지 이름을 생략할 수 있음.
-컴파일러에게 클래스가 속한 패키지를 알려줌.
-java.lang패키지(기본 패키지)의 클래스는 import하지 않고도 사용 가능

static import문:
-static 멤버를 사용할 때 클래스 이름을 생략 가능

제어자:
-클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여

접근 제어자:
private: 같은 클래스 내에서만 접근 o
default: 같은 패키지 내에서만 접근 o
protected: 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근o
public: 접근 제한이 x

class 앞에는 public, default만 가능, 멤버들은 4가지 다 가능

추상 메서드의 작성:
꼭 필요하지만 자손마다 공통적으로 사용되고 다르게 구현될 것으로 예상되는 경우
바로 작성하거나 기존 클래스의 공통 부분을 추출해서 추상 클래스를 만듬.

인터페이스 기본 구조

헷갈릴만한 부분

느낀 점

곧 사전캠프 끝나는데 12시간씩 하려면 컨디션 관리를 잘 해야 할 것 같다. 죽기야 하겠어?

profile
걱정하지 말고 일단 해봐!

0개의 댓글