이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.
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();
for(int i=0; i<b; i++){
for(int j=0; j<a; j++){
System.out.print("*");
}
System.out.println();
}
}
}
문제 푸는 과정
a의 역할은 가로, b의 역할은 세로이다. 첫번째 반복문은 세로의 역할을 하고, 두번째 반복문은 가로의 역할을 한다. 따라서 b 반복문 안에 a 반복문을 넣어준다. 가로가 한줄 끝나고 나면 줄바꿈을 해준다.
문제 링크 🔗 : 직사각형 별찍기
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"를 반환하세요.
class Solution {
public String solution(int a, int b) {
String[] day = {"FRI","SAT","SUN","MON","TUE","WED","THU"};
int[] date = {31,29,31,30,31,30,31,31,30,31,30,31};
int select = 0;
for(int i = 0; i < a-1; i++){
select += date[i];
}
select += b - 1;
return day[select % 7];
}
}
문제 푸는 과정
1월 1일이 금요일이므로 금요일부터 시작하여 요일의 이름을 저장한다.
배열은 0부터 시작하므로 인덱스를 맞춰주기 위해 a-1까지 모든 월의 일수를 더한 후 b-1을 더해 1월 1일부터 a월 b일까지 모든 날짜를 더한 값을 일주일의 수인 7로 나누면 요일을 구할 수 있다.
문제 링크 🔗 : 2016년
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
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
class Solution {
public int solution(String s) {
String[] num = new String[]{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for (int i = 0; i < num.length; i++) {
s = s.replace(num[i], String.valueOf(i));
}
return Integer.parseInt(s);
}
}
0~9까지 맵핑된 영단어를 바꿔주기 위해 replace 메서드를 사용했다.
index에 맞는 영단어를 해당하는 영단어에 맞는 숫자로 바꾼 후 마지막에 정수형으로 변환하였다.
문제 링크 🔗 : 숫자 문자열과 영단어
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을 반환해 주세요.
class Solution {
public long solution(long num) {
int answer = 0;
while(num != 1){
if(answer > 500){
answer = -1;
break;
}
if(num%2==0) num = num/2;
else num = num*3 + 1;
answer++;
}
return answer;
}
}
문제 푸는 과정
num을 1로 만들기 위해 반복문을 돌린다. 만약 num이 1이 된다면 작업이 끝났으므로 반복문을 종료한다. 작업의 횟수가 500이 넘어가면 반복문을 멈추고 -1을 리턴한다.
num의 홀짝 여부를 판단하기 위해 2로 나눴을 때 나머지를 구하여 0일 경우 num을 2로 나눴고, 나머지가 있을 경우 3을 곱한 뒤 1을 더했다. 위의 작업을 지나고 나면 하나의 작업이 완료된 것이므로 answer을 증가시킨다.
문제 링크 🔗 : 콜라츠 추측
새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.
class Solution {
public long solution(int price, int money, int count) {
long answer = money;
for(int i=1; i<=count;i++){
answer-=i*price;
}
if(answer > 0) answer = 0;
return Math.abs(answer);
}
}
현재 가지고 있는 돈은 money이다. money에서 이용료를 빼기 위해 answer에 money를 대입하였다.
이용료는 탄 횟수만큼 배가 된다. 그래서 반복문을 돌려 탄 횟수에 가격을 곱하여 현재 가진 돈에서 뺐다. 만약 남은 돈이 0보다 크다면 금액이 부족하지 않아 0을 반환하고 0보다 작다면 부족한 금액이기 때문에 절댓값을 반환한다.
문제 링크 🔗 : 부족한 금액 계산하기