[TIL] 14일 차 - C#으로 프로그래머스 문제 풀기 (3)

ChangBeom·2025년 2월 13일

TIL

목록 보기
15/53
post-thumbnail

오늘은 팀 프로젝트를 마무리하고 발표까지 진행했다. 때문에 다른 것을 개발하며 공부할 시간이 없었다. 그래서 오늘은 팀 프로젝트를 통해 C#이 얼마나 익숙해졌는지 테스트 해볼겸 틈틈히 프로그래머스에서 제공하는 문제들을 풀었다.

[1. 음양 더하기]

<문제>

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

<제한 사항>

  • absolutes의 길이는 1 이상 1,000 이하입니다.
    • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
    • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.
using System;

public class Solution {
    public int solution(int[] absolutes, bool[] signs) {
        int answer = 123456789;
       
        int sum = 0;
       
        for(int i=0;i<absolutes.Length;i++){
          
            if(signs[i]){
                sum += absolutes[i];
            }
            else{
                sum += absolutes[i] * -1;
            }
        }
       
        answer = sum;
       
        return answer;
    }
}

<풀이>

정수들의 절대값을 저장해둔 absolutes 배열의 길이와 부호를 저장해둔 signs 배열의 길이가 같으므로 둘 중 하나의 길이만큼 for문을 돌면서 signs배열을 확인하여 true면 sum에 absolutes의 값을 그대로 더해주고 false면 absolutes 값에 -1을 곱해서 sum에 더해주면 되는 문제이다.


[2. 없는 숫자 더하기]

<문제>

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

<제한 사항>

  • 1 ≤ numbers의 길이 ≤ 9
    • 0 ≤ numbers의 모든 원소 ≤ 9
    • numbers의 모든 원소는 서로 다릅니다.
using System;

public class Solution {
    public int solution(int[] numbers) {
        int answer = -1;
       
        bool[] arr = new bool[10];
       
        for(int i=0;i<numbers.Length;i++){
            arr[numbers[i]] = true;
        }
       
        int sum = 0;
       
        for(int i=0;i<arr.Length;i++){
            if(arr[i] == false){
                sum += i;
            }
        }
       
        answer = sum;
       
        return answer;
    }
}

<풀이>

먼저 0~9까지의 인덱스가 존재하는 크기가 10인 bool 타입 arr[] 배열을 만들어준다. 이후 numbers를 for문을 통해 순회하면서 numbers에 존재하는 값이면, arr[numbers[i]] 값을 true로 바꾼다. 마지막으로 arr[]배열을 for문을 통해 순회하면서 arr[i]번째 값이 false면 numbers에 없는 값이므로 sum에 더해주면 된다.


[3. 제일 작은 수 제거하기]

<문제>

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

<제한 사항>

  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
using System.Collections.Generic;

public class Solution {
    public List<int> solution(int[] arr) {
        List<int> answer = new List<int>();
       
        int min = 2147483647;
       
        for(int i=0;i<arr.Length;i++){
            if(arr[i] < min){
                min = arr[i];
            }
        }
       
        for(int i=0;i<arr.Length;i++){
            if(arr[i] == min){
                continue;
            }
           
            answer.Add(arr[i]);
        }
       
        if(answer.Count == 0){
            answer.Add(-1);
        }
       
        return answer;
    }
}

<풀이>

주어진 arr[] 배열을 for문으로 순회하며 최소값을 찾아주고, 다시 arr[] 배열을 for문으로 순회하며 최소값 이외의 값을 answer List에 추가해주면된다. 그리고 마지막에 List가 비어있으면 -1을 추가해주면 된다.


[4. 핸드폰 번호 가리기]

<문제>

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

<제한 사항>

  • phone_number는 길이 4 이상, 20이하인 문자열입니다.
public class Solution {
    public string solution(string phone_number) {
        string answer = "";
       
        for(int i=0;i<phone_number.Length-4;i++){
            answer += "*";
        }
       
        for(int i=phone_number.Length-4;i<phone_number.Length;i++){
            answer += phone_number[i];
        }
       
        return answer;
    }
}

<풀이>

전화번호의 뒷자리 4개를 뺀 길이만큼 *을 answer에 붙혀준다음 전화번호의 뒷자리 4개를 붙혀주면 되는 아주 간단한 문제이다.


[5. 내적]

<문제>

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]b[0] + a[1]b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

<제한 사항>

  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.
using System;

public class Solution {
    public int solution(int[] a, int[] b) {
        int answer = 1234567890;
       
        int sum = 0;
       
        for(int i=0;i<a.Length;i++){
            sum += a[i] * b[i];
        }
       
        answer = sum;
       
        return answer;
    }
} 

<풀이>

내적의 구하는 공식을 for문을 통해 구현하면 되는 간단한 문제이다.


[6. 가운데 글자 가져오기]

<문제>

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

<제한 사항>

  • s는 길이가 1 이상, 100이하인 스트링입니다.
public class Solution {
    public string solution(string s) {
        string answer = "";
       
        bool isOdd = false;
       
        if(s.Length % 2 == 0){
            isOdd = false;
        }
        else{
            isOdd = true;
        }
       
        if(isOdd){
            answer += s[s.Length/2];
        }
        else{
            answer += s[s.Length/2-1];
            answer += s[s.Length/2];
        }
       
        return answer;
    }
}

<풀이>

먼저 단어의 길이가 홀수 인지 짝수인지 판단을 해주고 홀수면 가운데 있는 글자를 반환하고, 짝수면 가운데 있는 글자 2개를 반환하면 된다.


[7. 수박수박수박수박수박수?]

<문제>

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

<제한 사항>

  • n은 길이 10,000이하인 자연수입니다.
public class Solution {
    public string solution(int n) {
        string answer = "";
       
        for(int i=0;i<n;i++){
            if(i%2==0){
                answer += "수";
            }
            else{
                answer += "박";
            }
        }
       
        return answer;
    }
}

<풀이>

for문을 통해 0부터 n까지 돌며 i가 0이거나 짝수일 땐 answer에 "수"를 더해주고, 홀수 일 땐 "박"을 더해주면 된다.


[8. 약수의 개수와 덧셈]

<문제>

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

<제한 사항>

  • 1 ≤ left ≤ right ≤ 1,000
using System;

public class Solution {
    public int solution(int left, int right) {
        int answer = 0;
       
        for(int i=left;i<=right;i++){
            int count = 0;
            for(int j=1;j<=i;j++){
                if(i%j==0){
                    count++;
                }
            }
            if(count % 2 == 0){
                answer += i;
            }
            else{
                answer -= i;
            }
        }
       
        return answer;
    }
}

<풀이>

for문으로 left부터 right까지 돌면서 각 수를 1부터 자기 자신까지 나눠주면서 약수의 개수를 세어준다. 그리고 약수의 개수가 짝수면 answer에 더해주고 홀수면 answer에서 빼주면 된다.


0개의 댓글