티스토리 뷰

알고리즘, 코딩테스트

Cos Pro 1급 java (8~15)

몰라모르겠어요 2022. 9. 12. 15:22

8. 누가 당선 되나요

1번부터 N번까지 후보에 대해서 투표를 진행했습니다. 예를 들어 투표 결과가 [1, 5, 4, 3, 2, 5, 2, 5, 5, 4]라면 순서대로 [1번, 5번, 4번, 3번, 2번, 5번, 2번, 5번, 5번, 4번] 후보에 투표했음을 나타냅니다. 이때, 가장 많은 표를 받은 후보의 번호를 구하려고 합니다.

 

주어진 solution 메소드는 후보의 수 N과 투표를 진행한 결과가 담긴 배열 votes가 매개변수로 주어졌을 때, 가장 많은 표를 받은 후보의 번호를 return 하는 메소드입니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 _**한 줄**_만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
import java.util.*;

class Main{
	public int[] solution(int N, int[] votes){
    	
        int voteCounter[] = new int[11];//N(후보의 수)는 1이상 10 이하
        //해당 인덱스(후보)에 따라 1 더한다.(각 후보에 따른 투표 수 구하기)
        for(int i=0; i < votes.length; i++){
        	voteCounter[votes[i]] += 1;
        }
        //후보 수는 1이상이므로 1부터 시작
        //가장 많이 투표 받은 값 구하기, 값이 같으면 카운트만 증가
        int maxVal = 0;
        int cnt = 0;
        for(int i=1; i <= N; i++){
            if(maxVal < voteCounter[i]){
                maxVal = voteCount[i];
                cnt = 1;
            }
            else if(maxVal == voteCounter[i]){
                cnt += 1;
            }
        }
        //위에서 구한 카운트만큼 정답 반환(가장 많이 투표 받은 값)
        //가장 많이 투표받은 후보자 구하기(i 반환)
        int answer[] = new int[cnt];
        for(int i=1, idx=0; i <= N; i++){
            if(voteCounter[i] == maxVal){
                answer[idx] = i;
                idx += 1;
            }
        }
        return answer;
    }
}

 

9. 계단 게임

두 학생 A와 B는 계단 게임을 하였습니다.
계단 게임의 규칙은 아래와 같습니다.
1. 계단 제일 아래에서 게임을 시작합니다. (0번째 칸)
2. 가위바위보를 합니다.
3. 이기면 계단 세 칸을 올라가고, 지면 한 칸을 내려가고, 비기면 제자리에 있습니다.
4. 계단 제일 아래에서 지면 제자리에 있습니다.
5. 2~4 과정을 열 번 반복합니다.
A와 B가 계단 게임을 완료한 후에, A가 계단 위 몇 번째 칸에 있는지 파악하려고 합니다.
A와 B가 낸 가위바위보 기록이 순서대로 들어있는 배열 recordA와 recordA의 길이 recorrdA_len, recordB, recordB의 길이 recordB_len이 매개변수로 주어질 때, 게임을 마친 후의 A의 위치를 return 하도록 solution 함수를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
import java.util.*;

class Main{
	//가위 바위 보에서 이기려면 0(가위)이 들어오면 1(바위)을 내야 이김..이런 식
    public int func(int record){
        if(record == 0)
            return 1;
        else if(record == 1)
            return 2;

        return 0;
    }
    
    public int solution(int[] recordA, int[] recordB){
    	int cnt = 0;
        
        for(int i=1; i < recordA.length; i++){
            if(recordA[i] == recordB[i])//가위바위보 비기면 계속 진행
                continue;
            else if(recordA[i] == func(recordB[i]))//b를 이기면
                cnt = cnt + 3;//3칸 올라감
            else
                cnt = cnt - 1;//지면 한 칸 내려감
        }
        return cnt;
    }
}

 

10. 주식으로 최대 수익을 내세요

지난 연속된 n일 동안의 주식 가격이 순서대로 들어있는 배열이 있습니다. 이때, 다음 규칙에 따라 주식을 사고 팔았을 때의 최대 수익을 구하려 합니다.
  • n일 동안 주식을 단 한 번 살 수 있습니다.
  • n일 동안 주식을 단 한 번 팔 수 있습니다.
  • 주식을 산 날에 바로 팔 수는 없으며, 최소 하루가 지나야 팔 수 있습니다.
  • 적어도 한 번은 주식을 사야하며, 한 번은 팔아야 합니다.
주식을 팔 때는 반드시 이전에 주식을 샀어야 하며, 최대 수익은 양수가 아닐 수도 있습니다.
연속된 n 일 동안의 주식 가격이 순서대로 들어있는 배열 prices와 배열의 길이 prices_len이 매개변수로 주어질 때, 주식을 규칙에 맞게 한 번만 사고팔았을 때 얻을 수 있는 최대 수익을 return 하도록 solution 메소드를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 코드가 올바르게 동작하지 않습니다. 주어진 코드에서 한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정해주세요.
import java.util.*;

class Main{
	int solution(int[] prices){
    	int inf = 1000000001;//한계값(prices 각 원소는 최대 1,000, 길이는 1,000,000개)
        int tmp = inf;//나올 수 있는 최대 + 1
        int answer = -inf;//나올 수 있는 최소 - 1;
        
        for(int price : prices){
            if(tmp != inf)//다르다면 처음 값이 아니겠쥐
                answer = Math.max(answer, price - tmp);//최대로 많이 차이 나는 값 구하기
            
            tmp = Math.min(tmp, price);//price가 젤 작은 값을 찾아서 prices 돌려가며 빼서 최대 차이 나는 값 구하는거임
        }
        return answer;
    }
}

inf, tmp, answer 를 왜 저렇게 미리 구해놓는 걸까요?

아! 양수 max 값 구할 때도 -1로 해놓듯이 나올 수 없는 수를 해서 값이 들어가도록 하려고

tmp != inf 하는 이유는 처음에만 바로 tmp에 값 넣으려고, 나머지는 if문 동작

 

11. 도서 대여점 운영

도서 대여점의 만화책과 소설책의 대여 요금이 다음과 같습니다.
구분 대여 요금 추가 요금
만화책 첫 2일 500원 이후 1일당 200원씩 추가
소설책 첫 3일 1000원 이후 1일당 300원씩 추가
만화책과 소설책의 대여 요금을 계산하기 위해 아래 그림과 같이 Book 인터페이스와 ComicBook, Novel 클래스를 작성했습니다.

* Book :
  * Book은 책의 인터페이스입니다..
  * 책은 get_rental_price 메소드를 구현해야 합니다.
  * get_rental_price 메소드는 대여 기간을 매개변수로 받아 대여 요금을 계산합니다.
* ComicBook :
  * ComicBook은 만화책을 나타내는 클래스이며, Book 인터페이스를 구현합니다.
  * get_rental_price 메소드는 대여 기간을 매개변수로 받아 만화책의 대여 요금을 계산합니다.
* Novel :
  * Novel은 소설책을 나타내는 클래스이며, Book 인터페이스를 구현합니다.
  * get_rental_price 메소드는 대여 기간을 매개변수로 받아 소설책의 대여 요금을 계산합니다.
대여를 원하는 책들의 종류가 들어있는 리스트 book_types와 대여 기간 day가 매개변수로 주어질 때, 전체 대여 요금을 return 하도록 solution 메소드를 작성하려고 합니다. 위의 클래스 구조를 참고하여 주어진 코드의 빈칸을 적절히 채워 전체 코드를 완성해주세요.
class Main{
	interface Book{
		public int getRentalPrice(int day);//인터페이스니까 구현부 없음
    }
    
    class ComicBook implements Book{//인터페이스 상속
    	public int getRentalPrice(int day){//구현
            int cost = 500;
            day -= 2;//첫 2일 500원
            if(day > 0)
                cost += day*200;//이후 1일당 200원씩 추가

            return cost;
        }
    }
    
    class Novel implements Book{//인터페이스 상속
    	public int getRentalPrice(int day){//구현
            int cost = 1000;
            day -= 3;//첫 3일 1000원
            if(day > 0)
                cost += day*300;//이후 1일당 300원씩 추가

            return cost;
        }
    }
}

 

12. 지하철 기다리기

A 지하철역의 오늘 하루 지하철 도착 시각이 순서대로 들어있는 배열이 있습니다. 현재 시간이 주어졌을 때, 지하철을 타기위해서는 최소 몇 분을 기다려야 하는지 구하려 합니다. 이를 위해 다음과 같이 프로그램 구조를 작성했습니다.

1. 00:00을 기준으로 해서 현재 시각을 분 단위로 변환합니다.
2. 배열을 순회하며 다음을 수행합니다.
  2-1. 00:00을 기준으로, 각 지하철 도착 시각을 분 단위로 변환합니다.
  2-2. 현재 시각과 지하철 도착 시각을 비교하여 최소 대기 시간을 구합니다.
3. 2번 단계에서 구한 최소 대기 시간을 return 합니다.
오늘 하루 동안의 지하철 도착 시각이 순서대로 들어있는 배열 subway_times와 subway_times의 길이 subway_times_len, 현재시간 current_time이 매개변수로 주어질 때, 지하철을 타기 위해 기다려야 하는 최소 대기 시간을 return 하도록 solution 함수를 작성했습니다. 이때, 위 구조를 참고하여 중복되는 부분은 func_a라는 함수로 작성했습니다. 코드가 올바르게 동작할 수 있도록 빈칸을 알맞게 채워 전체 코드를 완성해주세요.
class Main{
	//string으로 주어지는 값을 분으로 변환
	public int func_a(String times){
        int hour = Integer.parseInt(times.substring(0, 2));
        int minute = Integer.parseInt(times.substring(3));

        return hour*60 + minute;
    }
    
    public int solution(String[] subwayTimes, String currentTime){
        int currentMinute = func_a(currentTime);//현재 시간 분으로 변환
        int INF = 1000000000;//나올 수 없는 수
        int answer = INF;

        for(int i=0; i < subwayTimes.length; ++i){
            int subwayMinute = func_a(subwayTimes[i]);//지하철 도착 시간 분으로 변환

            if(subwayMinute >= currentMinute){//미래 도착 시간과 현재 시간 빼서 차이 구하기
                answer = subwayMinute - currentMinute;
                break;//도착 시간이 순서대로이므로 한 번 들어오면 최소임
            }
        }
        if(answer == INF)
            return -1;//있을 수 없다 오류다

        return answer;//값 반환
    }
}

 

13. 경품 당첨자를 구해주세요

A 사이트에서 아래 조건에 맞는 게시글을 최초로 작성하는 이용자에게 경품을 제공하려 합니다.
  • 현재 작성되어있는 가장 마지막 게시글 이후에 작성된 게시글이어야 합니다.
  • 게시글 번호의 자릿수가 짝수여야 합니다.
  • 게시글 번호가 2n 자릿수 일때, 앞 n 자리의 각 자릿수의 합과 뒤 n 자리의 각 자릿수의 합이 같아야 합니다.
이 사이트의 게시글 번호는 마지막에 작성된 게시글 번호부터 1씩 증가합니다. 예를 들어, 가장 마지막 게시글의 번호가 235386이라면, 이후에 작성되는 게시글의 번호는 235387, 235388 ... 이 되며, 번호가 235387 이상인 게시글이 경품당첨의 대상이 됩니다.
당신은 경품을 받기위해 앞으로 게시글을 몇 개 더 작성해야 하는지 구하려 합니다. 이를 위해 다음과 같이 프로그램 구조를 작성했습니다.

1. 게시글 번호를 1 증가시키고 자릿수를 구합니다.
2. 만약 자릿수가 짝수가 아니라면 1로 돌아갑니다.
3. 만약 구한 자릿수가 짝수라면 다음을 수행합니다.
  3-1. 앞 자릿수 절반과 뒷 자릿수 절반을 분리합니다.
  3-2. 앞 자릿수 절반의 자릿수 합과 뒷 자릿수 절반의 자릿수 합을 구합니다.
  3-3. 위에서 구한 합이 서로 같으면 4로 가고, 같지 않으면 1로 돌아갑니다.
4. (3에서 구한 수 - 처음에 매개변수로 주어진 수)를 return 합니다.
 
가장 마지막 게시글의 번호 num이 매개변수로 주어질 때, 경품을 받기위해 앞으로 더 작성해야 하는 게시글의 개수를 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 함수와 매개변수를 알맞게 채워주세요.
class Main {
    public int func_a(int n){
        int ret = 1;
        while(n > 0){
            ret *= 10;
            n--;
        }
        return ret;
    }

    int func_b(int n){
        int ret = 0;
        while(n > 0){
            ret++;
            n /= 10;
        }
        return ret;
    }
    
    int func_c(int n){
        int ret = 0;
        while(n > 0){
            ret += n%10;
            n /= 10;
        }
        return ret;
    }
    
	public int solution(int num) {
        int nextNum = num;//가장 마지막 게시글 이후 게시글
        while(true){
            nextNum++;
            int length = func_b(nextNum);//게시글 번호의 자릿수 구하기
            if(length % 2 != 0)//게시글의 번호의 자릿수가 짝수가 아니면 다음으로 넘어감
                continue;
            //245386이면 길이의 절반 3이므로 1000단위로 나누기 235,386 나옴
            int divisor = func_a(length/2);//길이 절반 단위 구하기 11이면 10단위임
            int front = nextNum / divisor;//11이라면 11/10으로 1
            int back = nextNum % divisor;//나머지 1
            
            int frontSum = func_c(front);//각 자릿수의 합 구하기
            int backSum = func_c(back);
            if(frontSum == backSum)//같으면 멈춰
                break;
        }
        return nextNum - num;//앞으로 더 작성해야 할 게시글 갯수 구하기
    }

대충 유용할 거 같으니 다시 한 번 더 보기

 

14. 합이 k 배가 되는 수

자연수가 중복 없이 들어있는 배열이 있습니다. 이 배열에서 합이 K의 배수가 되도록 서로 다른 숫자 세개를 고르는 방법은 몇 가지인지 세려고 합니다.
자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 매개변수로 주어질 때, 이 배열에서 합이 K의 배수가 되도록 서로 다른 숫자 세개를 고르는 방법의 가짓수를 return 하도록 solution 함수를 완성해주세요.
// 다음과 같이 import를 사용할 수 있습니다.
import java.util.*;

class Main {
    public int solution(int[] arr, int K) {
				int answer = 0;
        for(int i=0; i < arr.length; i++){
					for(int j=i+1; j < arr.length; j++){
						for(int k=j+1; k < arr.length; k++){
							if((arr[i] + arr[j] + arr[k])%3 == 0){
								answer++;
							}
						}
					}
				}
        
        return answer;
    }
 
 

15. 언제까지 오르막길이야..?!

자연수가 들어있는 배열이 있습니다. 이 배열에서, 숫자가 연속해서 증가하는 가장 긴 구간의 길이를 구하려 합니다. 단, 바로 전 숫자와 현재 숫자가 같은 경우는 증가한 것으로 보지 않습니다.
예를 들어 배열에 순서대로 [3, 1, 2, 4, 5, 1, 2, 2, 3, 4]가 들어있는 경우, [1, 2, 4, 5]가 들어있는 구간이 숫자가 연속해서 증가한 가장 긴 구간이며, 길이는 4입니다.
자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 매개변수로 주어질 때, 숫자가 연속해서 증가하는 가장 긴 구간의 길이를 return 하도록 solution 함수를 완성해주세요.
import java.util.*;

class Main{
	public int solution(int[] arr){
    	int answer = 0;
        int plus = 0;
        int max = 0;
        
        for(int i=0; i < arr.length-1; i++){
            if(arr[i] < arr[i+1]){
                plus++;
                if(plus > max){//증가하는 수의 max 값 구하기
                    max = plus;
                }
            }
            else{//만약 중간에 감소했다면 0으로 초기화
                plus = 0;
            }
        }
        answer = max + 1;//마지막에 항상 1큼(구간 검사를 했기 때문)
        return answer;
    }
}

 

잘못되거나 설명이 이상한 부분은 댓글을 남겨주시면 감사하겠습니다..저도 잘 몰라요

'알고리즘, 코딩테스트' 카테고리의 다른 글

Cos Pro 1급 java (22~26)  (0) 2022.09.17
Cos Pro 1급 java (16~21)  (0) 2022.09.15
Cos Pro 1급 java (1~7)  (0) 2022.09.11
코난테크놀로지 코딩테스트  (0) 2022.08.22
[프로그래머스] 가장 큰 수  (0) 2022.08.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함