SW취업역량강화 코딩테스트 2

인소리·2022년 9월 11일

Coding Test

목록 보기
8/13

1. 킹, 퀸, 룩, 비숍, 나이트, 폰(백준)

문제 정보

동혁이는 오래된 창고를 뒤지다가 낡은 체스판과 피스를 발견했다. 체스판의 먼지를 털어내고 걸레로 닦으니 그럭저럭 쓸만한 체스판이 되었다. 하지만, 검정색 피스는 모두 있었으나, 흰색 피스는 개수가 올바르지 않았다.

체스는 총 16개의 피스를 사용하며, 킹 1개, 퀸 1개, 룩 2개, 비숍 2개, 나이트 2개, 폰 8개로 구성되어 있다.

동혁이가 발견한 흰색 피스의 개수가 주어졌을 때, 몇 개를 더하거나 빼야 올바른 세트가 되는지 구하는 프로그램을 작성하시오.

입출력 예시

코드(C++)

#include <iostream>

using namespace std;

int main(void)
{
	int chess[6] = { 1,1,2,2,2,8 };
	int mine[6];
	for (int i = 0; i < 6; i++) {
		cin >> mine[i];
	}
	for (int j = 0; j < 6; j++) {
		cout << chess[j] - mine[j] << " ";
	}
}

코드 풀이

올바른 세트의 개수에서 동혁이가 가지고 있는 피스 개수를 빼어 출력해주었다.

2. 체육복(프로그래머스)

문제 정보

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

제한 조건

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

입출력 예시

nlostreservereturn
5[2, 4][1, 3, 5]5
5[2, 4][3]4
3[3][1]2

코드(C++)

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> students(n, 1);
    for (int i = 0; i < lost.size(); i++)
        students[lost[i] - 1]--;
    for (int i = 0; i < reserve.size(); i++)
        students[reserve[i] - 1]++;
    for (int i = 0; i < n; i++) {
        if (i > 0 && students[i] == 0 && students[i - 1] == 2) {
            students[i]++;
            students[i - 1]--;
        }
        if (i < n - 1 && students[i] == 0 && students[i + 1] == 2) {
            students[i]++;
            students[i + 1]--;
        }
    }
    for (int i = 0; i < n; i++)
        if (students[i] > 0) answer++;

    return answer;
}

코드 풀이

학생 vector를 만들어 모두 1로 초기화해주고 도난 당한 학생은 -1, 여분이 있는 학생은 +1을 해서 개수를 정리해주었다. 그리고 0번방은 오른쪽 방으로부터 n-1번방은 왼쪽 방으로부터 얻을 수 있게 하고 나머지 방들은 왼쪽과 오른쪽 모두 조건을 만족하는 방을 찾아 값을 주었다. 마지막에 가지고 있는 수가 0보다 큰 방의 개수만 세어 answer로 리턴해주었다.

3. 완주하지 못한 선수(프로그래머스)

문제 정보

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한 조건

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예시

participantcompletionreturn
["leo", "kiki", "eden"]["eden", "kiki"]"leo"
["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"]"mislav"

코드(C++)

#include <string>
#include <vector>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    sort(participant.begin(), participant.end());
    sort(completion.begin(), completion.end());
    for (int i = 0; i < participant.size(); i++) {
        if (participant[i] != completion[i]) {
            answer = participant[i];
            break;
        }
    }

    return answer;
}

코드 풀이

먼저 참가자 배열과 완주자 배열을 비교하기 쉽게 정렬하였고, 비교했을 때 다르다면 answer에 넣고 반복문을 바로 빠져나오도록 하였다.

5. 피보나치 수(프로그래머스)

문제 정보

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.

예를 들어

F(2) = F(0) + F(1) = 0 + 1 = 1
F(3) = F(1) + F(2) = 1 + 1 = 2
F(4) = F(2) + F(3) = 1 + 2 = 3
F(5) = F(3) + F(4) = 2 + 3 = 5

와 같이 이어집니다.

2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.

제한 조건

  • n은 2 이상 100,000 이하인 자연수입니다.

입출력 예시

nreturn
32
55

코드(C언어)

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int n) {
    int answer = 0;
    int a[n+1];
    a[0]=0;
    a[1]=1;
    for(int i=2; i<=n; i++) {
        a[i]=(a[i-1]%1234567+a[i-2]%1234567)%1234567;
    }
    answer=a[n];
    
    return answer;
}

코드 풀이

(A + B) % C ≡ ( ( A % C ) + ( B % C) ) % C를 이용해 반복문 안에서 1234567로 나눈 나머지를 구해주었고 마지막 a[n] 값을 answer에 넣어 리턴해주었다.

6. 두 정수 사이의 합(프로그래머스)

문제 정보

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.

예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

제한 조건

  • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
  • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
  • a와 b의 대소관계는 정해져있지 않습니다.

입출력 예시

abreturn
3512
333
5312

코드(C언어)

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

long long solution(int a, int b) {
    long long answer = 0;
    if(a==b) return a;
    else {
        while(true) {
            if(a>b) {
                answer+=a;
                a--;
            }
            else if(a<b) {
                answer+=a;
                a++;
            }
            if(a==b) {
                answer+=a;
                break;
            }
        }
    }
    return answer;
}

코드 풀이

a와 b가 같다면 바로 a를 리턴하고 그렇지 않으면(else) while문을 통해 a와 b가 같아질 때까지 대소관계를 파악하고 그에 맞게 값을 증가시키고 감소시켰다.

profile
코딩이라는 감옥에 갇혀 사는 삶

0개의 댓글