728x90

~정보를 어디에 넣고 싶은데~

헷갈렸던 변수개념을 다시 잡는데 좋았다!!

 

1. 네가지 종류의 변수는 어떻게 구분하나요?

 

변수란, 고정된 상수와 달리 변화를 줄 수 있는 값이다. 

자바에는 네 가지 변수가 있다. 

 

지역변수 local variables -> 중괄호 범위 안에서 선언된 변수로 그 범위 밖으로 나갈 수 없다. 

매개 변수 parameters -> 메소드나 생성자에게 넘겨주는 변수이다. 

인스턴스 변수 instance variables -> 끼약. 이 개념을 놓치고 있었다. 메소드 밖, 클래스 내부에 선언된 변수로 static 예약어가 붙지 않았다!!

클래스 변수 class variables -> 마찬가지로 메소드 밖, 클래스 내부에 선언된 변수이지만 static 예약어가 붙는다!!!

 

 

생명 주기는 

 

지역변수 local variables -> 선언된 중괄호 내에서만 유효!

매개 변수 parameters -> 메소드 호출될 때만!

인스턴스 변수(또는 멤버 변수) instance variables -> 객체가 생성될 때 생명이 시작되고, 그 객체를 참조하고 있는 다른 객체가 없으면 소멸된다.

클래스 변수(또는 정적 변수) class variables -> 객체가 생성될 때 생명이 시작되고, 자바 프로그램이 끝날 때 소멸된다. ( 아 그래서 static 사용을 남발해서는 안되는구나. 관리가 어려워지겠구만~~ )

 

+ 자바에는 가비지 콜렉터가 있어서 얘가 알아서 메모리에서 사용하지 않는 변수를 없애준다고 한다. 

 

2.변수 이름 지을 때 대문자로 시작해도 되나요?

되지 않나? 상수값을 담는 변수를 만들때 모두 대문자..

아니면 보통 소문자로 시작!

 

3. 자료형에는 기본 자료형과 어떤 자료형이 있나요?

 

크게 보면 자바에는 

기본 자료형 Primitive Data Type , 참조 자료형 Reference Data Type 두가지가 있다. 

 

참조 자료형에서는 String을 제외하고 클래스로 객체를 생성하고 초기화할 때 new 연산자를 필수로 사용해야한다. 

String bookName = new String("Basic Java"); 물론 클래스도 다음과 같이 정의해도 상관없다. 

 

4. 기본 자료형에는 몇 가지가 있나여?

 

기본 자료형은 8개다. -> 책에서 8개에 대한 드립이 나오는데 저자의 잔잔개그가 마음에 든다.ㅋㅋㅋㅋ

 

기본 자료형은 크게 

숫자, boolean 타입으로 나뉜다. 

숫자는 다시 

정수형, 소수형으로 나뉜다. 

 

정수형: byte short int long char

소수형 float Double

기타: boolean

 

char을 제외하고 해당 타입의 변수가 정해지니 "비실한 FD" "bsil FD" 로 외우라고 한다ㅋㅋㅋㅋ감사합니당...아주 잘외워집니다!!ㅋㅋㅋ

 

6. byte는 몇 비트(bit)로 되어 있나요? 

byte는 8비트의 부호가 있는 타입이다. 

 

7. byte는 왜 만들었을까요?

적은 공간에 보다 많은 내용을 저장하기 위해서! 

일번적으로 데이터 저장 목적이 아닌 계산 시에는 int나 long을 쓴다. 

그 이유는!

byte의 최대값 127

최소값 -128인데 

 

최대값에 127 에 1을 더하면 -128이 되고 

최소값에 -128dp 1을 빼면 127이 된다. 그 이유는 오버플로우 때문!

그래서 계산의 안전성 고려한 결과이다. 

 

오버플로우란? 

: 표현가능한 범위를 벗어난 값을 말하며 돌림판처럼 돌아가는 현상을 말한다. 

컴퓨터는 값을 처리해야하는데 범위에서 벗어났으니 돌아가서 다시 시작하는 것이다. 

 

그리고 컴퓨터는 0과 1로 표현하는 2진법을 따른다. 그래서 모든 자바의 숫자 타입은 2의 배수로 그 범위가 그려진다. 

Type        Bits      Range of Values
----------------------------------------------------------------------------------------
byte         8bits    -2^7 ~ 2^7-1 (-128 ~ 127)
short       16bits    -2^15 ~ 2^15-1 (-32768 ~ 32767)
int         32bits    -2^31 ~ 2^31-1 (-2147483648 ~ 2147483647)
long        64bits    -2^63 ~ 2^63-1 (-9223372036854775808 ~ 9223372036854775807)
float       32bits    0x0.000002P-126f ~ 0x1.fffffeP+127f
double      64bits    0x0.0000000000001P-1022 ~ 0x1.fffffffffffffP+1023  
char        16bits    \u0000 ~ \uffff (0 ~ 2^15-1) * 자바에서 unsgined로 동작하는 자료형 (0 ~ 65,535)
boolean      1bit     true, false

참고 : https://jdm.kr/blog/213

8. int와 long 중 어떤 타입이 더 큰 숫자를 처리할 수 있나요?

long

9. 소수점을 처리하는 타입은?

float, double 이 있다. 

이 둘은 32비트와 64비트로 제공할 수 있는 범위를 넘어서면 그 값의 정확성을 보장못해서 중요한 계산을 할 때는 써서는 안된다. 

java.math.BigDecimal이라는 클래스를 하용하면 정확한 계산을 할 수 있다. 

소수점 처리시 보통 double을 많이 사용한다. 

 

10. char은 정수형인가요?

 

char는 8비트 정수형 처리 변수로 character(문자)의 약자이다. 

그런데 문자열과 관련된 부분에서 사용된다. 

11.  a라는 것을 char로 정의할 때 어떤 기호로 감싸주어야하나요?

''

12. true 와 false 두개의 값만 가지는 타입은 ?

boolean

 

 

728x90
728x90
메소드를 부르기 전에 객체 생성해야 한다ㅏ. 

public static void main(String[] args){

System.out.println("계산기 클래스 시작");
//클래스!!  //객체이름         //생성자!
Calculator calc = new Calculator();



}

-생성자를 이용해서 객체를 만든다. 기본 생성자는 만들지 않아도 자동으로 생성해준다!-

 

 

public class Profile {
	String name;
	int age;
	
	public void setName(String str) {
		this.name = str; //결과 같다.
//		name = str; 
		
	}
	public void setAge(int val) {
		age = val;
	}
	public void printName() {
		System.out.println(name);
		
	}
    }

this연산자를 꼭 붙여야되는 줄 알았는데 아니었구나.

 

-this 연산자 필수야? 에 대한 답변 -

this연산자는 클래스 내 현재 객체를 참조하기 위한 키워드로 사용된다.

사용하지 않아도 클래스의 멤버 변수와 메서드를 참조할 수 있다.

다만 다음과 같은 경우를 위해 쓰자. 

 

package chapter03;

public class Profile {
	String name;
	int age;
	
	public void setName(String str) {
		this.name = str;

		
	}

	
	public void printName(String name) {
        System.out.println("Local variable name: " + name);
        System.out.println("Member variable name: " + this.name); // this 키워드 사용
    }


	public static void main(String[] args) {

		Profile profile = new Profile();
		String name = "Min";

		profile.setName(name);

		profile.printName("?????");
		
		

	}

}

인자값으로 받은 로컬변수를 그대로 넘겨주고 

두번째 this.name으로는 클래스의 변수값을 가져오고 있다. 

 

 

 

-클래스와 객체 구분해라~

 

??: 객체와 인스턴스 가 더 헷갈려요

 

책에서 명확한 답을 주지 않고 표현하고 있어서 개념을 더 찾아봤다.

 

클래스: 대명사 , 객체를 만들기 위한 템플릿,설계도 역할을 한다.  비슷한 동작을 가지는 객체들을 쉽게 관리할 수 있다!  ex) 자동차,,핸드폰,,

?: 정말 추상적인데요? / 네 추상화된 개념입니다. 

 

클래스에는 변수들과 메소드가 담겨있다.

 

객체클래스 타입으로 선언되었을 때를 의미한다.   ex) 자동차 아이폰 = new 자동차();   -> 아이폰 객체

 

그럼 인스턴스는?

객체가 실제 메모리에 할당되어 사용될 때 인스턴스라고 한다. 

(클래스의 인스턴스화 -> 는 클래스로 객체를 생성한 것을 의미, 실제로 구현한다는 뜻) 

 

 

"인스턴스는 일반적으로 실행중인 임의의 프로세스, 클래스의 현재 생성된 오브젝트(객체)를 가리킨다. 

객체의 인스턴스는 데이터베이스나 백그라운드 프로세스 등 광범위한 컴퓨터 시스템 자원의 접근에 할당된 물리 메모리의 일부를 가리킨다. "

"인스턴스는 객체에 포함된다 볼 수 있다. 객체 지향 언어에서의 관점은 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다. 추상적인 개념과 구체적인 객체 사이 관계에 초점을 맞출 경우에 사용된다. 객체는 클래스의 인스턴스이고, 객체 간의 링크는 클래스 간의 연관 관계의 인스턴스이며, 실행 프로세스는 프로그램의 인스턴스이다. 즉, 인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없으며, 어떤 원본으로부터 생성된 복제본을 의미한다"

 

 

 

참고

http://wiki.hash.kr/index.php/%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4

https://cooablue.tistory.com/entry/%EA%B0%9D%EC%B2%B4Object%EC%99%80-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4Instance

 

 

 

정리해봅시다 문제

 

1. 클래스와 객체의 차이점

클래스는 껍데기에 불과. 클래스를 통해 객체를 생성해서 객체의 메소드와 변수를 가져와 사용한다. 

 

2. 객체를 생성하기 위해서 꼭 사용해야하는 예약어는?

new 연산자~

 

3. 객체를 생성하기 위해서 사용하는 메소드 같이 생긴 클래스 이름에 소괄호가 있는 것은 뭐냐?

생성자요

4. 객체의 메소드를 사용하려면 어떤 기호를 객체 이름과 메소드 이름 사이에 넣어주어야하나요?

.

5. 클래스의 일반 메소드를 사용하기 위해서 어떤 것들을 만들어야하나요?

 

객체를 생성해야한다. 

728x90
728x90

1장 

 

1. 클래스란 무엇인가?

클래스는 자바의 가장 작은 단위이다. ( 클래스가 객체를 만들어주는 설계도다~라고만 이해하고 있었는데

자바는 객체 세상이구나~를 깨달으니까 이해가된다. 모든 것이 객체인 자바.)

클래스는 상태와 행동을 가지고 있다. (반드시 가져야되는건 아니다.) 상태는 필드, 행동은 메소드로 나타낸다.  

 

2. 메소드가 무엇인가?

메소드란 클래스 안에 위치한 특정 부분 코드 실행해주는 블록

메소드는 이름을 가지고 리턴값에 따른 리턴타입을 가진다. 

 

3. 메소드의 매개변수는 어디에 적어주나?

public void add (int value){

}

여기서 value값이 매개변수이다. 정의한 메소드 이름 옆에 적는다. 

4. 메소드 이름 앞에 꼭 적어 줘야하는 것은?

접근 제한자 , 리턴타입, 이다. 

6. 메소드에서 결과를 돌려주려면?

return 예약어를 쓰면 된다. 

 

예약어란 말그대로 예약된 이름이라 변수이름으로 사용할 수 없는 이름들을 말한다. 

예약어는 클래스, 변수이름, 메소드명으로 쓸 수 없다. 

 

2장 

 main() 메소드의 메소드 이름 앞에는 어떤 예약어들이 들어 가나요?

접근제어자 public, 정적 static , 리턴타입 void

 

 

메소드를 선언할 때 반드시 꼭 있어야 하는 세가지는 무엇인가요?

리턴타입 메소드 이름 메소드 내용 

728x90
728x90

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

나만 어려운 문제일 수 있다 ㅎㅎ

피보나치문제는 되게 간단하던데 이 문제는 답지를 봐도 이해가 안되어서 하나하나 적으면서 풀어봤다.

 

이해가 안갔던 이유:

계산한 값들을 배열에 저장해야된다고 생각했다. 

숫자가 인덱스라는 점이 안 와 닿았다. 

 

코드 보면서 얘기해보자~~

 

먼저 dp 다이나믹 프로그래밍은

반복적인 계산을 효율적으로 처리를 하는 알고리즘이다. 

큰문제를 작은 문제로 나누어 해결하고 그 결과를 저장해놨다가 재사용하여 중복계산을 피한다.

 

피보나치 보면 이해가 바로 가능하다

https://www.acmicpc.net/problem/2748

n = int(input())
#앞서 계산된 결과를 저장하기 위한 DP테이블 초기화
#n번째
d = [0]* (n+1)
print("d:",d)
#피보나치 수 : 0, 1, 1, 2, 3, 5....
#0,1로 시작하는 값
#인덱스 1번째 1  
d[1] =1
#반복문은 2번째부터 시작. 
for i in range(2, n+1): #2~n까지
	#1= 1+0
    d[i] = d[i-1]+ d[i-2]
    print(d[n])

 

처음 0,1을 주고 시작함!

그러면 인덱스 2, 부터 계산됨

 

 

그렇다면 이 문제.

 

 

피보나치는 더한 값들을 배열 d에 기록해서 간단했는데

이문제는 구하고자 하는 값이 횟수이다. 횟수를 기록해야한다.

 

숫자 10이 몇 번의 횟수를 거쳐 1이 되었냐~ 는 문제이다.

이 숫자 10과 횟수의 관계를 코드로 정립 못했었다..

횟수를 기록한 d배열의 인덱스가  "주어진 숫자" 역할을 했다. 그게 잘 안와닿았다.

 

즉 인덱스 3은 숫자 3. 그러면 인덱스 3에 횟수를 기록하게 되는 것이다. 

 

횟수를 기준으로 하니, 현재 횟수가 이전횟수 + 1이다라는게 겨우 이해되었다.

 

숫자가 2나 3으로 나눠지는 경우 : 예) 숫자가 6이면 "이전5의 횟수+ 1"을 하면 4가 되는데, 숫자 6은 2로 나눠지기때문에
최솟값으로 비교를 한다. "이전5의 횟수+ 1"  과 "d[6//3] 즉 d[2] 숫자2의 횟수에 1을 더한 값"을 비교하는 것이다.

나는 하나하나 값 넣어서 적어보면서 이해했다 ㅎㅎㅎ

# 답지
# n = int(input())
n = 10
print('n',n)
 
#계산한 횟수를 저장하는 용이래!!!
d = [0] * (n+1) 
print("d",d)

for i in range(2, n+1):  #2부터하는이유는0,1은 나누어떨어지지 않아서 횟수가 걍 0이라서!
    d[i] = d[i-1] +1 #더하기 1을 하는 이유는 기존횟수느 = 이전 횟수에 + 1 식 늘어나니까. 
   #i가 3으로 나눠지는 값이면 
    if i %3 == 0:
        #숫자 3의 횟수는 = 이전 횟수에 하나더한 횟수거나, 3으로 나눈 값의 횟수에 하나 더한 횟수! 둘중에 더 작은 값!
        d[i] = min(d[i], d[i//3]+1)
        print("3d[i]:", d[i])
    if i%2 == 0:
        d[i] = min(d[i], d[i//2]+1)

 
print(d[n])

 

 

 

 

728x90
728x90

다른 분들의 코드를 찾아보면서도 이해가 안되었는데 역시 직접 찍어가면서 하는게 제일 빠르다. 

물론 나는 답지를 보면서 ㅎㅎ

 

문제 이해를 잘못해서 엄청 헤멨다.

Magic square 마방진

 

마방진이란?

가로의 숫자들 더한 값,

세로의 숫자들 더한 값,

대각선숫자들 더한 값이 모두 같은 사각형!

 

문제가 요구하는 바:

https://www.hackerrank.com/challenges/magic-square-forming/problem?isFullScreen=true 

 

Forming a Magic Square | HackerRank

Find the minimum cost of converting a 3 by 3 matrix into a magic square.

www.hackerrank.com

input값으로 만든 행렬을 마방진으로 만들어서 두 행렬을 비교하고

바뀐 값들의 차 중에 가장 작은 수들를 더해서 출력!

 

1. 먼저 주어진 값을 마방진으로 만들어야 한다!

근데 우리는 가장 작은 수들을 찾기를 윈해서 모든 경우의 마방진을 만들어봐야했다.

 

여기서 배운 파이썬 함수

permutations

순열을 만들어주는 함수다. 

(순열이란, 조합과 달리 순서를 고려해 나열한 경우의 수를 말한다)

 

먼저 인풋 값 자체를 코드로 체크할 수 있게 정리해줬다 

이 인풋값을 차례로 넣어줬다. 

그결과 X = [5,3,4,1,5,8,6,4,2]가 되었다. 

지금은 이것은 마방진이 아니다. 

마방진으로 만들기 위해 모든 순서의 경우의 수를 만들어보자. 

1부터 9까지! 

for문 안에 P를 찍어보면 엄청많다

등등..

여기서 마방진 조건에 맞는 애들을 찾아주자. 

가로끼리 더한 값이 15

세로끼리 더한 값이 15

대각선끼리 더한 값이 15

 

파이썬 코드에 익숙하지 않아서 이 조건을 이해하는데 좀 걸렸다. 

p(0:3) 은  인덱스0,1,2라는 뜻이다. 위 인풋모양 생각하면 맨 위의 가로 한면! 여기 sum() 이 감싸니까 즉, (8 +3+4)

p(3:6)은  인덱스 3,4,5 맨 오른쪽 세로 한면 (4+9+2)

p(0::3) 이건 p배열에서 p[0]에서 시작해서 세칸씩 이동한 값  p = [8,3,4,1,5,9,6,7,2 ] 이므로 (8+1+6)

p(1::3) 얘도 같음 (3+5+7)

대각선도 다 더해서 15여야함

P[0] + P[4] + P[8] == 15 

P[2] + P[4] + P[6] == 15)

P[-3::] 이건 뒤에서 3번째에서 끝까지 더한 값 (6+7+2)

 

 

 

 

 

이렇게 마방진 조건을 다 갖춘P와 기존인풋이었던 X의 차

둘이 그냥 빼는게 아니라 모든 인덱스의 값들을 비교해서 빼야해서 

range(0,9)  for문으로 0부터 8인덱스까지 비교해서 빼줌

abs() 로 감싼이유는 만약에 2-3 나오면 음수니까 양수로 만들어주려고 씀. 

그 차리르 다 더한 값 중에 가장 작은  값으로~ min()

 

"Ans가 또 들어가는 이유는 for 루프를 통해 permutations의 모든 경우를 탐색하면서 최소값을 찾기 위해서입니다.

for 루프는 permutations(range(1,10))를 통해 1부터 9까지의 숫자로 이루어진 순열을 하나씩 가져옵니다. 각 순열을 P로 표현하고, 조건문을 통해 해당 순열이 마방진(magic square)의 조건을 만족하는지 확인합니다.

만약 조건을 만족하는 마방진이라면, sum(abs(P[i] - X[i]) for i in range(0,9))를 통해 해당 마방진과 주어진 X 리스트와의 차이의 합을 계산합니다. 그리고 이 값을 기존의 Ans와 비교하여 작은 값으로 Ans를 갱신합니다.

따라서, for 루프를 통해 모든 경우를 탐색하면서 찾은 최소 차이의 합을 Ans에 저장하게 됩니다."

 

 

from itertools import *

X = []
X.extend(list(map(int,input().split())))
X.extend(list(map(int,input().split())))
X.extend(list(map(int,input().split())))

Ans = 81
for P in permutations(range(1,10)):
   
    if sum(P[0:3]) == 15 and sum(P[3:6]) == 15 and sum(P[0::3]) == 15 and sum(P[1::3]) == 15 and P[0] + P[4] + P[8] == 15 and (P[2] + P[4] + P[6] == 15) and  sum(P[-3::]) == 15:
        # print("PPPP:",P) #P is magic square
        Ans = min(Ans, sum(abs(P[i] - X[i]) for i in range(0,9)))
print(Ans)
728x90
728x90
import sys
sys.stdin = open('1920.txt','r')
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
M = int(input())
array = list(map(int, input().split()))

A.sort()
for num in array:

    lft, rt = 0, N-1
    isExist = False
    while lft <= rt:
        mid = ( lft+ rt ) //2
        if num == A[mid]:
            print(1)
            isExist =True
            break
        elif num < A[mid]:
            rt = mid -1 
        elif num >A[mid]:
            lft = mid +1
        
    if not isExist:
        print(0)

변수를 정하고 하는 것부터 적응이 안되었음

 

입력값 변수로 만들어 놓고

출력값 똑같이 나오도록 짜야하는데

 

문제 보고 이진탐색으로 하면 되겠다!

는 알았는데 

" 이 수들이 A안에 존재하는지 알아내면 된다. "

이부분이 이해가 안갔었다.

 

 

5
4 1 5 2 3
5
1 3 7 9 5

A리스트를 정렬해서 순서대로 해놓고

거기서 array의 값들을 하나하나 찾아보는 방식!

A안에 존재하면 1

없으면 0

 

이진탐색 방법으로 할것이고 

array전체를 돌기때문에 for문

 

 

https://velog.io/@deannn/BOJ-%EB%B0%B1%EC%A4%80-1920%EB%B2%88-%EC%88%98-%EC%B0%BE%EA%B8%B0-Python

 

----

 

참고

c = '1,2'

# print(list(map(int, c.split(',')))) #split은 문자열에만 된다. 배열을 하고 싶으면 join

#결과

[1,2] 

 

 

728x90

+ Recent posts