반응형

프로그래머스 문제 링크 

https://programmers.co.kr/learn/courses/30/lessons/42576

 

내 스스로 푼 코드

import java.util.HashMap;
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<Integer, String> mapParticipant=new HashMap<>();
		for(int i=0; i<participant.length;i++) {
			mapParticipant.put(i, participant[i]);
		}
		
		for(int i=0; i<mapParticipant.size();i++) {
			for(int j=0; j<completion.length;j++) {
				if(mapParticipant.get(i).equals(completion[j])) {
					mapParticipant.put(i, "");
					completion[j]="";
				}
			}
		}

		for(int i=0; i<mapParticipant.size() ;i++) {
			answer+=mapParticipant.get(i);
		}
        
        return answer;
    }
}

 

굳이 mapParticipant에 null값을 넣어줘야하는게 마음에 안들었다.

 

*다른사람의 코드

import java.util.Arrays;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        String temp = "";

        Arrays.sort(participant);	//알파벳 순 정렬
        Arrays.sort(completion);

        int i = 0;

        while(i < completion.length){
            if(!completion[i].equals(participant[i])){	//도중에 다른글자발견한다면
                temp = participant[i];
                break;
            }else{
                i++;
            }
        }

        if(!temp.equals("")){	//도중에 다른글자 발견 했을때
            answer = temp;
        }else{					//끝내 다른글자 발견 못했을때
            answer = participant[participant.length-1];
        }

        return answer;
    }
}

1. Arrays.sort 를 활용하여 우선 알파벳순으로 정렬 

2. completion 만큼 돌되 중간에 다른글자 발견하면 그 글자를 temp 에 저장

3. temp가 null이 아니라면 그것을 return , null이면 participant 의 마지막 인덱스를 return .

 

Arrays.sort를처음 알았다.

먼저 정렬부터 해 주고 다른걸 발견했을때 리턴, 아니면 마지막인덱스 값을 리턴하는 방식이다.

 

 

*다른사람의 코드

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        for (String player : completion) hm.put(player, hm.get(player) - 1);

        for (String key : hm.keySet()) {
            if (hm.get(key) != 0){
                answer = key;
            }
        }
        return answer;
    }
}

프로그래머스 정답의 가장 상위에 있는 코드이다.

 

1. map에 key : player, value : 1  이런 형식으로 넣을건데 만약 같은 이름일 경우엔 1이 아닌 다른 숫자로 해줄것인데

  map에 참가자 명단을 하나씩 넣되, value는 map.get ( player ) 를 해준다.

  왜냐하면 동명이인이 있을 수 있기 때문에 palyer를 key로 썼을때 value가 없으면 0으로 셋팅, 0+1로  value는 1

  반대로 player 를 key 로 썼을때 value가 기존에 셋팅된 1로 있을 경우 1+1 =2로 value 는 2로 셋팅된다.(동명이인)

 

2. 같은 key 값으로 put 해주면 그 value는 갱신되는 HashMap의 특성을 이용하여 completion 이름들을 put 해준다.

   value는 기존 hm.get (player)의 value - 1 을 해준다.

   이렇게 되면 동명이인을 제외한 모든 player 들의 value는 0이 된다.

 

사실 동명이인이 있을 수 있다는 조건이 없으면

foreach문으로 participant를 돌릴때 key:player, value : hm.getOrDefault 를 안해주고 value : 1 로 적어넣어도된다.

그러면 모든참가자의 value는 1이 되고  completion의 이름들과 부합하였을때 0이 되며

부합하지않은 사람만 1로 남아있기 때문이다. 

 

 

문제의 특성상 key value 의 두개 중에 이름만 보면되므로 리스트로 해도될텐데 왜 해시맵으로 하라고하는걸까

key를 이름들로 구성하고 value는 어떻게 활용해야할지 잘 몰랐었는데 동명이인을 가리기위한 용도로 활용하는 것을 보고 갈길이 멀다고 생각했다.

728x90
반응형

보통 스트링 문자열을 비교할때 .equals를 쓰는데 

 

.equalsIgnoreCase();

요런 녀석도 있다.

얜 대소문자를 구분하지않는다.

String str1 = "app";
String str2 = "APP";

"app".equalsIgnoreCase(str2) //같음
"APP".equalsIgnoreCase(str1) //같음

"app".equals(str2); //다름
"APP".equals(str1); //다름

 

 

728x90
반응형

timer보다 강력한 시간제어가 가능한것이 Scheduler 라이브러리이다.

일정시간 후 주기적으로 작업을 실행시켜주며 

스프링에선 @Scheduled 로 호출하고 자바에서는 ScheduledExecutorService로 사용할 수 있다.

 

728x90

'과거 게시글' 카테고리의 다른 글

[프로그래머스] 해시 _ 완주하지못한 선수  (0) 2019.05.10
String 문자열 비교 (.equalsIgnoreCase())  (0) 2019.04.12
Mustache  (0) 2019.04.08
Native App? Mobile app? Hybrid App?  (0) 2019.04.08
RequireJS  (0) 2019.04.08
반응형

mustache란 

{{ }} 의 형태로 이루어진 탬플릿엔진이다.

{{의 모양이 수염처럼 생겼다고해서 (진짜 극 핵 노잼) 붙여진 이름인데 다양한 언어들을 지원한다.(c, java, ruby...)

 

잠깐, Template Engin 이란

흔히 알고있는 jstl 도 여기에 속하는데, 프로그램 로직과 프리젠테이션의 계층을 분리하기위한 수단이라고 한다. 

쉬운 말로 스프링을 한다 치면 컨트롤러에서 model.setAttribute해서 view로 dto를 보낼때 view에서 받아야하는데, 페이지구성은 똑같고 값만 다른데 굳이 뷰를 또 만들어야해?! 라는 의문점을 해소시켜주는게 템플릿엔진.

템플릿엔진으로 html을 이용해서 다 짜놓고 해당 파일을 첨부만 해주고 파라메터 변수명을 넣어주기만 하면 되는것!

 

템플릿엔진중에서 mustache는 logic-less를 지양하는데, 예를들면 jstl은 <c:Foreach item.. 등의 문법을 사용하여 로직을 짜지만 mustache는 뷰는 뷰의 역할에만 충실하기를 원한다.

 

mustache 예제 (공식문서 발췌)

//Given the following hash:
{
  "name": "Chris",
  "value": 10000,
  "taxed_value": 10000 - (10000 * 0.4),
  "in_ca": true
}

//A typical Mustache template:
Hello {{name}}
You have just won {{value}} dollars!
{{#in_ca}}
Well, {{taxed_value}} dollars, after taxes.
{{/in_ca}}

//will produce the following:
Hello Chris
You have just won 10000 dollars!
Well, 6000.0 dollars, after taxes.
{{!이건 주석 표시지롱}}

이런식으로, jstl과 비슷한 사용법이다.

{{! 는 주석표시이다.

 

존재하지 않는 변수명을 썼을때와 {{{ 세개 썼을때

//Template:
* {{name}}
* {{age}}
* {{company}}
* {{{company}}}

//Hash:
{
  "name": "Chris",
  "company": "<b>GitHub</b>"
}

//Output:
* Chris
*
* &lt;b&gt;GitHub&lt;/b&gt;
* <b>GitHub</b>

변수명이 없으면 아무런 값도 출력되지 않는다.모든 변수는 기본적으로 html로 이스케이프 되는데 {{{, {{&를 사용하여 이스케이프 처리를 막을 수 있다. 

 

리스트

//Template:
{{#repo}}
  <b>{{name}}</b>
{{/repo}}

//Hash:
{
  "repo": [
    { "name": "resque" },
    { "name": "hub" },
    { "name": "rip" }
  ]
}

//Output:
<b>resque</b>
<b>hub</b>
<b>rip</b>

{{#변수명}} 으로 시작하고 {{/변수명}} 으로 끝나는 공간을 섹션이라고 하는데 조건문이나 반복문 대신 사용되며

변수가 배열일 경우 반복문으로 사용되고 그렇지않으면 조건문으로 사용된다.

조건문 if 의 결과가 false 혹은 0 혹은 null 일 경우 거짓이므로 섹션의 내용이 출력되지 않는다. 

 

섹션내의 다른루트

{
  "person" : {"name" : "Judy"},
  "drink" : {"name" : "sprite"}
}

{{#color}}
  {{name}}의 음료수는 {{company.name}}입니다.
{{/color}}

//output
Judy의 음료수는 sprite 입니다.

{{# }} 섹션의 첫시작에 변수명 A를 넣었지만 다른변수의 값을 넣고 싶을 때에는 변수명B.변수명 으로 접근가능하다.

 

참,거짓값 or 빈 리스트 Empty List

//Hash:
{
  "person": false
}

//Template:
Shown.
{{#person}}
  Never shown!
{{/person}}

//Output:
Shown.

false이면 {{#와 {{/사이에 아무것도 나타나지 않는다.

만약 아무것도 없었을때 특정 동작을 하고싶다면 반전섹션을 이용하면 된다.

 

반전섹션

//Template:
Shown.
{{#person}}
  {{name}}
{{/person}}
{{^person}}
  Nothing
{{/person}}

//Hash:
{
  "person": []
}

//Output:
Nothing.

name이라는 가상의 변수를 줘 보았다. 만약 안에 아무것도없으면 {{^ 섹션의 값이 나온다.

 

부분템플릿

//파일 1 base.mustache
<h2>Names</h2>
{{#names}}
  {{> user}}
{{/names}}

//파일2 user.mustache
<strong>{{name}}</strong>


//컴퓨터가 인식하는 것
<h2>Names</h2>
{{#names}}
  <strong>{{name}}</strong>
{{/names}}

qㅇ부분템플릿은 외부파일을 템플릿의 일부로 불러올 수 있다.
{{>파일이름}} 으로 호출할수있다.

728x90

'과거 게시글' 카테고리의 다른 글

String 문자열 비교 (.equalsIgnoreCase())  (0) 2019.04.12
Scheduler 라이브러리  (0) 2019.04.11
Native App? Mobile app? Hybrid App?  (0) 2019.04.08
RequireJS  (0) 2019.04.08
티스토리 시작!!!  (0) 2019.04.07

+ Recent posts