코딩테스트

코딩 테스트 : 종이 자르기, 로그인 성공, 치킨 쿠폰, 등수 매기기, 특이한 정렬, 문자 밀기

Cadi 2025. 1. 13. 16:21

코딩테스트 : 종이 자르기

머쓱이는 큰 종이를 1 x 1 크기로 자르려고 합니다. 예를 들어 2 x 2 크기의 종이를 1 x 1 크기로 자르려면 최소 가위질 세 번이 필요합니다.

정수 M, N이 매개변수로 주어질 때, M x N 크기의 종이를 최소로 가위질 해야하는 횟수를 return 하도록 solution 함수를 완성해보세요

using System;

public class Solution {
    public int solution(int M, int N) 
    {
        int answer = 0;

        answer = (M * N) - 1;
        
        return answer;
    }
}

 

이게 왜 정답률이 72%.... ? 풀어 놓고서도 어떤 예외가 있으면 안되는걸까 ? 하면서 봤는데.

 

 

코딩테스트 : 로그인 성공 ?

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.

using System;
using System.Diagnostics.Contracts;

public class Solution {
    public string solution(string[] id_pw, string[,] db) 
    {
        string answer = "";

        string idInput = id_pw[0];
        string pwInput = id_pw[1];

        for (int i = 0; i < db.GetLength(0); i++)
        {
            if (db[i, 0] != idInput)
            {
                answer = "fail";
            }
            else
            {
                answer = "wrong pw";
                if (db[i, 1] == pwInput)
                {
                    answer = "login";
                }
            }
        }
        
        
        
        return answer;
    }
}

 

이렇게 코드를 구성했는데 테스트 1번이 틀려서 계속 고민했다. 

검사를  한 번만 해야 하는데, 맞는 아이디를 찾아서 검사한 뒤에도 다시 반복문을 도는 것 같다. 

using System;
using System.Diagnostics.Contracts;

public class Solution {
    public string solution(string[] id_pw, string[,] db) 
    {
        string answer = "";

        string idInput = id_pw[0];
        string pwInput = id_pw[1];

        for (int i = 0; i < db.GetLength(0); i++)
        {
            if (db[i, 0] == idInput)
            {
                if (db[i, 1] == pwInput)
                {
                    answer = "login";
                }
                else
                {
                    answer = "wrong pw";
                }
                break;
            }

            answer = "fail";
        }
        return answer;
    }
}

해결 ~

 

다른 사람의 흥미로운 풀이

 

코드를 확 줄여서 두 줄로 푸신 분도 있다. 삼항 연산자를 사용해볼 것 ! 

 

 

 

코딩테스트 : 치킨 쿠폰

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.

using System;

public class Solution {
    public int solution(int chicken) 
    {
        int answer = 0;

        while (chicken >= 10)
        {
            int leftChicken = chicken % 10;
            answer += chicken / 10;
            chicken = chicken / 10 + leftChicken;
        }
        
        return answer;
    }
}

다른 사람의 흥미로운 풀이

 

나름 간단하게 잘 푼 것 같다. 

 

 

코딩테스트 : 등수 매기기

영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.

using System;
using System.Runtime.CompilerServices;

public class Solution
{
    public int[] solution(int[,] score)
    {
        int[] answer = new int[score.GetLength(0)]; { };
        int[] Scoreplus = new int[score.GetLength(0)]; { };


        for (int row = 0; row < score.GetLength(0); row++)
        {
          Scoreplus[row] =score[row,0] + score[row,1];
        }

        for (int i = 0; i < Scoreplus.Length; i++)
        {
            int index = 1;
            for (int j = 0; j < Scoreplus.Length; j++)
            {
                // 여기다 '같다'를 넣어 버리면 22가 되어버려야 하는 것이 33이 되어버림.
                if (Scoreplus[i] < Scoreplus[j])
                {
                    index++;
                }
            }
            answer[i] = index;
        }
        return answer;
    }
}

 

린큐를 활용해 보고 싶었지만 잘 모르겠어서 그냥 하던 방식대로 했다. 

다른 사람의 흥미로운 풀이

 

 

코딩테스트 : 특이한 정렬

정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.

using System;

public class Solution {
    public int[] solution(int[] numlist, int n)
    {
        int[] answer = new int[numlist.Length];{};
        int[] newNumList = new int[numlist.Length];
        for (int i = 0; i < numlist.Length; i++)
        {
            newNumList[i] = numlist[i] - n;
        }

        for (int i = 0; i < newNumList.Length; i++)
        {
            int index = 0;
            for (int j = 0; j < newNumList.Length; j++)
            {
                if (Math.Abs(newNumList[i]) > Math.Abs(newNumList[j]))
                {
                    index++;
                }
            }
            answer[index] = numlist[i];
        }
        
        return answer;
    }
}

 

일단 테스트하려고 이렇게 짰다.

중복 체크는 나중에 하려고 ! 근데 오류가 떠서 보니까 예시  코드가 둘 다 중복이 있다.

using System;

public class Solution {
    public int[] solution(int[] numlist, int n)
    {
        int[] answer = new int[numlist.Length];{};
        int[] newNumList = new int[numlist.Length];
        for (int i = 0; i < numlist.Length; i++)
        {
            newNumList[i] = numlist[i] - n;
        }

        for (int i = 0; i < newNumList.Length; i++)
        {
            int index = 0;
            for (int j = 0; j < newNumList.Length; j++)
            {
                if (i != j)
                {
                    if (Math.Abs(newNumList[i]) > Math.Abs(newNumList[j]))
                    {
                        index++;
                    }

                    if (Math.Abs(newNumList[i]) == Math.Abs(newNumList[j]))
                    {
                        if (newNumList[i] < newNumList[j])
                        {
                            index++;
                        }
                    }
                }
              
            }
            answer[index] = numlist[i];
        }
        
        return answer;
    }
}

다른 사람의 흥미로운 풀이

 

이것도 린큐로 두 줄만에 푸는 사람이 있다. 

진짜 편리한 기능 많네...

하지만 결국 논리는 같다. 배열의 숫자들에 n을 빼 주고, 절대값으로 정렬한 뒤, 절대값이 같으면 숫자 순으로 ! 

 

 

코딩테스트 : 문자열 밀기

문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

using System;

public class Solution {
    public int solution(string A, string B)
    {
        int answer = -1;
        string newA = A;

        for (int i = 0; i < A.Length; i++)
        {
            newA = A[i] + newA  ;
            // 하나 더해졌으니 마지막 -1이 아닌 마지막 인덱스를 지워줌
            newA=newA.Remove(A.Length);

            if (newA == B)
                return i;
        }
        return answer;
    }
}

 

물론 아직 예외처리( 처음이 같을 때 ) 를 안하긴 했지만 안되서 당황했다.

보니까 뒤의 문자를 앞으로 가져오는 거였더라구...

using System;

public class Solution {
    public int solution(string A, string B)
    {
        int answer = -1;
        string newA = A;

        if (A == B) return 0;
        for (int i = A.Length -1; i > 0; i--)
        {
            //첫 번째에 추가함
            newA = A[i] + newA  ;
            
            // 하나 더해졌으니 마지막 -1이 아닌 마지막 인덱스를 빼줌
            newA=newA.Remove(A.Length,1);

            if (newA == B)
            {
                return A.Length-i;
            }
        }
        return answer;
    }
}

풀이 완

 

다른 사람의 흥미로운 풀이

 

진짜 육성으로 ' 와 ' 소리 나오는 한 줄 풀이가 있다.

힌트를 주자면 '굳이 한 칸씩 미는 행위에 매몰될 필요가 없다' 

나중에 다시 풀 것이므로 풀이는 패스 !