오늘은 과제를 제출하고 시간이 남아 프로그래머스 문제를 풀어 보려고 한다. 아직은 알고리즘 문제를 해결하는 데 C#을 사용하는 것이 익숙하지 않으므로 난이도는 1 ~ 2정도의 문제를 풀 생각이다.
<문제>
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
<제한 사항>
public class Solution { public int solution(string s) { int answer = 0; answer = int.Parse(s); return answer; } }
<풀이>
C#은 여러 형변환 방법을 제공하는데 나는 int.Parse() 함수를 활용하여 해결했다.
<문제>
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
<제한 사항>
public class Solution { public int solution(int n) { int answer = 0; for(int i=1;i<=n;i++){ if(n%i == 0){ answer += i; } } return answer; } }
<풀이>
반복문을 활용할 수 있으면 쉽게 해결할 수 있는 문제이다. 1부터 n까지 for문을 돌며 n이 i로 나누어 떨어지면 i가 n의 약수라는 뜻이므로 answer에 더하는 식으로 해결했다.
<문제>
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
<제한 사항>
using System; public class Solution { public int solution(int n) { int answer = 0; while(true){ if(n<=0){ break; } answer += n%10; n/=10; } return answer; } }
<풀이>
while문으로 입력 받은 값이 0이거나 0보다 작을 때 까지 10으로 나누면서 10으로 나눈 나머지를 더해주면 된다. (어떤 값을 10으로 나눈 나머지는 1의 자리 수가 된다. while문을 통해 계속해서 1의 자리 수를 더해준다고 생각하면 된다.)
<문제>
정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.
<제한 사항>
public class Solution { public string solution(int num) { string answer = ""; if(num % 2 == 0){ answer = "Even"; } else{ answer = "Odd"; } return answer; } }
<풀이>
if문을 통해 2로 나누어 떨어지면 짝수, 나누어 떨어지지 않으면 홀수로 판단하면 된다.
<문제>
정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.
<제한 사항>
public class Solution { public double solution(int[] arr) { double answer = 0; for(int i=0;i<arr.Length;i++){ answer += arr[i]; } answer /= arr.Length; return answer; } }
<풀이>
for문을 통해 arr을 순회하며 모든 값을 더하고 arr의 크기만큼 나누어 주면 된다.
<문제>
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
<제한 사항>
using System.Collections.Generic; public class Solution { public List<long> solution(long x, int n) { List<long> answer = new List<long>(); long temp = x; for(int i=0;i<n;i++){ answer.Add(x); x+=temp; } return answer; } }
<풀이>
이 문제의 핵심은 제한 사항이다. 제한 사항을 보면 x의 값이 매우 클 수 있다. 그래서 x에 값을 계속해서 더하다 보면 int의 범위를 넘어 갈 수 있으므로 long 타입으로 선언해줘야한다.
<문제>
자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.
<제한 사항>
using System; public class Solution { public int solution(int n) { int answer = 0; for(int i=1;i<1000001;i++){ if(n%i==1){ answer = i; break; } } return answer; } }
<풀이>
제한 사항으로 주어진 값을 for문을 통해 순회하며 n을 i로 나눈 나머지가 1이 될 때 break를 통해 멈추면 된다.
<문제>
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
<제한 사항>
using System.Collections.Generic; public class Solution { public List<int> solution(long n) { List<int> answer = new List<int>(); string num = n.ToString(); for(int i=num.Length-1;i>=0;i--){ answer.Add(num[i]-'0'); } return answer; } }
<풀이>
이 문제의 핵심은 형변환이다. long타입인 n을 ToString()을 통해 string타입으로 형변환한 후 for문을 통해 뒤에서 부터 한글자씩 순회를 돈다. 한글자는 char타입이므로 char타입 값에 '0'을 빼서 int타입으로 형변환할 수 있다. 그렇게 만들어진 한자리 수를 List에 담아주면 해결할 수 있다.
<문제>
두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
<제한 사항>
using System.Collections.Generic; public class Solution { public long solution(int a, int b) { long answer = 0; List<int> list = new List<int>(); list.Add(a); list.Add(b); list.Sort(); for(int i=list[0];i<=list[1];i++){ answer += i; } return answer; } }
<풀이>
이 문제의 제한 사항을 보면 a와 b의 대소관계는 정해져있지 않습니다.라는 항목이 존재한다. 그래서 for문을 돌며 사이의 값을 더해주기 위해 대소관계를 정해줘야한다. 나는 List에 a와 b의 값을 넣고 Sort()를 통해 오름차순으로 정렬해주는 식으로 대소관계를 정해줬다.
<문제>
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
<제한 사항>
using System.Collections.Generic; public class Solution { public long solution(long n) { long answer = 0; List<int> list = new List<int>(); string str = n.ToString(); for(int i=0;i<str.Length;i++){ list.Add(str[i] - '0'); } list.Sort(); list.Reverse(); string temp = ""; for(int i=0;i<list.Count;i++){ temp += list[i]; } answer = long.Parse(temp); return answer; } }
<풀이>
이 문제의 풀이 순서는 다음과 같다.