이상한 문자 만들기, 3진법 뒤집기 , 최소직사각형
코딩테스트 : 이상한 문자 만들기
문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
제한 사항- 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
- 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
"try hello world" | "TrY HeLlO WoRlD" |
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.
using System;
public class Solution
{
public string solution(string s)
{
string answer = "";
string[] n = s.Split(' ');
for (int i = 0; i < n.Length; i++)
{
for (int j = 0; j < n[i].Length; j++)
{
if (j % 2 == 0)
{
answer += n[i][j].ToString().ToUpper();
}
else
{
answer += n[i][j].ToString().ToLower();
}
}
if (i != n.Length -1) answer += " ";
}
return answer;
}
}
공백이 있는 지점부터 다시 시작하기 위해 다음과 같이 풀었다.
다른 사람의 흥미로운 풀이
굳이 배열을 만들고 복잡하게 갈 필요가 없었다, 공백이 나오면 count 같은 것을 0으로 만들어 주고, count에 따라
홀수와 짝수를 구분하면 되었다.
예를 들어
count = s[i] == " " ? 0 : count++;
코딩테스트 : 3진법 뒤집기
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 100,000,000 이하인 자연수입니다.
입출력 예
nresult45 | 7 |
125 | 229 |
using System;
public class Solution {
public int solution(int n) {
int answer = 0;
//3진법 수 저장용
String threeNumbers = "";
// 현재 3의 n제곱수
int nThree = 1;
for (int i = 0; i < int.MaxValue; i++)
{
if (n <= nThree) break;
nThree *= 3;
}
nThree /= 3;
while (n > 0)
{
threeNumbers += (n % 3).ToString();
n /= 3;
}
int three = 1;
for (int i = threeNumbers.Length - 1; i >= 0; i--)
{
answer += int.Parse(threeNumbers[i].ToString()) * three;
three *= 3;
}
return answer;
}
}
생각보다 오래걸렸다. 중간에 두 번 뒤집어 엎었다.
while (n > 0)
{
threeNumbers += (n % 3).ToString();
n /= 3;
}
이 방식을 기억해 두면 좋을 것 같다.
다른 사람의 흥미로운 풀이
오.. .굳이 구해준 다음에 두 번 할 필요 없이
while(n>0){
answer*=3;
answer+=n%3;
n/=3;
}
이렇게만 해도 답이 나온다.
왜 그런 것인가 !
우리가 하는 과정은 지금 10진법 -> 3진법으로 변환 -> 뒤집기 -> 10진법으로 변환이다.
이 과정 중에
while(n>0){
answer+=n%3;
n/=3;
}
이것만 하면 뒤집어진 3진법이 나온다.
이때, 앞의 자릿수에서부터 큰 수 이므로, 3을 한 번씩 더 곱해주면서 더해주면 된다.
코딩테스트 : 최소직사각형
문제 설명
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
명함 번호가로 길이세로 길이1 | 60 | 50 |
2 | 30 | 70 |
3 | 60 | 30 |
4 | 80 | 40 |
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.
모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
제한사항
- sizes의 길이는 1 이상 10,000 이하입니다.
- sizes의 원소는 [w, h] 형식입니다.
- w는 명함의 가로 길이를 나타냅니다.
- h는 명함의 세로 길이를 나타냅니다.
- w와 h는 1 이상 1,000 이하인 자연수입니다.
using System;
using System.Collections.Generic;
using System.Linq;
public class Solution
{
public int solution(int[,] sizes)
{
int max = int.MinValue;
List<int> minMax = new List<int>();
for (int i = 0; i < sizes.GetLength(0); i++)
{
int minmax = int.MaxValue;
for (int j = 0; j < sizes.GetLength(1); j++)
{
if (sizes[i, j] > max)
{
max = sizes[i, j];
}
if (sizes[i, j] < minmax)
{
minmax = sizes[i, j];
}
}
minMax.Add(minmax);
}
return max * minMax.Max();
}
}
일단 가장 긴 길이를 하나 저장하고, 나머지들은 가로와 세로를 비교해서 짧은 것들을 모두 리스트에 넣는다.
그 후 짧았던 것들 중에 가장 긴 값과 전체에서 가장 긴 값을 곱해주었다.
다른 사람의 흥미로운 풀이
굳이 복잡하게 할 필요가 없었다.
그냥
for (int i = 0; i < sizes.GetLength(0); i++)
{
int w = Math.Max(sizes[i, 0], sizes[i, 1]); // 가로를 더 큰 값으로 설정
int h = Math.Min(sizes[i, 0], sizes[i, 1]); // 세로를 더 작은 값으로 설정
maxWidth = Math.Max(maxWidth, w);
maxHeight = Math.Max(maxHeight, h);
}
이런 식으로 가로를 무조건 세로보다 길게 만들고, 그 값들 중 가장 큰 값들을 구해서 곱해주면 된다.