728x90

프로그레스 배열이 주어지고 진행 속도 배열이 주어진다. 

프로그레스가 100이 되면 배포할 수 있는데 , 순서에 따라 배포할 수 있기 때문에 

앞의 프로그레스가 100이 되지 않으면 뒤의 프로그레스는 100이 되어보 배포될 수 없다. 

그래서 앞에서부터 순서대로 기능이 완성되어 배포할 때 한번에 여러개가 동시에 배포될 수 있다. 

매번 배포할 때마다 몇개의 완성된 기능이 배포되는지 반환 

 

일단 하루가 지나면 프로그레스의 모든 기능들은 스피드만큼 프로그레스가 증가한다. 

그리고 매일 프로그레스가 100이 넘었는지 확인해주고 넘었으면 다음 프로그레스도 함께 확인하고 

다음 프로그레스가 100이 아닌 것을 확인했을 때, 그때까지 100이 넘어 배포해야할 프로그레스의 개수를 list에 넣는다. 

 

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

progresses[i] += speeds[i];

}

매일 모든 프로그레스가 스피드만큼 증가

 

if (progresses[j] >= 100) {

count++;

continue;

}

프로그레스가 100이 넘었는지 확인하고 넘었으면 배포할 개수 count를 증가시키고 다음 프로그레스도 확인한다. 

 

카운트가 0 이 아니라면 ( 배포해야할 순서의 프로그레스가 100이 넘었다면 ) list에 count를 추가하고 다시 카운트를 0으로 초기화한다. 

if (count != 0) {

answer.add(count);

count = 0;

}

 

 

 

전체풀이

public ArrayList<Integer> solution(int[] progresses, int[] speeds) {

ArrayList<Integer> answer = new ArrayList<Integer>();

int count = 0;

for (int j = 0; j < progresses.length; j++) {

if (progresses[j] >= 100) {

count++;

continue;

} else {

j--;

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

progresses[i] += speeds[i];

}

}

if (count != 0) {

answer.add(count);

count = 0;

}

}

if (count != 0) {

answer.add(count);

}

return answer;

}

j를 감소시키는 이유는 프로그레스가 100이 넘지 않았는데 다음 프로그레스를 확인하면 안되기 때문에 다시 j를 감소시키고 하루가 지났다 가정하고 모든 프로그레스를 스피드만큼 증가시키고 재확인할 수 있게 해준다. 

 

마지막 남은 프로그레스가 100이 되면 count를 증가시킨 후  continue로 빠져나와 list에 추가하지 못하기 때문에 

for문을 빠져나온 후 한번더 list에 추가해준다. 

 

 

'Java > Coding Test' 카테고리의 다른 글

카펫 문제 풀이  (0) 2023.10.06
올바른 괄호 문제 풀이  (1) 2023.10.05
크레인 인형뽑기 게임 문제 풀이  (0) 2023.10.04
로또의 최고 순위와 최저 순위 문제 풀이  (0) 2023.10.04
다트 게임 문제 풀이  (0) 2023.10.04
728x90

중앙은 노란색으로 칠해져있고 테두리 한줄만 갈색으로 칠해져있다.

갈색 타일의 개수와 노란색 타일의 개수가 주어질 때 가로 >=세로의 길이를 배열로 반환 

 

각 타일의 정사각형 넓이 1이므로 갈색과 노란색 타일의 합은 전체 직사각형의 넓이가 나온다. 

직사각형의 넓이는 가로*세로 이므로 

brown+yellow = answer[0]*answer[1] 과 같다. 

 

yellow는 중앙의 직사각형이므로 yellow의 가로 세로 길이는 yellow의 약수이다. 

 

곱하여 yellow가 되는 두 약수에 각각 가로, 세로 1씩 총 2를 더한 값이 전체 크기의 가로와 세로이다.

 

 

 

public int[] solution(int brown, int yellow) {

int[] answer = new int[2];

//brown+yellow = return[0]*return[1]

//yellow의 약수 (2,1)이라하면 약수 세트 가로와 세로에 각각 2씩 더한 값이 리턴

for(int i=1; i*i<=yellow;i++){

if(yellow%i==0){

int r = i;

int l = yellow/i;

if((r+2)*(l+2)==brown+yellow){

answer[0] = Math.max(r+2,l+2);

answer[1] = Math.min(r+2,l+2);

return answer;

}

}

}

return answer;

}

728x90

괄호가 ()로 바르게 짝지어졌으면 올바른 괄호 true 반환 그렇지 않으면 false 반환 

boolean solution(String s) {

boolean answer = true;

Stack<Character> stack = new Stack<>();

if(s.startsWith(")")||s.endsWith("(")||s.length()%2==1)return false;

char[] arr = s.toCharArray();

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

if(!stack.isEmpty()&&stack.peek()=='('&&arr[i]==')')stack.pop();

else stack.add(arr[i]);

}

if(stack.size()!=0)answer=false;

return answer;

}

stack의 peek 메소드로 맨 위 문자를 확인하여 ( 이고 다음 넣을 원소가 ) 이면 stack에서 꺼내고 

마지막에 스택이 비었으면 올바른 괄호인다. 

 

테스트 케이스는 통과하지만 효율성 검사에서 시간초과로 실패한다. 

)로 시작하거나 (로 끝나거나 문자의 개수가 홀수이면 짝을 지을 수 없어 계산할 필요 없이 false 반환하게 하였더니 성공 

 

boolean solution2(String s) {

boolean answer = false;

int count = 0;

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

if(s.charAt(i) == '('){

count++;

}

if(s.charAt(i) == ')'){

count--;

}

if(count < 0){

break;

}

}

if(count == 0){

answer = true;

}

return answer;

}

스택을 사용하지 않고 배열로만 문제를 푸는 방법 

count가 음수가 된다는 것은 위에서 )로 시작한다는 것과 같은 이야기이다. 

'Java > Coding Test' 카테고리의 다른 글

기능 개발 문제 풀이  (0) 2023.10.07
카펫 문제 풀이  (0) 2023.10.06
크레인 인형뽑기 게임 문제 풀이  (0) 2023.10.04
로또의 최고 순위와 최저 순위 문제 풀이  (0) 2023.10.04
다트 게임 문제 풀이  (0) 2023.10.04
728x90

정사각형 모양의 틀에 여러 종류의 인형이 있고 1~5번 라인 중 몇번으로 이동해서 인형을 가져오는지 moves를 배열로 주어주면 인형을 가져와서 바구니에 담는다. 

이때 바구니의 맨 윗 인형과 내가 가져온 인형이 같은 종류라면 인형들을 없애고 없어진 인형의 수만큼 점수로 획득한다. 

public int solution(int[][] board, int[] moves) {

int answer = 0;

Map<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();

for (int i = board.length - 1; i >= 0; i--) {

for (int j = 0; j < board[i].length; j++) {

if (board[i][j] == 0)

continue;

ArrayList<Integer> temp = map.getOrDefault(j, new ArrayList<Integer>());

temp.add(board[i][j]);

map.put(j, temp);

}

}

 

ArrayList<Integer> stack = new ArrayList<>();

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

if (map.get(moves[i] - 1).size() != 0) {

ArrayList<Integer> temp = map.get(moves[i] - 1);

if (stack.size() > 0 && stack.get(stack.size() - 1) == temp.get(temp.size() - 1)) {

answer += 2;

stack.remove(stack.size() - 1);

} else {

stack.add(temp.get(temp.size() - 1));

}

temp.remove(temp.size() - 1);

map.put(moves[i] - 1, temp);

}

}

return answer;

}

1~5열까지 ArrayList를 각각 가지고 ArrayList에는 각 열에 담긴 인형들의 종류를 int로 가지고 있다. 

stack은 뽑은 인형을 담는 바구니이다.

인형을 뽑아 stack의 윗 부분을 확인해서 같으면 stack의 윗부분을 없애고 점수를 2점 얻는다

그리고 인형을 뽑을 때마다 map에서 ArrayList를 수정해준다. 

'Java > Coding Test' 카테고리의 다른 글

카펫 문제 풀이  (0) 2023.10.06
올바른 괄호 문제 풀이  (1) 2023.10.05
로또의 최고 순위와 최저 순위 문제 풀이  (0) 2023.10.04
다트 게임 문제 풀이  (0) 2023.10.04
실패율 문제 풀이  (0) 2023.10.01

+ Recent posts