문제
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
조건
n은 10,000,000,000이하인 자연수입니다.
int[] answer = new int[]{};
나의 풀이
생각은 일단, 각 자리 수를 이전에 했던거처럼 나머지 연산을 이용해서 구한 후, 배열의 인덱스 0값부터 집어넣는데 순서를
1. 각 자리 수 구하기
while(n<0)
{
int a=(int)n%10;
n=n/10;
}
일단 배열에 삽입하고 싶은데 어떻게 해야하는지 모르겠다. 배열 길이가 정해진 것도 아니니..
일단 C# 배열 값 삽입을 쳐보고 , 가변 배열 삽입도 쳐봤으나 다 배열의 길이를 선언해주는거밖에 없었다.
그래서 다른 사람 풀이를 봤는데 배열의 길이를 선언해주었다.
int[] answer = new int[]{};
이렇게 주어져 있는데 ,
자연수를 Tostring을 이용하여 문자열로 바꾸고 -> .Length를 이용해서 길이를 구해서
int[] answer = new int[문자열.Length]; 이렇게 선언해줬다.
그래서 구글링 해도 안나오던거였군..
위를 토대로 이렇게 작성하였다.
using System;
public class Solution {
public int[] solution(long n) {
string str=n.ToString(); //정수를 문자열로
int[] answer = new int[str.Length]; //배열 선언(문자열의 길이 만큼)
while(n>0)
{
int a=(int)n%10;//나머지 5->4->3->2->1
n=n/10;// 몫 1234->123->12->1
//배열에 a 값 넣기
}
return answer;
}
}
1. 정수를 문자열로 바꾼다.
2. 문자열 길이만큼 배열을 선언해준다.
3. 각 자리 수를 1의 자리부터 구한다. => a
근데 !! 배열에 a 값을 어떻게 넣어야할지를 모르겠다.
while문 안에서 넣어야할거같은데
while 문 안에서 for문으로 answer[i]=a; 이렇게 하면 1,1,1,1,1이 저장됨
흠냐 다시 한 번 다른 사람들은 어떻게 풀었는지 구글링 해보자..

다들 그냥 for문으로 썼다 아? ㅎㅎ 왜 그걸 생각 못했을깡 ~ ㅎ
using System;
public class Solution {
public int[] solution(long n) {
string str=n.ToString(); //정수를 문자열로
int[] answer = new int[str.Length]; //배열 선언(문자열의 길이 만큼)
for(int i=0;i<str.Length;i++)
{
int a=(int)n%10;//나머지 5->4->3->2->1
n=n/10;// 몫 1234->123->12->1
answer[i]=a;//배열에 a 값 넣기
}
return answer;
}
}
테스트 케이스는 통과했는데
틀렸다 ..
머가 문제야
생각해보자.
혹시 .. 0을 %10으로 하면 안되서 그런가 ..?
for(int i=0;i<str.Length;i++)
{
answer[i]=(int)(n%10);
n=n/10;
}
이렇게는 된다.
왜 ? 다른게 뭐야
for(int i=0;i<str.Length;i++)
{
//int a=(int)n%10;//나머지 5->4->3->2->1
//n=n/10;// 몫 1234->123->12->1
//answer[i]=a;//배열에 a 값 넣기
answer[i]=(int)(n%10);
n=n/10;
}
왜 위에는 안되고
아래는 되는거야??
하하 .. 그렇거였군.. 어이없을 무 나 자신
[최종 코드]
using System;
public class Solution {
public int[] solution(long n) {
string str=n.ToString(); //정수를 문자열로
int[] answer = new int[str.Length]; //배열 선언(문자열의 길이 만큼)
for(int i=0;i<str.Length;i++)
{
int a=(int)(n%10);//나머지 5->4->3->2->1
n=n/10;// 몫 1234->123->12->1
answer[i]=a;//배열에 a 값 넣기
}
return answer;
}
}
다른사람 풀이
1.
using System.Linq;
public class Solution {
public int[] solution(long n) {
string nString = new string(n.ToString().ToCharArray().Reverse().ToArray());
int[] answer = new int[nString.Length];
for (int i = 0; i < nString.Length; i++)
{
answer[i] = int.Parse(nString[i].ToString());
}
return answer;
}
}
n값을 ToString()을 이용해서 문자열로 바꾸고
ToCharArray()를 이용해 문자열을 한 글자씩 쪼개서 이를 char타입의 배열에 집어넣어주고,
Reverse()를 이용해 배열을 뒤집어주고
근데 왜 또 ToArray()를 한거징?
ToArray()를 지우고 실행시켜보니
/Solution0.cs(5,26): error CS1502: The best overloaded method match for `string.String(char[])' has some invalid arguments
/usr/lib/mono/4.5/mscorlib.dll (Location of the symbol related to previous error)
/Solution0.cs(5,64): error CS1503: Argument `#1' cannot convert `System.Collections.Generic.IEnumerable<char>' expression to type `char[]'
요런 오류가 뜬다.
아하 .. 확실하진 않지만 new String 선언할때 뒤에는 배열이어야하나?
맞군..
string testString = "123";
Int32.Parse(testString);
int.Parse는 내가 그동안 썼던. 문자열을 숫자로 바꿔주는것이었따
2.
using System;
using System.Linq;
public class Solution {
public int[] solution(long n) {
string temp = n.ToString();
int[] answer = new int[temp.Length];
for(int i = 0; i < temp.Length; i++)
{
answer[i] = int.Parse(temp[i].ToString());
}
Array.Reverse(answer);
return answer;
}
}
Array.Reverse() 챙겨가면 좋을거같당.
3.
while(n > 0)
{
answer[idx] = (int)(n % 10);
n = (n-answer[idx])/10;
idx++;
}
그리고 while문 쓰려면 이런식으로 썼으면 됐을거같다.
'프로그래머스 코딩테스트 연습' 카테고리의 다른 글
[프로그래머스 코테 C#] Lv1. 나누어 떨어지는 숫자 배열 (0) | 2024.04.29 |
---|---|
[프로그래머스 코테 C#] Lv1. 두 정수 사이의 합 (0) | 2024.04.29 |
[프로그래머스 코테 C#] Lv1. 원하는 문자열 찾기 (1) | 2024.03.27 |
[프로그래머스 코테 C#] Lv1. x만큼 간격이 있는 n개의 숫자 (0) | 2024.03.21 |
[프로그래머스 코테 C#] Lv1. 하샤드 수 (0) | 2024.03.17 |