HwangHub

[코드트리/자바] NM.시뮬2.만나는 그 순간 본문

workspace/알고리즘

[코드트리/자바] NM.시뮬2.만나는 그 순간

HwangJerry 2023. 7. 12. 11:05

풀이

package 코드트리.시뮬레이션.배열기록;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.stream.IntStream;

public class 만나는순간 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        List<Integer> aList = new ArrayList<>();
        List<Integer> bList = new ArrayList<>();
        String d;
        int t;
        int idx = 0;
        int jdx = 0;

        // initialize lists
        aList.add(0);
        bList.add(0);

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            d = st.nextToken();
            t = Integer.parseInt(st.nextToken());
            if (d.equals("R")) {
                for (int j = 0; j < t; j++) {
                    aList.add(aList.get(idx++) + 1);
                }
            } else {
                for (int j = 0; j < t; j++) {
                    aList.add(aList.get(idx++) - 1);
                }
            }
        }
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            d = st.nextToken();
            t = Integer.parseInt(st.nextToken());
            if (d.equals("R")) {
                for (int j = 0; j < t; j++) {
                    bList.add(bList.get(jdx++) + 1);
                }
            } else {
                for (int j = 0; j < t; j++) {
                    bList.add(bList.get(jdx++) - 1);
                }
            }
        }
        br.close();
        boolean isNoAns = true;
        for (int i = 1; i < aList.size(); i++) {
            if (aList.get(i).equals(bList.get(i))) { // edited
                System.out.println(i);
                isNoAns = false;
                break;
            }
        }
        if (isNoAns) {
            System.out.println(-1);
        }
    }
}

위 로직 중에서 //edited로 표시된 부분이 원래 aList.get(i) == bList.get(i) 로 표시되어 있었다. 하지만 위의 list는 제네릭 클래스타입이고, 위 코드에서는 Integer라는 wrapper class를 갖고 있으므로 엄연히 int와는 다른 개념이다.

레퍼런스 타입을 ==로 비교하는 것은 의도와 다르게 흘러갈 경우가 많다. 결국은 값 비교가 아니라 주소 비교를 하고 있는 거고, 이는 우연하게도 그 할당된 값이 유사할 수 있으나, 값이 똑같아도 주소값이 다를 수 있는 경우는 상당히 많으므로 주의가 필요하다.

 

교훈 : List에 wrapper class 등의 클래스 타입을 넣어서 활용할거면 동등 비교시 .equals()를 사용하자.

 

참조 : https://coding-factory.tistory.com/536

 

[Java] 문자열 비교하기 == , equals() 의 차이점

Java에서 int와 boolean과 같은 일반적인 데이터 타입의 비교는 ==이라는 연산자를 사용하여 비교합니다. 하지만 String처럼 Class의 값을 비교할때는 ==이 아닌 equals()라는 메소드를 사용하여 비교를 합

coding-factory.tistory.com

 

Comments