본문 바로가기

백준/단계별47

백준 11653 C#) 소인수분해 소인수분해 자체는 어렵지 않지만 이를 얼마나 빠르게 처리할 수 있는지가 관건이다. int n = int.Parse(Console.ReadLine()); int n_sqrt = (int)Math.Sqrt(n); int m = 2; while (n != 1) { if (n % m == 0) { Console.WriteLine(m); n /= m; n_sqrt = (int)Math.Sqrt(n); continue; } m++; if (m > n_sqrt) { Console.WriteLine(n); break; } } 정수 n이 주어지면 이를 m으로 계속 나눠보면 된다. 그러다 더 이상 m으로 나누어떨어지지 않으면 m을 1 증가시키고 다시 시도한다. (도중에 m이 합성수가 될 수도 있지만 어차피 나누어떨어지지 .. 2022. 5. 6.
백준 2839 C#) 설탕 배달 3과 5를 최소로 조합하여 숫자 n을 만드는 문제이다. int n = int.Parse(Console.ReadLine()); int cnt = 0; while (n % 5 != 0 && n > 0) { n -= 3; cnt++; } Console.Write(n >= 0 ? cnt + n / 5 : -1); 그냥 n에서 3을 계속 빼주다가 5의 배수가 되는 시점에서 멈추면 된다. 혹시라도 n이 0보다 작아진다면 이는 3과 5로 조합할 수 없는 숫자라는 뜻인데, 그럴 경우는 n이 1, 2, 4, 7일 때만 가능하다. 이외에는 전부 조합이 가능하니 미리 예외 처리를 해도 좋다. 참고로 5의 나머지로 경우의 수를 나누는 풀이도 있다. 다만 반복문을 돌려도 금방 빠져나오기 때문에 속도에는 큰 차이가 없을 것이다. 2022. 5. 6.
백준 10250 C#) ACM 호텔 문제 자체는 간단한데 지문이 상당히 길어 헷갈리기 쉽다. StreamWriter sw = new (new BufferedStream(Console.OpenStandardOutput())); int t = int.Parse(Console.ReadLine()), y, x; int[] hwn; for (; t > 0; t--) { hwn = Array.ConvertAll(Console.ReadLine().Split(), int.Parse); y = hwn[2] % hwn[0]; x = hwn[2] / hwn[0]; if (y == 0) y = hwn[0]; else x += 1; sw.WriteLine(y * 100 + x); } sw.Close(); 문제를 읽어보면 "102 호보다 2101 호를 더 선호한다.. 2022. 5. 5.
백준 2869 C#) 달팽이는 올라가고 싶다 간단한 일차부등식 문제이다. int[] abv = Array.ConvertAll(Console.ReadLine().Split(), int.Parse); int a = abv[0]; int b = abv[1]; int v = abv[2]; int day = (int)Math.Ceiling((double)(v - b) / (a - b)); Console.Write(day); 구하고자 하는 답을 x로 설정한다면 아래 식처럼 표현할 수 있다. 여기서 a, b, v는 문제에서 설명하였다. 이 문제의 포인트는 두 가지인데, 하나는 달팽이의 이동 거리가 (a - b) * x가 아니라는 점이다. 왜냐하면, 달팽이가 미끄러지는 횟수는 올라가는 횟수보다 항상 한 번이 적기 때문이다. 달팽이는 정상에 오르기 전까지는 계속 .. 2022. 5. 4.
백준 2292 C#) 벌집 벌집에 층이 있다고 생각하자. (아래 사진 참조) 1층 : 1 2층 : 2 ~ 7 3층 : 8 ~ 19 ... 여기서 각 층마다 끝번호를 구하면 차례대로 1, 7, 19, 37, 61 ... 이 되는데 이를 점화식으로 표현하면 층수 n에 대하여 A(1) = 1, A(n) = A(n - 1) + 6(n - 1) 이라고 할 수 있다. 이 점화식을 이용하여 문제를 풀어보자. int n = int.Parse(Console.ReadLine()); int last = 1; int cnt = 1; while (n > last) { last = last + 6 * (++cnt - 1); } Console.Write(cnt); 위에서 구한 점화식으로 끝번호 last를 계속 구한다. 여기서 층수는 cnt이다. last가 .. 2022. 4. 27.
백준 1316 C#) 그룹 단어 체커 문제는 간단하다. 같은 알파벳은 반드시 붙어있어야 한다는 것이다. int n = int.Parse(Console.ReadLine()); int cnt = 0; string s; while (n-- > 0) { s = Console.ReadLine(); cnt++; for (int i = 0; i 1) { cnt--; break; } } } Console.Write(cnt); 내 아이디어는 이러하다. 문자열 "aaabbaa"에서 a를 검사한다고 치자. 그럼 현재 a와 제일 가까운 다음 a의 인덱스 차이를 구할 수 있을 것이다. 이때 그 차이가 1이라면 a는 서로 붙어 있다는 뜻이 되지만 1보다 크다면 그렇지.. 2022. 4. 27.
백준 2941 C#) 크로아티아 알파벳 다른 문자열은 괜찮은데 dz=가 조금 골치아프다. int cnt = 0; bool flag = false; string s = Console.ReadLine(); for (int i = 0; i < s.Length; i++) { if (i + 1 < s.Length) { switch ((s[i], s[i + 1])) { case ('c', '='): case ('c', '-'): case ('d', '-'): case ('l', 'j'): case ('n', 'j'): case ('s', '='): continue; case ('d', 'z'): flag = true; continue; case ('z', '='): if (flag) flag = false; continue; } } cnt++; if (.. 2022. 4. 27.
백준 1152 C#) 단어의 개수 이 문제를 푸는 아이디어는 간단하다. 커서가 문자열을 훑는다고 할 때, 공백에서 문자로 넘어가는 그 타이밍에만 셈하면 된다. int cnt = 0; bool flag = true; string s = Console.ReadLine(); foreach (char c in s) { //공백에 이어 문자가 나왔는가 if (flag && c != ' ') cnt++; //공백이 나왔는가 flag = (c == ' '); } Console.Write(cnt); 정답률이 상당히 낮은 문제지만 코드는 전혀 복잡하지 않다. 오히려 그 타이밍만 잘 캐치할 수 있다면 공백이 한 개가 아닌 열 개가 연속으로 나와도 문제를 해결할 수 있다. 포인트라고 할 부분은 없지만 굳이 꼽자면 flag의 초기값을 true로 설정하는 것 .. 2022. 4. 22.