프로그래밍 문제 - Sizuha/devdog GitHub Wiki
실제 코드를 작성하는게 아니라, 간단히 답을 할 수 있는 문제들
以下のソースには一つ重大な問題がある。どう修正すれば良いか?
import java.util.LinkedList;
import java.util.List;
public final class Sample {
static class NameCard {
String name;
String email;
}
public static void main(String[] args) {
final List<NameCard> nameCards = new LinkedList<>();
final String[] names = {"Person A","Person B","Person C",};
final String[] emails = {"[email protected]","[email protected]","[email protected]",};
final NameCard newCard = new NameCard();
for (int i=0; i<names.length; i += 1) {
newCard.name = names[i];
newCard.email = emails[i];
nameCards.add(newCard);
}
for (NameCard card: nameCards) {
System.out.println("\n-------------------");
System.out.println(card.name);
System.out.println(card.email);
System.out.println("-------------------");
}
}
}
IDiceインタフェースの内容を作成してください。
interface IDice {
// ここの内容を作成してください
}
class Dice6 implements IDice {
public int getMin() { return 1; }
public int getMax() { return 6; }
protected int checkLimit(int value) {
final int min = getMin();
final int max = getMax();
if (value < min) return min;
else if (value > max) return max;
else return value;
}
public int roll(int bonus) {
final int result = new Random().nextInt(6) + 1 + bonus;
return checkLimit(result);
}
public int[] rollTimes(int times) {
final int[] result = new int[times];
for (int i=0; i<times; i++) result[i] = roll(0);
return result;
}
}
class Dice12 implements IDice {
public int getMin() { return 1; }
public int getMax() { return 12; }
protected int checkLimit(int value) {
final int min = getMin();
final int max = getMax();
return (value < min) ? min : (value > max) ? max : value;
}
public int roll(int bonus) {
final int result = new Random().nextInt(12) + 1 + bonus;
return checkLimit(result);
}
public int[] rollTimes(int times) {
final int[] result = new int[times];
for (int i=0; i<times; i++) result[i] = roll(0);
return result;
}
}
class Dice3 implements IDice {
public int getMin() { return 0; }
public int getMax() { return 2; }
protected int checkLimit(int value) {
if (value < 0) return 0;
if (value > 2) return 2;
return value;
}
public int roll(int bonus) {
final int result = new Random().nextInt(3) + bonus;
return checkLimit(result);
}
public String[] rollTimes(int times) {
final String[] result = new String[times];
for (int i=0; i<times; i++) {
final int dice = roll(0);
switch (dice) {
case 1: result[i] = "Good"; break;
case 2: result[i] = "Best"; break;
default: result[i] = "Bad"; break;
}
}
return result;
}
}
下記のJavaコードを実行した場合、予想される結果とその理由は?
public final class Sample2 {
static int power(int a, int b) {
int result = 1; // 4byte integer type
for (int i=0; i<b; i++) result *= a;
return result;
}
public static void main(String[] args) {
final int result = power(2, 31);
System.out.println(String.format(">> %d", result));
}
}
a = 10; b = 20; 여기서 a와 b의 값을 서로 바꿔서 넣기. (swap)
int a = 10;
int b = 20;
/* a는 b의 값을, b는 a의 값을 가지게 해보자 */
// TODO ...
- 1부터 100까지의 합을 계산
- 1 ~ 100까지의 짝수의 합을 계산
- 2 ~ 99까지의 숫자에서 소수(1과 자기 자신으로만 나누어 떨어지는 수)만 구하기(소수만 출력하기)
- 2 ~ 99까지의 숫자에서 소수를 찾는데, 소수를 10개까지만 구하기
int형 인수 a와 b를 넘겨 받아서, a나 b 중에 큰 쪽을 반환(return)하는 함수를 작성. (만약 a == b인 경우는 둘중 아무거나 반환해도 된다.)
int형 인수 a와 b를 받아서, a를 b회만큼 곱한 결과를 반환. 즉, a의 b제곱을 구하는 함수를 작성. (단 b는 0 보다 큰 값이 들어온다고 가정한다.)
- 정수 n을 입력 받아서, 1 ~ n까지의 합을 구하는 함수를 작성.
- 위 문제를, 제어문(for, if 등)을 사용하지 않고 풀어보기.
입력받은 가격(엔)을 넘겨받아, 소비세 8% 포함된 가격을 계산해서 반환하는 매서드를 작성. 1엔 이하는 반올림으로 계산해서, 결과값은 반드시 정수로 반환.
예) 93 => 100
※ 반올림 처리는 라이브러리에 있는 수학 함수(round 등)를 쓰지 말고, 직접 계산해 볼 것.
int형 배열 a에 1부터 10까지의 수를 채워넣고, 배열 a로부터 10, 9, 8, ... 1 순으로 값을 꺼내서 출력
int[] a = new int[] {53, 74, 57, 83, 25, 47, 42, 48, 57, 25, 20, 42, 96, 31};
// 배열 a에서 가장 큰 수를 찾아낼 것.
위 Q2-1문제에서, 배열 a의 내용을 오름차순(작은 숫자에서 큰 숫자 순서로)으로 정렬(sort)할 것.
위 Q2-1문제에서, 배열 a의 내용을 내림차순(큰 숫자에서 작은 숫자 순서로)으로 정렬(sort)할 것.
다음 문장에서 문자 F(대소문자 포함)가 몇개 포함되어 있는지 세기
Four score and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty, and dedicated to the proposition that all men are created equal.
아래와 같이 영어 한 문장을 입력받아서, 입력 받은 문장 안에서 알파벳 a ~ z가 각각 몇번씩 사용되었는지 계산. (대소문자는 구분하지 않는다)
입력 예시:
Java provides a data structure, the array, which stores a fixed-size sequential collection of elements of the same type. An array is used to store a collection of data, but it is often more useful to think of an array as a collection of variables of the same type.
출력 예시:
a: 00
b: 00
. . .
z: 00
Q. 다음 6x4 배열의 내용을 반시계방향으로 90도 회전 시킨 4x6 배열을 만드는 코드를 작성.
char[][] board = {
{'*','*',' _','_ ','_ ','_ '},
{'*','*','_ ','_ ','_ ','_ '},
{'*','*','*','*','*','*'},
{'*','*','*','*','*','*'}
};
변경전:
**____
**____
******
******
변경후:
__**
__**
__**
__**
****
****
입력받은 문자열 source에서, 히라가나를 카타가나로 변환해서 반환하는 매서드를 작성.
입력 예:
きたこれ
출력 예:
キタコレ
정수 n을 입력받아, 1 1 부터 시작되는 피보나치 수열 n번째 까지 출력하는 코드를 작성.
입력 예:
10
출력 예:
1 1 2 3 5 8 13 21 34 55
다음과 같이, 5x5 크기 빙고판의 상태를 입력받는다.
입력 예:
1번째 행: OXOXO
2번째 행: XOXXO
3번째 행: OXOXO
4번째 행: XOXOO
5번째 행: OOXXO
그러면, O 마크가 표시된 것만을 대상으로, 가로 세로 대각선으로 5개의 O마크가 연속된게 있으면 1점씩 처리. 그래서 총 몇점인지 계산해서출력한다.
출력 예:
2
0 ~ 9까지의 숫자를 중복되지 않게 조합해서 만들 수 있는 모든 3자리 정수를 출력할 것.
단, 이때 정수의 맨 앞자리가 0이 되어서는 안된다. (예: 012 같은 경우)
출력 예:
102, 103, 104, 105, 106, 107, 108, 109, 120, 123, 124, 125, 126, 127, 128, 129, 130, 131, ..., 987
위 문제에서, 3자리 정수만이 아니라, 정수 n(1 ~ 10 범위내)을 입력 받아서 n자리수 조합을 모두 출력할 것.
다음과 같이 한개의 XML 태그를 포함하고 있는 문자열을 입력 받아서, Key/Value를 구분해서 저장할 것.
입력예:
<title>Test Sample</title>
출력예:
key: title
value: Test Sample
"1+2*10/2" 같은 사칙연산이 포함된 수식을 문자열로 받아서, 그 계산 결과를 반환(float형)하는 함수를 작성.
float calc(String exp) {
return /* exp문자열을 해석해서 연산 결과를 반환. */
}
제한 사항
- 수식에 포함되는 숫자는 모두 0이상의 정수이고, 음수는 포함되지 않는다고 가정한다.
- 수식에 숫자와 연산자 이외에, 공백 등의 다른 문자들은 포함되지 않는다고 가정한다.
- 사칙연산(+ - * /)만 수행한다.
- 또한 수학 연산의 우선순위는 적용하지 않는다. 무조건 왼쪽부터 오른쪽 순으로 계산한다.
다음과 같이 A ~ Z까지 알파벳으로 구성된 수식에서, 각각의 알파벳에 어떤 숫자가 들어가야 수식이 성립되는지 구하는 코드를 작성.
입력 예:
수식 입력: SEND+MORE
결과 입력: MONEY
위 경우, SEND+MORE = MONEY 이 수식을 만족하는 모든 숫자 조합을 출력한다.
출력 예:
SEND+MORE = MONEY
S=9 E=5 N=6 D=7 M=1 O=0 R=8 Y=2
물론 수식을 만족하는 조합은 여러 개가 있을 수 있으므로, 성립되는 모든 숫자 조합을 출력할 것.
(※답이 존재하지 않을 수도 있다. 이 경우는 답 없음으로 처리.)
제한 사항
- 숫자 종류가 0 ~ 9 이므로, 수식에 등장하는 알파벳 갯수도 10개를 넘지 않는다.
- 수식은 + - 연산만 존재한다.
- 숫자의 맨 앞자리는 0이 될수 없다.
Test Case
SEND+MORE=MONEY
FORTY+TEN+TEN=SIXTY
ADAM+AND+EVE=MOVED
FIVE+FIVE+NINE+ELEVEN=THIRTY
CROSS+ROADS=DANGER
USE+LESS=KIDDY
GREEN+ORANGE=COLORS
COFFEE+COFFEE+COFFEE=THEOREM
다음과 같이 알파벳으로 구성된 수식을 입력받아서,
SEND+MORE=MONEY
EMAIL=SPAM+SPAM+SPAM+SPAM+SPAM+SPAM
FORTY+TEN+TEN= SIXTY
NUMBER= SQUARE+SQUARE+SQUARE+SQUARE
SEVENTY= FIVE+SEVEN+ELEVEN+TWELVE+FIFTEEN+TWENTY
MANET+MATISSE+MIRO+MONET+RENOIR=ARTISTS
SIX+SIX+SIX = NINE + NINE
ABCDE*F=GGGGGG
ADAM+AND+EVE=MOVED
FIVE+FIVE+NINE+ELEVEN=THIRTY
CROSS+ROADS=DANGER
USE+LESS=KIDDY
BILL+WILLIAM+MONICA=CLINTON
GREEN+ORANGE=COLORS
CEZANNE+MANET+MATISSE=ARTISTS
OLD+SALT+TOLD+TALL=TALES
COFFEE+COFFEE+COFFEE=THEOREM
SEND*ME=EMAIL
POWER=YOUR+SHOW
이 식을 만족 시키도록, 각 알파벳에 대응하는 숫자를 찾아라. (식을 만족하는 모든 조합을 찾아낼 것)
위의 경우, 231+231=462 등의 답이 나온다.
제한 사항
- 식에서 사용할 수 있는 문자는 사칙연산(+ = * /)과 = 기호, 그리고 알파벳 문자 A ~ Z까지(대문자)만 허용된다.
- 연산자 우선순위 규칙은 적용하지 않고 무조건 왼쪽부터 계산하는 것으로 한다.
- 식에는 공백은 포함되지 않는다.
- 한 식에서 사용될 수 있는 알파벳 문자 종류는 최대 10개까지(0 ~ 9까지를 표현해야 하므로) 이다.
- SEND 같은 경우, 앞자리 수인 S가 0이 될 수는 없다.
- 위 조건들을 만족하지 않는 식은 오류로 처리한다.
- 입력 받은 식을 만족하는 답을 못 찾은 경우는 답이 없음으로 처리한다.
자판기를 제어하는 프로그램 작성.
상품 정보 등록(미리 해둠):
- 상품 버튼은 1 ~ 9번까지 있다.
- 각 버튼별로 상품은 미리 등록해 둔다.
- 상품 정보: 상품명, 가격, 갯수
- 버튼에 상품이 등록되지 않을 수도 있다.
구매 프로세스:
- 자판기는 최초에 대기 상태
- 동전 혹은 지폐를 투입한다.
- 투입 가능한 동전 및 지폐 종류 결정 필요
- 돈이 투입 될 때마다:
- 투입한 총 합계금액 표시
- 합계금액으로 구매 가능한 상품이 있는 경우, 버튼 번호와 상품명, 가격을 표시
- 반환 버튼을 누르면
- 투입한 금액을 전부 반환(메세지 출력으로 표현)하고 대기 상태로 돌아감
- 상품 버튼을 누르면
- 구매 가능한 경우에 해당 상품을 출력하고 구매후의 거스름 돈을 출력하고 대기 상태로 돌아감
- 구매 불가능한 경우(금액 부족 혹은 품절)는 에러 메세지 출력