본문 바로가기

공부해 codingTest

프로그래머스 JAVA Level 1. 같은 숫자는 싫어

Level 1. 같은 숫자는 싫어

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

통과

시간초과

 

배열이 주어졌을 때 숫자가 연속되는 구간마다 연속되는 숫자 중 1개만 남기는 작업을 반복하고,

남은 요소들을 순서대로 반환하는 문제이다.

 

처음에는 반복문으로 중복을 제거하는 메소드를 호출했다.

그러다보니 반복문안에서 또 반복문(중복제거 메소드 안의 반복문)이 돌아가는 문제가 생겼고, 시간초과가 됐다.

 

그래서 HashSet을 이용해 반복문을 하나로 통합했다.

HashSet은 중복이 아닌 값을 add하면 값을 저장하고 true를 반환하고,

중복인 값을 add하면 값을 저장하지 않고 false를 반환한다.

 

(1) 반복문 안에서 if문을 선언하고 HashSet에 값을 add하는 조건을 작성한다.

(2) 저장이 성공하는 경우 List에도 해당 값을 add한다.

(3) 저장이 실패하는 경우 List에 저장되어있는 마지막 값과 비교하여 같지 않으면 List에만 해당 값을 add한다.

 

만약 주어진 배열이 {1,1,3,1}일 때, HashSet hs에 순서대로 add하는 경우를 살펴보면 이렇다.

hs.add(1)인 경우 hs에 1이 저장되어 있지 않아서 hs에 1이 저장된다.

그리고 if문의 조건을 만족하기 때문에 List list에도 1을 저장한다.

 

다음으로 hs.add(1)인 경우 hs에 이미 1이 저장되어 있어서 hs에 1이 저장되지 않는다.

그리고 if문의 조건을 만족하지 못해서 else문으로 넘어간다.

이 때 list의 사이즈가 0보다 큰 경우 list의 마지막 값을 가져와서 1과 비교한다.

list의 마지막 값이 1이므로 list에 저장되지 않는다.

 

다음으로 hs.add(3)인 경우 hs에 3이 저장되어 있지 않아서 hs에 3이 저장된다.

그리고 if문의 조건을 만족하기 때문에 list에도 3을 저장한다.

 

마지막으로 hs.add(1)인 경우 hs에 이미 1이 저장되어 있어서 hs에 1이 저장되지 않는다.

그리고 if문의 조건을 만족하지 못해서 else문으로 넘어간다.

이 때 list의 사이즈가 0보다 큰 경우 list의 마지막 값을 가져와서 1과 비교한다.

list의 마지막 값이 3이므로 list에 1을 저장한다.

 

포인트는 리스트의 마지막 값을 list.get(list.size()-1)로 가져오는 것이다.