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;
	}
}