2021 SW개발 신입 LINER 공개채용 [단계별 코딩테스트]
Updated:
Java
2021 SW개발 신입 LINER 공개채용 [단계별 코딩테스트]
이 포스팅은, 2021-03-20 [라인플러스] 코딩 테스트 두번째 시험 문항 별 코드이다.
개인적인 코드이며, 기본 예제는 통과하였지만 정답임을 보장하지는 않는다.
CLI-VALIDATION 1
class Solution {
public boolean[] solution(String program, String[] flag_rules, String[] commands) {
boolean[] answer = new boolean[commands.length];
StringTokenizer stk;
Map<String, String> rules = new HashMap<>();
// 각각 명령과 그에 해당하는 argument의 타입을 저장한다.
for(int i = 0; i < flag_rules.length; i++) {
stk = new StringTokenizer(flag_rules[i]);
rules.put(stk.nextToken(), stk.nextToken());
}
next: for(int i = 0; i < commands.length; i++) {
stk = new StringTokenizer(commands[i]);
// 프로그램 이름이 같을 경우
if(program.equals(stk.nextToken())) {
while(stk.hasMoreTokens()) {
String flag = stk.nextToken();
String flag_argu;
// 대응하는 flag가 있을 시
if(rules.containsKey(flag)) {
// argument 타입
String type = rules.get(flag);
switch(type) {
case "STRING":
flag_argu = stk.nextToken();
for(int j = 0; j < flag_argu.length(); j++) {
char curC = flag_argu.charAt(j);
// 대문자일 경우
if(41 <= curC && curC <= 90) {
continue;
}
// 소문자일 경우
if(97 <= curC && curC <= 122) {
continue;
}
// 그 외 다른 문자일 경우
answer[i] = false;
continue next;
}
break;
case "NUMBER":
flag_argu = stk.nextToken();
for(int j = 0; j < flag_argu.length(); j++) {
// 숫자가 아닐 경우
if(Character.isDigit(flag_argu.charAt(j)) == false) {
answer[i] = false;
continue next;
}
}
break;
case "NULL":
// null은 다음으로 받는 인자가 없다.
// 만약 인자를 받으면 flag 판별에서 걸러진다.
break;
}
}
else {
answer[i] = false;
continue next;
}
}
}
// 다르면 명령이 수행 될 수 없으므로 false
else {
answer[i] = false;
continue next;
}
// 모든 검사를 통과 했으면 true!
answer[i] = true;
}
return answer;
}
}
CLI-VALIDATION 2
class Solution {
public boolean[] solution(String program, String[] flag_rules, String[] commands) {
boolean[] answer = new boolean[commands.length];
StringTokenizer stk;
Map<String, String> rules = new HashMap<>();
// 각각 명령과 그에 해당하는 argument의 타입을 저장한다.
for(int i = 0; i < flag_rules.length; i++) {
stk = new StringTokenizer(flag_rules[i]);
rules.put(stk.nextToken(), stk.nextToken());
}
boolean is_Alread_Has_Flag = false;
String flag = null;
next: for(int i = 0; i < commands.length; i++) {
stk = new StringTokenizer(commands[i]);
// 프로그램 이름이 같을 경우
if(program.equals(stk.nextToken())) {
while(stk.hasMoreTokens()) {
// NUMBERS와 STRINGS으로 인해 flag를 미리 받았을 시
if(is_Alread_Has_Flag)
is_Alread_Has_Flag = false;
else
flag = stk.nextToken();
String flag_argu;
// 대응하는 flag가 있을 시
if(rules.containsKey(flag)) {
// argument 타입
String type = rules.get(flag);
switch(type) {
case "STRING":
flag_argu = stk.nextToken();
for(int j = 0; j < flag_argu.length(); j++) {
char curC = flag_argu.charAt(j);
// 대문자일 경우
if(41 <= curC && curC <= 90) {
continue;
}
// 소문자일 경우
if(97 <= curC && curC <= 122) {
continue;
}
// 그 외 다른 문자일 경우
answer[i] = false;
continue next;
}
break;
case "NUMBER":
flag_argu = stk.nextToken();
for(int j = 0; j < flag_argu.length(); j++) {
// 숫자가 아닐 경우
if(Character.isDigit(flag_argu.charAt(j)) == false) {
answer[i] = false;
continue next;
}
}
break;
case "NULL":
// null은 다음으로 받는 인자가 없다.
// 만약 인자를 받으면 flag 판별에서 걸러진다.
break;
case "NUMBERS":
// 여러개의 인수를 받는다.
while(true) {
flag_argu = stk.nextToken();
// 다음 문자열이 flag일 시
if(flag_argu.charAt(0) == '-') {
flag = flag_argu;
is_Alread_Has_Flag = true;
break;
}
// 숫자인지 판별
for(int j = 0; j < flag_argu.length(); j++) {
if(Character.isDigit(flag_argu.charAt(j)) == false) {
answer[i] = false;
continue next;
}
}
// 더 이상 argument가 없을 시
if(!stk.hasMoreTokens())
break;
}
break;
case "STRINGS":
// 여러개의 인수를 받는다.
while(true) {
flag_argu = stk.nextToken();
// 다음 문자열이 flag일 시
if(flag_argu.charAt(0) == '-') {
flag = flag_argu;
is_Alread_Has_Flag = true;
break;
}
for(int j = 0; j < flag_argu.length(); j++) {
char curC = flag_argu.charAt(j);
// 대문자일 경우
if(41 <= curC && curC <= 90) {
continue;
}
// 소문자일 경우
if(97 <= curC && curC <= 122) {
continue;
}
// 그 외 다른 문자일 경우
answer[i] = false;
continue next;
}
// 더 이상 argument가 없을 시
if(!stk.hasMoreTokens())
break;
}
break;
}
}
else {
answer[i] = false;
continue next;
}
}
}
// 다르면 명령이 수행 될 수 없으므로 false
else {
answer[i] = false;
continue next;
}
// 모든 검사를 통과 했으면 true!
answer[i] = true;
}
return answer;
}
}
CLI-VALIDATION 3
// flag의 방문 여부를 확인
static boolean[] isVisted;
static public boolean[] solution(String program, String[] flag_rules, String[] commands) {
boolean[] answer = new boolean[commands.length];
StringTokenizer stk;
// flag_rules을 저장하는 자료구조
Map<String, String> rules = new HashMap<>();
// 각각 명령과 그에 해당하는 argument의 타입을 저장한다.
for(int i = 0; i < flag_rules.length; i++) {
stk = new StringTokenizer(flag_rules[i]);
String flag = stk.nextToken();
String argu = stk.nextToken();
// Alias 처리
if(argu.equals("ALIAS"))
rules.put(flag,stk.nextToken());
else
rules.put(flag, argu);
}
boolean is_Alread_Has_Flag = false;
String flag = null;
next: for(int i = 0; i < commands.length; i++) {
stk = new StringTokenizer(commands[i]);
isVisted = new boolean[5]; // 방문 여부 초기화
// 프로그램 이름이 같을 경우
if(program.equals(stk.nextToken())) {
while(stk.hasMoreTokens()) {
// NUMBERS와 STRINGS으로 인해 flag를 미리 받았을 시
if(is_Alread_Has_Flag)
is_Alread_Has_Flag = false;
else
flag = stk.nextToken();
String flag_argu;
// 대응하는 flag가 있을 시
if(rules.containsKey(flag)) {
// argument 타입
String type = rules.get(flag);
switch(type) {
case "STRING":
if(ChkVisited(0)) { // 한번 방문한 flag 일시
answer[i] = false;
continue next;
}
flag_argu = stk.nextToken();
for(int j = 0; j < flag_argu.length(); j++) {
char curC = flag_argu.charAt(j);
// 대문자일 경우
if(41 <= curC && curC <= 90) {
continue;
}
// 소문자일 경우
if(97 <= curC && curC <= 122) {
continue;
}
// 그 외 다른 문자일 경우
answer[i] = false;
continue next;
}
break;
case "NUMBER":
if(ChkVisited(1)) {
answer[i] = false;
continue next;
}
flag_argu = stk.nextToken();
for(int j = 0; j < flag_argu.length(); j++) {
// 숫자가 아닐 경우
if(Character.isDigit(flag_argu.charAt(j)) == false) {
answer[i] = false;
continue next;
}
}
break;
case "NULL":
if(ChkVisited(2)) {
answer[i] = false;
continue next;
}
// null은 다음으로 받는 인자가 없다.
// 만약 인자를 받으면 flag 판별에서 걸러진다.
break;
case "NUMBERS":
if(ChkVisited(3)) {
answer[i] = false;
continue next;
}
// 여러개의 인수를 받는다.
while(true) {
flag_argu = stk.nextToken();
// 다음 문자열이 flag일 시
if(flag_argu.charAt(0) == '-') {
flag = flag_argu;
is_Alread_Has_Flag = true;
break;
}
// 숫자인지 판별
for(int j = 0; j < flag_argu.length(); j++) {
if(Character.isDigit(flag_argu.charAt(j)) == false) {
answer[i] = false;
continue next;
}
}
// 더 이상 argument가 없을 시
if(!stk.hasMoreTokens())
break;
}
break;
case "STRINGS":
if(ChkVisited(4)) {
answer[i] = false;
continue next;
}
// 여러개의 인수를 받는다.
while(true) {
flag_argu = stk.nextToken();
// 다음 문자열이 flag일 시
if(flag_argu.charAt(0) == '-') {
flag = flag_argu;
is_Alread_Has_Flag = true;
break;
}
for(int j = 0; j < flag_argu.length(); j++) {
char curC = flag_argu.charAt(j);
// 대문자일 경우
if(41 <= curC && curC <= 90) {
continue;
}
// 소문자일 경우
if(97 <= curC && curC <= 122) {
continue;
}
// 그 외 다른 문자일 경우
answer[i] = false;
continue next;
}
// 더 이상 argument가 없을 시
if(!stk.hasMoreTokens())
break;
}
break;
// Alias를 통해 동일한 flag 호출
default:
flag = rules.get(flag);
is_Alread_Has_Flag = true;
break;
}
}
else {
answer[i] = false;
continue next;
}
}
}
// 다르면 명령이 수행 될 수 없으므로 false
else {
answer[i] = false;
continue next;
}
// 모든 검사를 통과 했으면 true!
answer[i] = true;
}
return answer;
}
// 한번 방문한 flag인지 확인하는 메서드
static boolean ChkVisited(int index) {
if(!isVisted[index]) {
isVisted[index] = true;
return false;
}
else {
return true;
}
}