[개발일지]210805_TIL : Java 입력, Map의 활용,변수 scope

Gooder·2021년 8월 5일
2

개발일지

목록 보기
8/28

알고리즘

문제 풀 때 배열형태의 Input을 받는 방법

정수 형태의 데이터가 들어있는 배열을 예시로 들겠습니다.

Input에 공백을 포함한 경우

  1. StringTokenizer
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

StringTokenizer st = new StringTokenizer(br.readLine()," ");
long[] input = new long[2];
int t = 0;
while(st.hasMoreTokens()){
    input[t++] = Long.parseLong(st.nextToken());
}
  1. Split(“ “)
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[][] input = new String[H][W];
int endPoint = 0;
for(int i = 0;i<H;i++){
    ladder[i] = br.readLine().split(" ");
}
//위 과정 후에 데이터를 다룰 때, Integer.parseInt()를 이용해줘야한다.

Input에 공백을 포함하지않는 경우

  1. toCharArray()
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[][] input = new String[R][C];
int endPoint = 0;
for(int i = 0;i<R;i++){
    input[i] = br.readLine().toCharArray();
}
//위 과정 후에 데이터를 다룰 때, 정수로 바꿔주는 과정이 필요하다.

자료구조의 사용

쌍을 이루는 자료형이 서로 짝이 맞는지 확인할 때, Map에 key,value 값으로 저장해서 관리하면 반복되는 코드 작성을 줄일 수 있다.

객체 생성 위치의 중요성

다음의 2개의 코드는 언뜻보기에는 같은 기능을 하는 것처럼 보이지만 그 결과는 완전히 다르다.
코드 1

Stack<int[]> stack = new Stack<>();
int[] temp = new int[2];
int count = 1;
while(count<10){
	temp[0] = count*2;
    	temp[1] = count*3;
	stack.push(temp);
    	count++;
}
while(!stack.isEmpty()){
	int[] t = stack.pop();
        System.out.print("t[0] = " + t[0] + " ");
        System.out.println("t[1] = " + t[1] + " ");
}
           

코드 2

Stack<int[]> stack = new Stack<>();
int count = 1;
while(count<10){
	int[] temp = new int[2];
	temp[0] = count*2;
    	temp[1] = count*3;
	stack.push(temp);
    	count++;
}
while(!stack.isEmpty()){
	int[] t = stack.pop();
        System.out.print("t[0] = " + t[0] + " ");
        System.out.println("t[1] = " + t[1] + " ");
}

실행 결과

둘의 결과가 차이나는 이유는 무엇일까??
그 이유는 자바가 객체를 저장하는 방식에 있다.
자바는 객체를 어딘가에 저장할 때, 객체 그 자체를 저장하는 것이 아니라 그 객체의 참조값을 저장한다.
그렇기 때문에 코드 1과 코드 2의 스택에는 다음과 같이 데이터가 들어있을 것이다.(이해를 돕기위한 예시일 뿐, 실제 주소체계가 아래와 같다는 뜻은 아니다.)

위와 같이 코드 1에는 스택에 들어온 순서만 다를 뿐 모두 같은 참조변수를 담고있기 때문에, stack에서 pop을 한 후 출력하면 모두 같은 결과가 나오는 것이다.

객체를 다룰 때에는 반드시 객체를 생성하는 위치를 신경써야한다.

profile
세상을 변화시킬 신스틸러 서비스를 만들고싶은 개발자 Gooder 입니다.

0개의 댓글