1. 문제

주어진 정수 n과 start로 각각 배열의 갯수, 배열의 시작 값으로 하여 모든 요소에 대한 XOR값을 반환한다.

 

2. 풀이

시작값 정수를 저장 후 해당 정수에 n-1사이즈의 배열에서 시작값+(2*i)부터 각각 XOR하여 계산한다.

 

 

3. 코드

Code Link

1. 문제

주어진 두 함수를 통해 주차 시스템을 설계한다. 주차장에는 대형, 중형, 소형 세 종류의 주차 공간이 있으며 최초 ParkingSystem 함수를 통해 고정 주차 수를 제공한다.

이후 addCar를 통해 각 종류의 차량이 주차 가능하면 주차 후 true를 주차가 불가능 하면 false를 반환하도록 한다.

 

2. 풀이

최초 클래스 생성 시 각 차량의 종류별 최대 주차수, 현재 주차수를 알 수 있는 map를 생성하여 addcar 함수가 호출 될 경우 map에서 비교, 수정하여 boolean값을 반환한다.

 

 

3. 코드

Code Link

1. 문제

현재 보유한 돌 S에서 보석의 종류를 나타내는 문자열 J에 포함된 보석이 얼마나 포함되어 있는지 수를 구하여 반환한다.

 

2. 풀이

문자열 S의 각 문자를 문자열 J의 각 문자로 비교 하여 같은 경우의 수를 구하여 반환

 

 

3. 코드

Code Link

1. 문제

주어진 배열 nums를 아래와 같이 각 항의 값이 같은 경우의 수를 구하여 반환한다.

 

2. 풀이

for문을 통해 첫항부터 마지막 까지 항의 수를 비교 하여 그 값이 같을 경우의 수를 구한다.

 

3. 코드

Code Link

1. 문제

2n 사이즈의 배열 [x1,x2,...,xn,y1,y2,...,yn]을 아래와 같이 [x1,y1,x2,y2,...,xn,yn]로 변경하여 반환하라 .

 

 

2. 풀이

n만큼 for문을 돌며 배열에 2항목씩 x, y를 순서대로 넣어서 반환한다.

 

 

3. 코드

Code Link

1. 문제

주어진 배열 nums을 아래와 같이 각 누계를 구하여 반환한다.

 

 

2. 풀이

전체 배열을 각 항의 값을 배열의 0번부터 자기 자신의 값까지 합을 구하여 반환 하도록 한다.

 

 

3. 코드

Code Link

1. 문제

N개의 정수로 구성되어 0과 1로 이루어진 비어있지 않은 배열 A는 도로상의 연속적인 차량의 방향을 나타내며 0은 동쪽(P)으로, 1은 서쪽(Q)으로 향하는 차량이다.

이 때 0 <= P < Q < N 인 한 쌍의 차량 (P, Q)가 지나가며 이러한 차량 수를 반환하면 된다.

예를 들어 A배열이 {0, 1, 0, 1, 1}일 경우 (0, 1), (0, 3), (0, 4), (2, 3), (2, 4)의 다섯 쌍의 지나가는 차량 5를 반환하면 된다.

단, 지나가는 차량의 쌍이 1,000,000,000을 초과하면 -1를 반환한다.



2. 풀이

지나가는 차량 (P, Q)를 만들기 위해 동쪽(0)를 기준으로 서쪽(1)으로 지나가는 차량의 수를 차례로 셈하여 더하면 된다.

이를 위해 최초 배열에서 서쪽(1)으로 가는 차량의 수를 셈하여 저장하고 배열을 반복하여 0일 경우 이후 1의 전체수를 더하고 1일 경우엔 전체 1의 수를 하나씩 빼면 된다.



3. 결과

Task Score : 100%

Correctness : 100%

Performance : 100%



4. 코드

PassingCars Code

1. 문제

N개의 정수를 포함한 A배열에 포함되지 않은 0보다 큰 가장 작은 양의 정수를 반환

단, 음의 정수만 있을 경우 1을 반환. [1, 2, 3]과 같은 경우 4를 반환



2. 풀이

최소 반환 값이 1이기 때문에 초기 값을 1로 한 반환 변수를 세팅.

A배열을 정렬 후 음의 정수를 버리고 양의 정수를 반환 변수와 차례로 비교하여 같을 경우 반환 변수를 1씩 증가 시키고 다를 경우 해당 양의 정수가 없다고 판단하여 그 값을 반환.

단, 같은 수의 양의 정수가 있을 수 있기 때문에 현재 반환 변수보다 1작은 값도 무시하도록 함.



3. 결과

Task Score : 100%

Correctness : 100%

Performance : 100%



4. 코드

MissingInteger Code

1. 문제

0으로 채워진 크기가 N인 배열에 제공되는 A[K] 배열을 값을 순차적으로 아래 두가지 경우를 적용하여 나온 최종값을 리턴.

 1. A[K]의 값이 1보다 크거나 같고, N보다 작거나 같으면 크기가 N인 배열의 A[K] 위치의 값을 1 증가

 2. A[K]의 값이 N+1일 경우 크기가 N인 배열의 최대 값으로 모든 값을 변경



2. 풀이

주어진 N 값으로 N크기의 배열을 생성 후 제공되는 A배열의 크기만큼 반복하여 그 값이 1보다 크거나 같고 N보다 작거나 같을 경우엔 N배열의 해당 위치를 1증가 시키고, N+1일 경우엔 모든 값을 현재 N배열의 최대값으로 채움.

단, N+1일 경우 매번 최대값을 체크하면 Performance에 좋지 않기 때문에 값 대입전 최대값과 비교하도록 함.


public int[] solution(int N, int A[]) {

int[] rdata = new int[N];

int max_num = 0;


for (int i=0; i<A.length; i++) {

if (1 <= A[i] && A[i] <= N) {

max_num = Math.max(++rdata[A[i] - 1], max_num);

} else if (A[i] == N+1) {

Arrays.fill(rdata, max_num);

}

}


return rdata;

}


이렇게 하고 테스트를 진행하였더니 Correctness는 100%이지만 Performance가 77%밖에 안나옴.

역시 중급이라 Performance에 더 신경을 써야함.

Performance를 높이기 위해 N+1일 경우 매번 배열을 채우는 로직을 변경해야 할 것 같아 심히 고민...

고민...

고민... 끝에 N+1일 경우 최대값을 채우지말고 매번 최대값을 기억하여 자기 차례가 됬을 때 최대값보다 작으면 최대값에+1를 하도록 하기로 함.

그런데 이러할 경우 마지막 N+1이후에 값들도 값이 변하게 됨.

더 고민 끝에 현재의 최대값과 이전 마지막 최대값을 따로 두고 최대값은 최대값대로 체크, 실제 값을 증가시킬 때는 마지막 최대값으로 비교 후 증가시킴.

그리고 N+1일 경우에 마지막 최대값을 계속 체크했던 최대값으로 변경해 주면 됨.




3. 결과

Task Score : 100%

Correctness : 100%

Performance : 100%



4. 코드

MaxCounters Code

1. 문제

작은 개구리가 강 건너편 위치 (X+1)에 도착하기 위해 강 표면에 떨어진 잎이 필요하다. N개의 정수로 구성된 배열 A[K]에서 시간 K마다 해당 위치에 잎이 떨어진다.

개구리가 건너편으로 도착한다면 그 최단 시간을, 도착하지 못한다면 -1를 반환하라.



2. 풀이

최단 시간을 구하기 위해 배열 A가 1부터 X까지의 모든 값을 포함한 최소 K값을 구해야 한다.

이를 위해 배열에 X이하의 값만 넣어 X이하의 모든 값이 포함 되었을 때 그 K값을 return하고 그렇지 않을 경우 -1를 return하면 된다.

모든 값이 포함되었는지 판단하기 위해 중복되지 않는 값을 넣을 수 있는 HashSet를 사용하며 순서대로 값을 넣고 매번 그 size가 X인지 체크하면 모든 값이 포함되었는지 알아낼 수 있다.



3. 결과

Task Score : 100%

Correctness : 100%

Performance : 100%



4. 코드 및 테스트 코드

FrogRiverOne Code

+ Recent posts