본문으로 건너뛰기

· 약 1분
karais89

book image

기간

2일

목적

리디북스에서 무료로 60일 대여를 해서 대여한 책이다.

리뷰

가볍게 읽기에 좋은 책인 것 같다.

책 자체도 술술 읽히는 느낌이고, 내용 자체도 괜찮았다.

처음으로 소설 책에 대한 리뷰를 써보는데, 사실 어떤식으로 써야 될지 잘 모르겠다.

그냥 출퇴근 길에 가볍게 읽을 만한 소설이다.

평점 및 한줄평

킬림 타임용으로 볼만 했다.

4/5

· 약 2분
karais89

book image

기간

3주

목적

예전에 한번 읽었던 적이 있었는데, 개정판이 새로 나왔다고 하여 이북으로 구매 후 출퇴근 길에 가볍게 읽을 목적으로 구매 하였다.

리뷰

책 자체에 대한 평가가 상당히 좋고, 책의 저자분도 상당히 유명한 분이라 기대하면서 읽었다.

총 4장의 목차로 이루어져 있으며, 다양한 알고리즘에 대해 설명해 준다.

책 자체에 대해서 얻을 수 있는 부분은 얼마 없는 것 같다.

끝에서 다루는 알고리즘의 난이도는 누워서 읽기에는 상당히 어렵지 않나?라는 생각을 했다.

분명히 몇가지 유용한 부분도 있고, 흥미 있는 부분도 존재하긴 한다.

하지만 그렇게 추천은 하지 못하겠다.

평점 및 한줄평

나에게는 별로 였다.

3/5

· 약 2분
karais89

book image

기간

1달 (상당히 오래 걸렸다.)

목적

책 제목 그대로..

리뷰

예전에 읽었을 때, 좋은 기억이 있어서 구입해서 읽게 된 책.

Ebook으로 구매하여, 출 퇴근 길에 읽었다.

436페이지 분량의 책인데 상당히 읽는데 고생을 했다.

중간 중간 삽화들이 있는데, 이게 개그인지 정말로 얘기하는 건지 헷갈리는 것들도 있었다. 사실 그렇게 좋은 평을 줄 수는 없을 것 같다.

나중에 정말 시간날때 곰곰히 생각하면서 읽어야 될 책인것 같다.

생각보다 무거운 책이다.

개인적으로는 부록으로 들어간 국내 개발자들의 이야기가 더 흥미 있었다.

나중에는 한번에 읽어봐야겠다..

평점 및 한줄평

다시 읽어보니, 생각보다 별로..

3/5

· 약 4분
karais89

유니티 IDE 선택에 대한 잡소리 입니다.

윈도우 환경에서는 두말 할 것 없이 visual stduio 쓰시면 됩니다. 모두가 인정하는 최고의 ide 입니다.

맥에서의 유니티 IDE 선택에 대한 이야기 입니다.

사실 초창기에는 어쩔 수 없이 mono IDE를 쓸 수 밖에 없었습니다.

일단 기본적으로 mono의 경우 맥에서는 한글 입력이 되지 않는 현상이 존재하며, 초창기 mono의 경우 화면 분할 또한 가능하지 않았습니다. 이러한 문제들 때문에 서브라임 텍스트를 사용한다던가 윈도우 환경을 가상 머신으로 돌려 비쥬얼 스튜디오를 사용하시는 분들도 계셨습니다.

사실은 제가 가장 추천해주고 싶은 ide는 visual stduio code 입니다. (ide라기 보다는 텍스트 에디터이지만..)

일단 가볍고, 자동 완성 기능 또한 준수하고, 디버깅 기능또한 제공되기 때문에 사실 제가 볼때는 가장 괜찮은 선택일 것 같습니다.

사실 맥에서 나온 visual stduio의 경우 자마린 기반이라. 제가 처음에 생각했던 멋진 모습의 ide가 아니라 실망을 많이 했던 기억이 있습니다.

그이외에 추천하는 툴은 젯브레인사의 Rider입니다.

일단 기본적으로 젯브레인사의 모든 ide는 유료 입니다.

트라이얼 버전이나 학생의 경우는 무료로 사용할 수 있으니 그 기간동안 관련 ide를 사용해 보시고 괜찮으시면 사용해 보는 것도 좋은 선택 인 것 같습니다.

가장 큰 장점은 제가 보기엔 크로스 플랫폼 지원인 것 같습니다.

윈도우와 맥에서 같은 환경에서 같은 ide로 작업하는 것 자체가 큰 메리트로 다가 왔습니다.

그리고 젯브레인사의 제품답게 리팩토링 관련 기능들이 강력한 것 같습니다.

또한 유저의 편의성을 생각하는 ide의 기능들이 눈에 띄었습니다.

예를들어 유니티 자체 함수의 경우 옆에 유니티 아이콘으로 표시해 주는 점.

또한 제일 신기했던 부분은 인보크나 스타트 코루틴에 스트링으로 함수를 호출해주는 부분이 있는데 그 부분 조차 리팩토링을 지원해 줘서 이름을 바꿀 수 있다는 점입니다.

어쨌든 저도 무료 기간동안은 계속해서 사용할 예정이고, 만족하면서 사용 중입니다.

한번 쯤 맥 환경에서 ide를 고민하시는 분들은 사용해 보시는 것을 추천 드립니다.

참조

· 약 11분
karais89

김포프님 C# 코딩 스탠다드

포프님이 올리신 C# 코딩 스탠다드의 번역 글입니다.

번역 자체는 구글 번역에서 이상한 부분은 제가 수정 하였습니다. 번역 자체의 문제가 있을 수 있습니다.

코딩 스탠다드는 코드 몽키 레벨에서는 왜 이렇게 작성했는지에 대한 설명을 할 필요도 없고 그냥 코딩 스탠다드에 주어진 내용 대로 코드를 짜면 된다고 합니다.

하지만 아래 45가지의 코딩 스탠다드에는 분명히 그렇게 해야 되는 이유가 존재 합니다.

꼭 아래의 코딩 스탠다드를 사용하여 코드를 작성하실 필요는 없습니다.

경험에 바탕을 둔 방법

  1. 읽기 좋은 코드가 우선(대부분의 경우 사용 설명서가 항상 문서화되어야 함)
  2. 그렇지 않은 이유가 있는 경우가 아니라면 IDE의 자동 형식 지정 방식을 따르십시오. (VisualStudio의 Ctrl+K+D)
  3. 기존 코드로부터 배우기

참조

이 코딩 스탠다드는 이러한 코딩 표준에 의해 영감을 받는다.

이름 지정 규칙 및 스타일

1. 클래스 및 구조체에 파스칼 케이스1 사용

class SomeClass;    
struct SomeStruct;

2. 지역 변수 이름과 함수 매개 변수에 카멜 케이스2 사용

void SomeMethod(int someParameter)
{
int someNumber;
}

3. 모든 메소드 이름은 파스칼 케이스 사용

public uint GetAge()
{
// function implementation...
}

4. 메소드 이름은 동사 + 명사 사용

public uint GetAge()
{
// function implementation...
}

5. non-public 메서드면 post fix로 "Internal"을 붙인다

Private uint GetAgeInternal()
{
// function implementation...
}

6. 상수는 ALL_CAPS_SEPARATED_BY_UNDERSCORE를 사용한다.

const int SOME_CONSTANT = 1;

7. namespaces는 파스칼 케이스를 사용한다.

namespace System.Graphics

8. boolean 변수 앞에는 b를 붙이고 프로퍼티에는 앞에 is를 붙인다.

bool bFired;    // for local variable
Private bool mbFired; // for private class member variable
Public bool IsFired { get; private set; }

9. 인터페이스 앞에는 I를 붙인다.

interface ISomeInterface 
{

}

10. enum 앞에는 E를 붙인다.

public enum EDirection
{
North,
South
}

11. private 멤버 변수 앞에 m을 붙입니다. 나머지 멤버 변수에는 파스칼 케이스를 사용하십시오.

Public class Employee
{
public int DepartmentID { get; set; }
private int mAge;
}

12. 반환 값이있는 메소드는 반환 된 값을 설명하는 이름을 가져야합니다.

public uint GetAge();

13. 설명적인 변수 이름을 사용하십시오. 예를 들어 루프에 사용되는 사소한 변수가 아니라면 i 또는 e 대신 index이나 employee이 될 수 있습니다.

14. 두개의 문자만 있는 경우 머리 글의 모든 문자를 대문자로 구분합니다.

public int ID { get; private set; }

15. 두개의 문자 이상인 경우 머리 글자로 된 첫 번째 문자 만 대문자로 표시하십시오.

public string HttpAddress { get; private set; }

16. getter setter 함수보다 프로퍼티를 선호해라.

이거 대신에:
public class Employee
{
private string mName;
public string GetName();
public string SetName(string name);
}

이렇게 사용해라:
public class Employee
{
public string Name {get; set;}
}

17. 4 개의 스페이스와 동일하게 탭을 사용해라

18. 로컬 변수가 사용되는 첫 번째 행에 최대한 가깝게 선언하십시오.

19. 새로운 줄에 항상 여는 중괄호 "{" 를 넣으십시오.

20. scope에 단 하나의 줄이 있어도 중괄호를 추가하십시오.

if (bSomething)
{
return;
}

21. 부동 소수점 값에 대한 정밀도 지정은 명시 적으로 double이 필요하지 않는 한 사용하십시오.

float f = 0.5F;

22. switch 문에는 항상 default가 있어야 합니다.

switch (number)
{
case 0:
...
break;
default:
break;
}

23. case 문에 코드가없는 경우를 제외하고는 switch case에 대한 fallthrough 설명을 추가하십시오.

switch (number)
{
 case 0:
   DoSomething();
   //fallthrough
 case 1:
   DoFallthrough();
   break;
 case 2:
 case 3:
   DoNotFallthrough();
break;
 default:
   break;
}

24. 스위치 문에서 default 문이 발생해야되지 않아야 되는 경우에는 항상 Assert(false)를 더해라. assert 구현에서, 이것은 릴리즈 빌드를위한 최적화 힌트를 추가 해라.

switch (type)
{
case 1:
...
break;
Default:
Debug.Fail("unknown type");
break;
}

25. 재귀 함수의 이름은 "Recursive"로 끝내라.

void FibonacciRecursive();

26. 클래스 변수와 메소드의 순서는 다음과 같아야합니다.

  1. public variables
  2. internal variables
  3. protected variables
  4. private variables
  5. public methods
  6. Internal methods
  7. protected methods
  8. private methods

27. 함수 오버로딩은 대부분의 경우 피해야합니다.

이거 대신에:
Anim GetAnim(int index);
Anim GetAnim(string name);

이렇게 사용해라:
Anim GetAnimByIndex(int index);
Anim GetAnimByName(string name);

28. 여러 개의 작은 클래스를 그룹화하는 것이 합리적이지 않으면 각 클래스는 별도의 소스 파일에 있어야합니다.

29. 파일 이름은 대문자와 소문자를 포함한 클래스의 이름과 동일해야합니다.

class Anim {}

Anim.cs

30. 너가 가지고 있는 주장에는 assert를 사용해라. (예, 모든 함수는 Debug.Assert( not null parameters) 를 가져야 한다.)

31. bigflag 열거 형의 이름은 Flags로 끝나야합니다.

public enum EVisibilityFlags
{
}

32. 기본 매개변수보다 오버로딩을 더 선호한다.

33. 기본 매개 변수가 사용되면 null, false 또는 0과 같은 자연스러운 상수로 제한하십시오.

34. 지역 변수 숨김은 허용하지 않는다.

public class SomeClass
{
public int Count {get;set;}
public void Func(int Count)
{
for (int count = 0; count != 10; ++count)
{
// Use Count
}
}
}

35. 항상 System.Collections의 컨테이너보다 System.Collections.Generic의 컨테이너를 사용하십시오. 순수 배열을 사용하는 것도 좋습니다.

36. var 키워드 대신 실제 타입을 사용하는 걸 선호합니다. Enumerator같은 경우에는 var를 사용할 수 있습니다.

37. 싱글톤 패턴이 아닌 static class를 사용해라.

38. async void 보다 async Task를 사용해라. async void는 오직 이벤트 핸들러에서만 사용해라.

39. 경계에서 외부 데이터의 유효성을 검사하고 데이터를 함수에 전달하기 전에 반환하십시오. 즉,이 시점 이후에 모든 데이터가 유효하다고 가정합니다.

40. 따라서 우리 함수 내부에서 예외를 던지지 마십시오. 이것은 경계에서만 처리되어야합니다.

41. public 함수에서는 특히 매개 변수에 null을 허용하지 않는 것이 좋습니다.

42. 만약 매개변수에 null을 사용해야 하는 경우라면, 매개변수 이름의 postfix로 OrNull을 붙이십시오.

43. 어떤 함수, 특히 public 함수에서는 null을 반환하지 않기를 바랍니다. 하지만 예외를 throw 하지 않도록 null을 반환해야 하는 경우가 있습니다.

44. 만약 함수에서 null을 반환해야 된다면, 함수 이름에 Postfix로 OrNull을 붙입니다.

public string GetNameOrNull();

45. 객체 initializer를 사용하지 말자. 대신에 명명 된 매개 변수와 함께 명시적 생성자를 사용합시다. 아래 두가지 예외 상황은 제외 합니다.

a. 오브젝트가 한 곳에서만 작성된 경우. (예를 들어, 1 회의 DTO)
b. 객체가 소유 클래스의 정적 메서드 내에서 만들어 질 때 (: 팩토리 패턴)

  1. 첫 단어를 대문자로 시작하는 표기법. 예) BackgroundColor, TypeName, PowerPoint
  2. 각 단어의 첫문자를 대문자로 표기하고 붙여쓰되, 맨처음 문자는 소문자로 표기함. 예) backgroundColor, typeName, iPhone

· 약 2분
karais89

book image

기간

5일

목적

게임 프로그래밍 패턴

책 이름 그대로 패턴에 대한 공부를 하기 위해 구입

리뷰

먼저 게임 관련된 패턴책이라 무조건 구입을 했다.

이 책에서도 여러가지 패턴에 대한 설명을 한다.

그리고 게임 관련되서 많이 쓰일 법한 패턴들에 대한 설명을 해준다.

출퇴근 중에 읽은 서적이라 자세히 정리하지 못한 점은 아쉽다.

일단 몇가지 접해보지 못한 패턴들에 대해 알게 되었다.

몇가지 패턴들은 이미 알고 있는 패턴들이라 이해하기 쉬웠고, 몇 개의 패턴들에 대해서는 이해하기 좀 어려운 부분도 있었다.

추후에 이 책에 대해 정리 해봐야 될 것 같다.

평점 및 한줄평

GOF 디자인 패턴이나 헤드 퍼스트 디자인 패턴을 읽고 다시 한번 읽어봐야 될 책.

4 / 5

· 약 4분
karais89

book image

패턴과 객체지향적으로 코딩하는 방법에 대한 책

기간

5일

목적

대학교 때 구매했던 서적.

패턴과 객체지향에 대해 관심이 있어 구매 함.

리뷰

책 자체는 쉽게 읽을 수 있는 책이다.

처음에는 객체 지향적 사고 방식으로 생각하는 방법에 대해 설명 해준다.

저자는 2가지 방식을 중요시 한다.

  1. 공통점 묶기
  2. 조금만 알기

이 2가지만 알면 객체지향적 사고와 패턴의 원리를 모두 알 수 있다고 말한다.

아래에 대한 패턴에 대해 설명 해준다.

  • 팩토리 패턴 (객체 생성은 객체 생성 전문가에게)
  • 추상 팩토리 패턴 (관점의 차이가 곧 객체 생성의 차이)
  • 팩토리 메서드 패턴 (필요한 것은 알아서 만들자)
  • 템플릿 메서드 패턴 (순서를 정리하면 시점이 보인다)
  • 빌더 패턴 (복잡한 조립은 조립 전문가에게 맡기자)
  • 싱글톤 패턴 (오직 하나뿐인 그대)
  • 프로토 타입 패턴 (너의 쌍둥이가 필요해)
  • 어댑터 패턴 (수정할 수 없는 너무 안정적인 당신)
  • 옵저버 패턴 (무슨 일 생기면 바로 알려줘)
  • 이터레이터 패턴 (한 가지 탐색법만 기억하라)
  • 컴포지트 패턴 (복합구조도 접근법은 하나)
  • 스테이트 패턴 (난 기분에 따라 행동이 달라져)
  • 스트래티지 패턴 (골라 쓰는 알고리즘)
  • 프록시 패턴 (공유되는 정보와 대리인)
  • 플라이웨이트 패턴 (공유되는 정보와 대리인)
  • 커멘드 패턴 (행동만 따로 떼어보자)
  • 데코레이터 패턴 (꾸미는 방법도 가지가지)

실무에서 사용할 만한 간단한 코드와 설명으로 수필 읽듯이 읽을 수 있는 장점이 있는 책이다.

하지만 자세한 소스 코드 까지는 나오지 않아, 가볍게 읽을 만한 책으로 느껴진다.

이 책을 읽고 이후 디자인 패턴에 대해 자세히 공부하려면, GOF의 디자인 패턴이나 Head First 디자인 패턴 책을 펴서 공부를 하면 좋을 듯 싶다.

평점 및 한줄평

설계 관련 간단히 읽을 수 있어 추천해 주고 싶은 책.

4 / 5

· 약 4분
karais89

문제 요약

안나와 브라이언이 식당에서 주문한 물건들 n 그러나 안나는 알레르기로 인해 먹는 것을 거부합니다. k개의 아이템을

수표가 오면, 그들은 그들이 공유하는 모든 항목의 비용을 나누기로 결정합니다.

그러나 브라이언은 항목을 분리하지 않고 실수로 안나에게 청구했음을 잊어 버렸을 수 있습니다.

당신은 각 아이템의 비용과 브라이언이 계산서의 일부분에 대한 안나에게 청구 한 총 금액을 받습니다.

청구서가 상당히 분할되면 Bon Appetit을 인쇄하십시오. 그렇지 않으면 브라이언이 안나에게 환불해야하는 금액을 인쇄하십시오.

첫번째 인자는 아이템의 개수이고 두번째 인자는 안나가 먹지 못하는 음식의 인덱스 값 이다.

두번째 라인의 첫번째 줄에서 첫번째 인자로 받은 인덱스는 각 음식의 값들이고.

세번째 라인은 브라이언이 안나에게 청구한 금액이다.

Sample Input 0

4 1
3 10 2 9
12

Sample Output 0

5

안나는 c[1] = 10을 먹지 못한다.

총 비용은 3+2+9=14이다. 그녀의 비용을 사람 수로 나누면 7이다.

브라이언은 그녀에게 12달러를 청구하였고, 그녀는 7달러면 내면 된다.

그러므로 우리는 안나에게 과다 청구된 금액을 출력하면 된다 12-7=5이다.

Sample Input 1

4 1
3 10 2 9
7

Sample Output 1

Bon Appetit

정확하게 안나가 청구될 금액과 일치 하므로 Bon Appetit을 출력한다.

내 소스

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Solution {

static int bonAppetit(int n, int k, int b, int[] ar) {
// Complete this function
int sum = 0;
for (int i = 0; i < n; i++)
{
if (k == i)
{
continue;
}

sum += ar[i];
}
int charge = sum / 2;
return b - charge;
}

static void Main(String[] args) {
string[] tokens_n = Console.ReadLine().Split(' ');
int n = Convert.ToInt32(tokens_n[0]);
int k = Convert.ToInt32(tokens_n[1]);
string[] ar_temp = Console.ReadLine().Split(' ');
int[] ar = Array.ConvertAll(ar_temp,Int32.Parse);
int b = Convert.ToInt32(Console.ReadLine());
int result = bonAppetit(n, k, b, ar);
if (result == 0)
{
Console.WriteLine("Bon Appetit");
}
else
{
Console.WriteLine(result);
}
}
}

AllisonP의 답안

linq를 사용하여 풀었다.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class Solution {
static void Main(String[] args) {
int K = Console.ReadLine().Split(' ').Select(Int32.Parse).ToArray()[1];

List<int> ItemList = Console.ReadLine().Split(' ').Select(Int32.Parse).ToList();
long CorrectTotal = (ItemList.Sum(m => m) - ItemList[K]) / 2;
long AmountCharged = Convert.ToUInt32(Console.ReadLine());

if (CorrectTotal == AmountCharged)
Console.WriteLine("Bon Appetit");
else {
Console.WriteLine(AmountCharged - CorrectTotal);
}
}
}

느낀점

알고리즘 문제들을 풀다보면 c#의 경우 linq를 사용하면 쉽게 풀 수 있는 것들이 많다.

사실 linq의 사용을 의도적으로 피한 경향이 있었다.1

하지만 linq관련 문제는 여러가지 방법으로 우회 방법이 존재하며, 이제는 슬슬 적용을 할 단계인것 같습니다.


  1. 유니티의 경우 mono 2.x 버전의 버그로 정상 작동 불가.

· 약 5분
karais89

문제 요약

마린은 타임머신을 발명했으며 시간 여행을 통해 1700~2700년 사이의 프로그래머의날1 (일년중 256th)에 방문하려고 한다.

1700년에서 1917년에는 러시아에서의 공식 달력은 줄리안 달력이고, 1919년에는 그레고릭 달력 시스템이었다.

1918년에 줄리안 달력에서 그레고릭 달력으로 변경이 일어났고, 1월 31일 이후 다음날 2월 14일 변경이 됐다.

이 말은 러시아에서 1918년에는 2월 14일은 1월 32일 이었다. (중간에 14일은 간의 기간은 달력 변경으로 삭제)

두 가지 달력 시스템에서 2 월은 가변 일수가있는 유일한 달입니다.

윤년 기간에는 29 일, 그 외 모든 연도에는 28 일이 있습니다

줄리아 달력에서 윤년은 4로 나눌 수 있습니다. 그레고리력에서 윤년은 다음 중 하나입니다.

  • 400으로 나눌수 있다.
  • 4로 나누어지지만 100으로는 나누어지지 않는다.

1년을 감안할 때 그 해의 공식 러시아 달력에 따라 해당 연도의 날짜를 찾으십시오.

그런 다음 dd.mm.yyyy 형식으로 인쇄하십시오. 여기서 dd는 두 자리 날이고 mm은 두 자리 월이며 yyyy는 y입니다.

Sample Input 0

2017

Sample Output 0

13.09.2017

2017년은 1월은 31일, 2월은 28일, 3월은 31일, 4월은 30일 ,5월은 31일, 6월은 30일, 7월은 31일, 8월은 31일이다. 31+28+31+30+31+30+31+30+31+31 = 243이다. 프로그래머의 날은 256번째 날이므로. 256-243=13이다. 그러므로 9월 13일이 프로그래머의 날이다.

Sample Input 0

2016

Sample Output 0

12.09.2017

위와 같은 방식이지만 2016년은 2월이 29일인 윤년이다. 그러므로 31+29+31+30+31+30+31+30+31+31 = 244이고 256-244=12이다. 그러므로 9월 12일이 프로그래머의 날이다.

내 소스

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Solution {

static int[] GetDays(int year) {
int[] days = new int[12] {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};

bool isJulianCalendar = year <= 1917;
bool isGregorianCalendar = year >= 1919;

if (isJulianCalendar)
{
if (year % 4 == 0)
{
days[1] = 29;
}
}
else if (isGregorianCalendar)
{
if ((year % 4 == 0 && year % 100 != 0) ||
(year % 400 == 0))
{
days[1] = 29;
}
}
else
{
// julianCalendar & isGregorianCalendar
// January 31 after -> February 14
days[1] = 28 - 14 + 1;
}

return days;
}

static string solve(int year){
// Complete this function
int[] days = GetDays(year);
int programmerDay = 256;
int y = year;
int m = 0;
int d = 0;
for (int i = 0; i < days.Length; i++)
{
programmerDay -= days[i];
if (programmerDay < 0)
{
m = i + 1;
d = programmerDay + days[i];
break;
}
}

return String.Format("{0:00}.{1:00}.{2:0000}", d, m, y);
}

static void Main(String[] args) {
int year = Convert.ToInt32(Console.ReadLine());
string result = solve(year);
Console.WriteLine(result);
}
}

mfv의 답안

#pragma GCC diagnostic ignored "-Wunused-result"

#include <cstdio>
#include <cassert>

int main() {
int y;
scanf("%d", &y);
int daysInFebruary;
if (y == 1918) {
daysInFebruary = 28 - 13;
} else if (y < 1918) {
if (y % 4 == 0) {
daysInFebruary = 29;
} else {
daysInFebruary = 28;
}
} else {
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
daysInFebruary = 29;
} else {
daysInFebruary = 28;
}
}
int day = 256 - 31 - daysInFebruary - 31 - 30 - 31 - 30 - 31 - 31;
assert(1 <= day && day <= 30);
printf("%02d.%02d.%04d", day, 9, y);
return 0;
}

느낀점

문제 자체가 더 어려운 느낌.

문제를 풀려면 그레고릭 달력 줄리안 달력 개념과 윤년 계산 법 등을 알고 있어야 한다.

문제를 풀면서 프로그래머의 날이 있다는 사실 도 알았다..

문제 자체는 출제자와 거의 똑같은 방식으로 푼 것 같다.


  1. 0x100일째의 날을 기념한다고 하는 날. 10진 수로 변경하면 매 해의 256번째 날.

· 약 3분
karais89

문제 요약

n 마리의 새 무리가 대륙을 날고 있습니다.

각 새는 유형이 있으며, 다른 유형은 ID 번호 1,2,3,4,5로 지정됩니다.

새 무리에서 가장 일반적으로 많이 보유하고 있는 무리의 유형을 출력하고, 만약 유형의 개수가 같으면, 유형의 개수의 숫자가 작은 것을 출력하세요.

Sample Input

6
1 4 4 4 5 3

Sample Output 0

4

설명

  • Type 1: 1 bird
  • Type 2: 0 birds
  • Type 3: 1 bird
  • Type 4: 3 birds
  • Type 5: 1 bird

가장 높은 빈도에서 발생하는 유형 번호는 4 유형이므로 응답으로 4를 인쇄합니다.

내 소스

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Solution {

static int migratoryBirds(int n, int[] ar) {
// Complete this function
int[] typeCount = new int[5];
for (int i = 0; i < n; i++)
{
typeCount[ar[i]-1]++;
}

int maxIndex = 0;
int max = typeCount[0];
for (int i = 1; i < typeCount.Length; i++)
{
if (typeCount[i] > max)
{
maxIndex = i;
max = typeCount[i];
}
}
return maxIndex+1;
}

static void Main(String[] args) {
int n = Convert.ToInt32(Console.ReadLine());
string[] ar_temp = Console.ReadLine().Split(' ');
int[] ar = Array.ConvertAll(ar_temp,Int32.Parse);
int result = migratoryBirds(n, ar);
Console.WriteLine(result);
}
}

StefanK의 답안

import java.util.*;

public class Solution {

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] types = new int[n];
for(int arr_i=0; arr_i < n; arr_i++){
types[arr_i] = in.nextInt();
}
int[] frequencies = new int[6]; //A
for (int i = 0; i < types.length; i++) { //B
frequencies[types[i]] += 1; //C
}
int mostCommon = 0;
for (int i = 1; i < frequencies.length; i++) { //D
if (frequencies[mostCommon] < frequencies[i]) {
mostCommon = i; //E
}
}
System.out.println(mostCommon);
}
}

느낀점

배열을 생성하고 그 배열에 타입을 저장하면 끝나는 문제

내가 푼 방식에서 굳이 max 값을 저장할 필요가 없다는걸 봤다.

어차피 maxIndex 값을 가지고 있기 때문에 그 값으로 비교를 하면 된다.