코딩테스트 : 11650번 좌표 정렬하기
1 초 | 256 MB | 162651 | 79179 | 61642 | 48.594% |
문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
using System;
using System.Net.Sockets;
using System.Text;
public class Program
{
public static void Main()
{
int number = Int32.Parse(Console.ReadLine());
List<(int x, int y)> points = new List<(int x, int y)>();
for (int i = 0; i < number; i++)
{
int[] point = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
points.Add((point[0], point[1]));
}
// x와 y를 비교하는데, 각각의 첫 번째 항(x) 가 같다면 두 번째 항을 비교해서 나열하고, 아니라면 첫 번째 항을 비교해서 나열
points.Sort((x,y) => x.x == y.x? x.y.CompareTo(y.y ) : x.x.CompareTo(y.x)) ;
foreach (var point in points)
{
Console.WriteLine(point.x + " " + point.y);
}
}
}
한 삼십분 고민하다 이렇게 했는데 시간 초과가 떴다.
StringBuilder를 사용해서 해결 !
다른 사람의 흥미로운 풀이
List.Sort만 해도 자연스럽게 되는 것 같기도 하다.
++ 직접 해보니 된다....
코딩테스트 : 11651번 좌표 정렬하기 2
1 초 | 256 MB | 91932 | 60251 | 51455 | 66.995% |
문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
using System;
using System.Net.Sockets;
using System.Text;
public class Program
{
public static void Main()
{
int number = Int32.Parse(Console.ReadLine());
List<(int x, int y)> points = new List<(int x, int y)>();
for (int i = 0; i < number; i++)
{
int[] point = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
points.Add((point[0], point[1]));
}
// x와 y를 비교하는데, 각각의 첫 번째 항(x) 가 같다면 두 번째 항을 비교해서 나열하고, 아니라면 첫 번째 항을 비교해서 나열
// 이번엔 다르게 y좌표 먼저, 그리고 x좌표
points.Sort((x,y) => x.y == y.y? x.x.CompareTo(y.x ) : x.y.CompareTo(y.y)) ;
StringBuilder sb = new StringBuilder();
foreach ((int x, int y) in points)
{
sb.AppendLine($"{x} {y}");
}
Console.WriteLine(sb);
}
}
위에서 한 공부가 헛되지 않았다. 한 번에 바로 성공 !
코딩테스트 : 1181번 단어 정렬
2 초 | 256 MB | 215203 | 91298 | 68277 | 40.698% |
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
using System;
using System.Net.Sockets;
using System.Text;
public class Program
{
public static void Main()
{
int n = int.Parse(Console.ReadLine());
SortedDictionary<string, int> dic = new SortedDictionary<string, int>();
for (int i = 0; i < n; i++)
{
string s = Console.ReadLine();
int count = s.Length;
if (!dic.ContainsKey(s))
{
dic.Add(s, count);
}
}
var sorted = dic.OrderBy(x => x.Value);
foreach (var item in sorted)
{
Console.WriteLine(item.Key);
}
}
}
자동으로 정렬해주는 SortedDictionary라는 자료형이 있다. 처음 알았다.
그러나 이건 Key값을 기준으로 정렬해 주었기 때문에 따로 또 count를 기준으로 정렬을 해 주어야 한다.
혹은
List<KeyValuePair<string, int>> list = dic.ToList();
list.Sort((a, b) => a.Value == b.Value ? a.Key.CompareTo(b.Key) : a.Value.CompareTo(b.Value));
foreach (var item in list)
{
Console.WriteLine(item.Key);
}
이런 방식으로 list화 시켜서 정렬해도 된다.
다른 사람의 흥미로운 풀이
린큐로 한 번에 정렬할 수 있다.
list = list.Distinct().OrderBy(x => x.Length).ThenBy(x => x).ToArray();
내가 생각하지 못했던 것은, 글자수는 그냥 Length로 한 번에 정렬할 수 있었다는걸 까먹었다는 것이다.
오늘 너무 놀아서 슬프다..
'코딩테스트' 카테고리의 다른 글
1620번 나는야 포켓몬 마스터 이다솜 (0) | 2025.02.02 |
---|---|
10814번 나이순 정렬, 18870번 좌표 압축, 10815번 숫자 카드, 14425번 문자열 집합, 7785번 회사에 있는 사람 (0) | 2025.02.01 |
10989번 수 정렬하기 3, 1427번 소트 인사이드 (0) | 2025.01.30 |
1436번 영화감독 슘, 2839번 설탕 배달, 2750번 수 정렬하기, 2751번 수 정렬하기2 (0) | 2025.01.28 |
24313번 점근적 표기 1 , 2798번 블랙잭, 2231번 분해합, 19532번 수학은 비대면 강의입니다 , 1018번 체스판 다시 칠하기 (0) | 2025.01.28 |