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

인소리·2022년 9월 19일

Coding Test

목록 보기
9/13

1. N개의 최소공배수(프로그래머스)

문제 정보

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.

제한 조건

  • arr은 길이 1이상, 15이하인 배열입니다.
  • arr의 원소는 100 이하인 자연수입니다.

입출력 예시

arrresult
[2,6,8,14]168
[1,2,3]6

코드(C언어)

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

int solution(int arr[], size_t arr_len) {
    int answer = 0;
    int gcd = 0;
    for (int i = 0; i < arr_len - 1; i++) {
        int a = arr[i];
        int b = arr[i + 1];

        if (a > b) {
            int temp;
            temp = a;
            a = b;
            b = temp;
        }
        for (int j = 1; j < b; j++) {
            if (a % j == 0 && b % j == 0) {
                gcd = j;
            }
        }
        arr[i + 1] = a * b / gcd;
    }
    answer = arr[arr_len - 1];
    return answer;
}

코드 풀이

두 개씩 a와 b를 정해준다. 1부터 나누어 둘 다 나머지가 0이 되는 가장 큰 j가 최대공약수가 된다. 다음 a가 될 arr[i+1]에 a와 b의 최소공배수를 넣어준다. 이를 반복하여 마지막까지 구한 최소공배수를 answer에 넣어 리턴해준다.

2. 알람 시계(백준)

문제 정보

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다. 이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.

바로 "45분 일찍 알람 설정하기"이다.

이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.

현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.

입출력 예시

코드(C++)

#include <iostream>

using namespace std;

int main(void)
{
	int H, M;	//H = 시, M = 분
	int i = 1;
	cin >> H;
	cin >> M;
	while (i <= 45) {
		M--;
		if (M < 0) {
			H--;
			M = 59;
		}
		if (H < 0) {
			H = 23;
		}
		i++;
	}
	cout << H << " " << M;
		
	return 0;
}

코드 풀이

H(시), M(분)을 입력 받고 45만큼 H시 M분에서 빼주었다. 이 때, M이 60분(숫자로는 0)에서 감소해야 한다면 H--를 해주고 M을 59로 초기화 해주었다. H는 24시(숫자로는 0)보다 감소해야 될 때 23으로 초기화 해주었다.

3. 이상한 문자 만들기(프로그래머스)

문제 정보

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 조건

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

입출력 예시

sreturn
"try hello world""TrY HeLlO WoRlD"

코드(C언어)

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

char* solution(const char* s) {
    char* answer = (char*)malloc(strlen(s) + 1);
    int index = 0;
    strcpy(answer, s);
    for (int i = 0; i < strlen(answer); i++) {
        if (answer[i] == ' ') {
            index = 0;
        }
        else if (index % 2 == 0) {
            answer[i] = toupper(answer[i]);
            index++;
        }
        else if (index % 2 == 1) {
            answer[i] = tolower(answer[i]);
            index++;
        }
    }
    return answer;
}

코드 풀이

s를 answer에 복사하고 짝수, 홀수번째를 구분하기 위한 index를 선언해주었다. 공백문자 다음 문자는 0번째로 보아야 하기 때문에 answer[i]가 공백일 경우, index를 0으로 초기화한다. index가 짝수면 answer[i]를 대문자로, 홀수면 answer[i]를 소문자로 바꿔주고 index++을 해준다.
💡 toupper(): 대문자로 변환
💡 tolower(): 소문자로 변환

4. 부족한 금액 계산하기(프로그래머스)

문제 정보

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요. 단, 금액이 부족하지 않으면 0을 return 하세요.

제한 조건

  • 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
  • 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
  • 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

입출력 예시

pricemoney
320

코드(C언어)

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

long long solution(int price, int money, int count) {
    long long answer = -1;
    long pay = 0;
    for (int i = 1; i <= count; i++) {
        pay += (price * i);
    }
    if (pay - money > 0) answer = pay - money;
    else if (pay - money <= 0) answer = 0;

    return answer;
}

코드 풀이

반복문을 통해 1부터 count만큼 price를 곱한 값을 pay에 넣어주었다. 모자란 금액을 구할 때 money에서 pay를 빼면 음수가 나오기 때문에 반대로 pay에서 money를 빼주었다. 이때 0보다 크면, 즉 모자란 금액이 있다면 answer에 넣어주고 없으면 answer에 0을 넣어 리턴해주었다.
💡 answer이 long타입이기 때문에 pay도 long으로 선언해줘야 한다.

5. 자릿수 더하기(프로그래머스)

문제 정보

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를 들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

제한 조건

  • N의 범위 : 100,000,000 이하의 자연수

입출력 예시

Nanswer
1236
98724

코드(C언어)

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

int solution(int n) {
    int answer = 0;
    while (true) {
        answer += n % 10;
        if ((n / 10) < 10) {
            answer += n / 10;
            break;
        }
        n /= 10;
    }
    return answer;
}

코드 풀이

각 자릿수의 합을 구하기 위해서는 10으로 나눈 나머지를 구해서 더해야 한다. while문 안에서 n을 10으로 나눈 나머지를 answer에 더해주고 만약 n을 10으로 나눈 몫을 초기화 해줄 때 n이 10보다 작으면 일의 자리라는 뜻이기 때문에 그냥 n을 answer에 더해주고 빠져나온다. 10보다 작지 않으면 n을 10으로 나눈 몫으로 초기화 해주고 계속 반복한다.

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

0개의 댓글