7주차 풀이

인소리·2022년 5월 15일
0

Coding Test

목록 보기
5/13

1. 직사각형 별찍기

문제 설명

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다. 별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

제한 조건

🔹 n과 m은 각각 1000 이하인 자연수입니다.

기본 제공 코드

import java.util.Scanner;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        System.out.println(a + b);
    }
}

내 풀이

import java.util.Scanner;

class Solution21 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        for(int i=1; i<=b; i++) {
            for(int j=1; j<=a; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

풀이 설명

a가 가로로 찍히는 별의 개수, b가 세로로 찍히는 별의 개수이므로 이중for문을 이용하여 i를 b만큼 돌리고 j를 a만큼 돌려서 별을 찍어줬다.
별을 a만큼 찍고 나서는 줄바꿈을 해주어야 하기 때문에 안쪽 for문 바깥에 System.out.println();을 넣어주었다.


2. 2016년

문제 설명

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요?
두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요.
요일의 이름은 일요일부터 토요일까지 각각

SUN,MON,TUE,WED,THU,FRI,SAT

입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

제한 조건

🔹 2016년은 윤년입니다.
🔹 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

기본 제공 코드

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        return answer;
    }
}

내 풀이

public class Solution22 {
    public String solution(int a, int b) {
        String[] month = {"FRI","SAT","SUN","MON","TUE","WED","THU"};
        int[] day = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int sum = 0;

        for(int i = 0; i < a - 1; i++) {
            sum += day[i];
        }

        sum += b-1;

        return month[sum%7];
    }
}

풀이 설명

2016년 1월 1일은 금요일이므로 month 배열 시작 문자열을 "FRI"로 시작한다. day 배열은 2016년 1~12월의 날짜 수를 각각 순서대로 넣어줬다.
1월 1일부터 a월 b일까지의 날짜 수를 더하기 위해 for문을 0부터 a-1까지 돌려주면서 0으로 초기화 한 sum에 day[i] 값을 더해준다. (이때 i의 범위는 a월 b일까지 더하기 위해 a-1로 범위를 지정해준 것이다.)
이 다음에 sum에 b-1(배열의 시작은 0이기 때문에 1을 빼주었다.)을 더해줌으로서 a월 b일까지의 날짜를 모두 더해주었다. 마지막으로 month의 sum을 7로 나눈 나머지 값 방을 리턴해준다.


3. 숫자 문자열과 영단어

문제 설명

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요. 참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자 영단어
0  zero
1  one
2  two
3  three
4  four
5  five
6  six
7  seven
8  eight
9  nine

제한사항

🔹 1 ≤ s의 길이 ≤ 50
🔹 s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
🔹 return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

기본 제공 코드

class Solution {
    public int solution(String s) {
        int answer = 0;
        return answer;
    }
}

내 풀이

public class Solution23 {
    public int solution(String s) {
        String[] eng_word = {"zero","one","two","three","four","five","six","seven","eight","nine"};
        String[] su = {"0","1","2","3","4","5","6","7","8","9"};

        for(int i=0; i<=9; i++) {
            s=s.replace(eng_word[i],su[i]);
        }

        int answer = Integer.parseInt(s);

        return answer;
    }
}

풀이 설명

치환해줄 eng_word와 su 배열을 선언해준다. 문자열을 치환해주는 함수인 replace()를 이용하여 s 안에 들어있을 각 eng_word[i]를 su[i]로 치환해주었다.
문자열을 정수형으로 바꿔주는 함수인 Integer.parseInt()를 사용하여 s를 정수형을 바꿔 answer에 넣어준 후 반환해주었다.


4. 콜라츠 추측

문제 설명

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.

예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요.
단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

제한 조건

🔹 입력된 수, num은 1 이상 8000000 미만인 정수입니다.

기본 제공 코드

class Solution {
    public int solution(int num) {
        int answer = 0;
        return answer;
    }
}

내 풀이

public class Solution24 {
    public int solution(int num) {
        int answer = 0;
        while(true) {
            if(num==1) break;

            if(num%2==0) num/=2;
            else if(num%2==1) num=num*3+1;

            if(answer>500) {
                answer=-1;
                break;
            }
            answer++;

        }
        return answer;
    }
}

풀이 설명

먼저 num이 1일 경우 바로 0을 반환해줘야 하기 때문에 num이 1일 때 while문을 빠져나가도록 하였다. 1이 아니라면 짝수인지 홀수인지를 구분하여 그에 맞게 계산을 하고 answer++을 해주었다.
만약 answer이 500을 넘어가게 된다면 answer에 -1 값을 넣어주고 while문을 빠져나오게 하였다.


5. 부족한 금액 계산하기

문제 설명

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한 조건

🔹 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
🔹 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
🔹 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

기본 제공 코드

class Solution {
    public long solution(int price, int money, int count) {
        long answer = -1;

        return answer;
    }
}

내 풀이

public class Solution25 {
    public long solution(int price, int money, int count) {
        long sum = 0;
        for(int i = 1; i <= count; i++) {
            sum += i * price;
        }
        long answer = money - sum;
        if(answer >= 0) answer = 0;
        return Math.abs(answer);
    }
}

풀이 설명

for문을 count만큼 돌리면서 0으로 초기화 한 sum에 price의 i배인 값을 더해준다. 그리고 answer에 money에서 sum을 뺀 값을 넣어준다. 이 때 answer이 0이거나 0보다 크면 금액이 부족하지 않기 때문에 0을 리턴해주고 아니면 Math.abs() 함수를 이용하여 answer을 절대값으로 리턴해준다.

profile
코딩이라는 감옥에 갇혀 사는 삶

0개의 댓글

관련 채용 정보