방식 순서
1. N의 개수만큼 int[] num에 input2로 받은 string 값을 하나씩 넣어준다, (convertAll 써서 바로 int형으로 input2만들어줬어도 됐을듯?)
2. 3장의 카드를 골라 더한 값 중 M의 값을 넘지않고 최대한 가까운 값을 도출해야 하기때문에, 3중 for문을 사용하여 모든 경우의 수를 짜줬다. (ex : 0,1,2 -> 0,1,3 -> 0,1,4 ...)
3. 각 경우의 수마다 더한 값을 sum으로 놓고, if (sum <= input_val && min < sum)의 의미는
해당 sum의 값이 입력값과 같거나 작고, min<sum는 for문을 입력값과 최대한 가까운 수를 구하기 위한 조건이다.
4. min<sum의 조건으로 인해 for문이 끝나고 나온 min은 모든 조건을 성립하는 목표치보단 작지만 최대한 가까운 수이다.
5. min이 문제의 출력값이된다.
문제 풀고 느낀점
: 요번 문제도 시간은 좀 걸렸지만 나름 선방했다고 생각한다. 고수분들의 답안과 비교하면 정말 지저분한 소스지만,
접근성은 비슷했다고 생각한다. 제출하고나서 메모리와 시간이 마음에 들지않아 여러번 수정한 덕에 6156kb , 120ms에서 5952kb, 104ms까지 줄었다. 그래도 1등과는 16ms나 차이가 난다. 조건문에 더 신경쓰자.
부족했던점
클래스화(간결성), 문법성(문법 하나로 여러 줄을 줄일 수 있음)
배운것들
1. 1등한 사람 문제 제출 참조
var input = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
=> 이런식으로 ConvertAll을 사용하여 띄어쓰기 간 배열로 넣으면서 int형으로 파싱할수 방법을 처음알았다.
이거 알았으면 첨에 input2를 for문 걸어서 num[]에 넣는 방식 안써서 시간 꽤 줄었을듯?
아래는 나의 풀이이다.
using System;
using System.Collections.Generic;
using System.Text;
using static System.Console;
namespace BaekJoon
{
static class Program
{
static void Main(string[] args)
{
string[] input = Console.ReadLine().Split();
string[] input2 = Console.ReadLine().Split();
//N의 개수
int count = int.Parse(input[0]);
//입력 값
int input_val = int.Parse(input[1]);
int sum = -1;
int min = 0;
int[] num = new int[count];
for (int i = 0; i < count; i++)
{
num[i] = int.Parse(input2[i]);
}
for (int i = 0; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
for (int k = j + 1; k < count; k++)
{
sum = num[i] + num[j] + num[k];
if(sum <=input_val && min < sum)
{
min = sum;
}
}
}
}
Console.Write(min);
}
}
}
=======내 제출 현황=======
'Algorithm > Problem Solving' 카테고리의 다른 글
백준 JAVA 10870번 - 피보나치수 5 (0) | 2022.03.08 |
---|---|
백준 JAVA 10872번 - 팩토리얼 (0) | 2022.03.08 |
프로그래머스 C# - 소수 만들기 (Summer/Winter Coding) (0) | 2022.02.21 |
백준 JAVA 1436번 - 영화감독 숌 (0) | 2021.10.03 |
백준 C# 2231번 - 분해합 (0) | 2021.09.26 |
댓글