내일배움캠프 - TIL/내일배움캠프 - TIL

내일배움캠프 7일차 TextRPG 마무리, C# 체크리스트 문제은행

rudals4469 2025. 4. 18. 20:51

 

TextRPG 마무리, C# 체크리스트 문제은행

오늘은 이번 주차 개인과제였던 TextRPG를 최종 마무리를 하고, C# 체크리스트 문제은행에 있는 3파트까지 쭉쭉 풀어나갔다.

 

먼저 개인과제는 어제 포스트에 작성하다가 마지막 던전 구현에서 구현해야 하던 내용과 내가 구현한 내용이 상이한 부분이 있어 스크립트를 수정하였고, C# 체크리스트 문제은행은 풀다가 재밌거나 몰랐던 부분이 있었던 문제들을 몇 개 선정하여 가져와보았다.

 

개인과제 던전파트부터 봐보자.

 

나는 방어력이 낮으면 클리어 불가와 40퍼 확률로 체력이 다는 기능으로 구현하였는데 다시 읽어보니 60퍼 확률로는 던전을 클리어 해야되는 거였다!

그래서 조건문 하나를 줄이고 실패 조건을 권장방어력 보다 낮고 && 실패 랜덤 값 < 4 일 때 실패하고 나머진 클리어 판정이 있게 설계 하였다.

if (player.Def < RecommendDef && FailProbability < 4)
{
    Console.Clear();
    Console.WriteLine("던전 실패");
    player.HP -= HPrandNumber + player.Def;
    Console.WriteLine($"체력 {beforeHP} -> {player.HP} ");

    Console.WriteLine("\n0. 나가기");
    Console.WriteLine("\n원하시는 행동을 입력해주세요.");
    Console.Write(">> ");

}
else
{
...
}

 

또 깃이 말썽을 부려 스크립트를 수정하고 주석을 정리했는데 무려 깃 데스크탑에는 안뜨는게 아닌가.. 근데 깃에는 수정된 버전으로 들어가있는 것이었다... 이게 대체 뭐람.. 바로 든든한 같은 조원분께 헬프를 쳐서 수정하였는데 문제점은 레퍼지토리 경로가 이상하게 들어가있었던 것..

 

이렇게 개인 과제 최종 제출을 완료하고 이제 오후 시간에는 코딩테스트 겸 체크리스트 문제은행을 주구장창 풀었다.

 

그 중 어렵거나 답이 신기하거나 새롭게 얻어가는 파트가 있는 문제들을 가져왔다. 바로 로직 벗겨 봐야겠지

 

문제 설명

머쓱이네 피자가게는 피자를 일곱 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return 하는 solution 함수를 완성해보세요.


제한사항
  • 1 ≤ n ≤ 100

입출력 예nresult
7 1
1 1
15 3

입출력 예 설명

입출력 예 #1

  • 7명이 최소 한 조각씩 먹기 위해서 최소 1판이 필요합니다.

입출력 예 #2

  • 1명은 최소 한 조각을 먹기 위해 1판이 필요합니다.

입출력 예 #3

  • 15명이 최소 한 조각씩 먹기 위해서 최소 3판이 필요합니다.
using System;

public class Solution {
    public int solution(int n) {
        int answer = 0;
        // 한 명당 한 조각을 먹을껀데 한 판에 7조각 즉 7의 배수로 보면 되네
    
        return (n-1)/7+1;;
    }
}

 

와 이 코드는 내가 짠 코드는 아니고 답을 제출 하고 봤는데 1줄로 코딩 되어 구현되어있길래 이거 물건이네 하면서 가져와봤다. 나는 무려 8줄이 넘는 코드였거든..

 

설명해보자면 입력을 n, 즉 사람 수를 하게 되고 피자는 한 판 당 7조각이 된다. 7명까지는 1판 8명 부턴 2판이 되겠지.

 

(n-1) /7 +1 // 즉 입력 수 -1를 받아 그걸 피자 조각 수로 나눈다. 그리고 +1을 해주어 계산을 하였다.

이렇게 보면 정말 이걸 생각 못했냐 라고 할 순 있지만, 생각이 안낫다. 정말로.

 

문제 설명

어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ n ≤ 1,000,000

입출력 예nresult
144 1
976 2

입출력 예 설명

입출력 예 #1

  • 144는 12의 제곱이므로 제곱수입니다. 따라서 1을 return합니다.

입출력 예 #2

  • 976은 제곱수가 아닙니다. 따라서 2를 return합니다.
 public static int solution(int n)
 {
     int answer = 0;
     double sqrt = Math.Sqrt(n);
     if (n > 0) 
     {
         if(sqrt %1==0)
         {
             return 1;
         }
         else
         {

             return 2;
         }
     }

     return 0;
     
 }

 

위 문제도 길게 풀었는데 제출하고 나니 재밌는 로직이 있길래 가져와 보았다.

먼저 math,Sqrt(n);을 하게 되면 n의 제곱근을 구하는 식이 된다. 첨언으로 math 메서드를 사용하게 되면 double로 반환되더라.

 

쨋든 제곱근을 나머지 계산으로 1로 나누었을 때 안 나눠 떨어지면 제곱근이 아니다.

이게 무슨 소리나면 4의 제곱근은 2이다. 즉 정수로 떨어진다. 그렇다면 1로 나누면 떨어진다.

하지만 3의 제곱근은 루트3이다. 즉 정수로 떨어지지 않는다. 그렇다면 1로 나누어 떨어지지 않으므로 문제에서 원하는 값이 안된다.

 

 

순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ n ≤ 1,000,000

입출력 예

nresult

20 6
100 9

입출력 예 설명

입출력 예 #1

  • n이 20 이므로 곱이 20인 순서쌍은 (1, 20), (2, 10), (4, 5), (5, 4), (10, 2), (20, 1) 이므로 6을 return합니다.

입출력 예 #2

  • n이 100 이므로 곱이 100인 순서쌍은 (1, 100), (2, 50), (4, 25), (5, 20), (10, 10), (20, 5), (25, 4), (50, 2), (100, 1) 이므로 9를 return합니다.

이 문제는 사실 내가 위의 출력을 조금 다르게 생각하여 풀었다.

어떤 방식이었냐면 짜피 20이라는 수의 순서쌍이 될려면 어짜피 10까지만 판정을 해서 약수를 세면 1 2 4 5 10해서 5가지가 될 것이다. 거기에 +1을 해주면 순서쌍을 갯수와 같은 수 밖에없다. 그럼 100을 가지고 생각해보자 50의 약수 1, 2 ,4 , 5, 10, 20, 25, 50으로 8개에 +1개를 하면 9개가 된다. 이걸 생각하고 그냥 입력 받은 수의 절반의 약수 갯수를 판정하고 +1를 하는 식으로 코드를 짜보았다.

 

 

 public static int solution(int n)
 {
     int answer = 0;

    List<int> list = new List<int>();

     for(int i = 1; i<= n/2; i++)
     {
         if(n % i ==0)
         {
             list.Add(i);
         }
     }

     answer = list.Count +1;

     return answer;
     
 }

 

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 1 ≤ order ≤ 1,000,000

입출력 예

orderresult

3 1
29423 2

입출력 예 설명

입출력 예 #1

  • 3은 3이 1개 있으므로 1을 출력합니다.

입출력 예 #2

  • 29423은 3이 1개, 9가 1개 있으므로 2를 출력합니다.
 public static int solution(int order)
 {
     int answer = 0;

     
     while(order >0)
     {
         int temp = order % 10;

         if (temp != 0 && temp % 3 == 0)
         {
             answer++;
         }
         order /= 10;
     }

     return answer;
     
 }

 

이건 여기 소개되지 않았지만 풀었던 입력을 받고 각 자리 수를 더하는 문제에 업그레이드 된 버전이라 기억이 나서 가져왔다. 왜냐면 각 자리 수 더하는 문제를 못풀어서 결국 구글링을 했었거든 하하 하핳 ㅎ하하

 

먼저 입력을 받은 수가 0 보다 작아질 때 까지 계속 돌린다.

그 뒤 temp를 입력 받은 수 % 10 을 해주면 1의 자리 수만 남게 된다. 거기서 3의 배수만을 판정해서 1씩 더해주는 형식을 사용하였다. 그 뒤 입력 받은 수 / 10을 하게 되면 1의 자리수는 사라지게 된다. 그걸 계속 반복하다 보면 결국 0이 되고 무한루프가 끊어지게 되고 답을 가져올 수 있게 된다.

예시를 들어 주면 1532를 하면 처음엔 2를 3의 배수인지 판정하고 나누기 10을 하게 되면 153가 되고 또 3만을 가지고 3의 배수인지 판정하는 것을 반복하는 것이다.

여기서 내가 간과했던 사실이 있는데 0도 3의 나머지 계산에서 0이 나오는 것이다. 그래서 그냥 조건문 자체에 0은 제외 시키는 걸로 구현하였다.

 


회고 

오늘은 이번 주차의 마지막 날이다. 사실 TextRPG는 더 손 볼 생각이 없었기도 했어서 어제부터 시간이 조금 남긴 했다. 그래서 코딩테스트 시간을 조금 늘렸고, 어제는 사과게임을 제작해보았다. 오늘은 문제은행이 있는걸 오늘. 알았기 때문에 이거나 다 풀자 하고 시작했는데 웬걸 생각보다 문제도 많았고 잘 안풀려서 오래 걸렸다. 그래도 차분히 풀다보니 실력이 느는 기분이 났다. 위에 적었던 대로 입력 받은 수 각 자리 더하기는 못 풀었지만 그 로직을 응용해서 369 게임을 풀었던 기억이 뭔가 뿌듯하기도 하고 기억에 남는다. 주말 포스트에서는 만들었던 사과 게임을 또 뜯어보며 설명하는 포스트가 될 것 같다.