우리가 잘 알고 있는 CSS기술을 사용하는 것은 쉽고 간단하지만 새로운 문제에 맞닥드리면 해결하기 어려워집니다.

웹은 항상 성장하고 있고, 새로운 해결법 역시 계속 성장하고 있습니다. 그러므로, 웹 디자이너와 프론트 엔드 개발자로서 우리의 노하우를 활용할 수 밖에 없다는 것을 잘 알고 있습니다.

우리의 특별한 방법을 알면서, 단 한 번도 사용하지 않더라도 언젠가 필요한 때가 오면 정확한 방법을 실무에 적용할 수 있다는 뜻이기도 합니다.

오늘, 저는 이전엔 알지 못했던 몇 가지의 CSS 방법을 알려드리려고 합니다. 몇몇 수치 단위들은 픽셀이나 em과 비슷하지만 당신은 아마 단 한 번도 들어본 적 없을겁니다. 시작해볼까요.

어쩌면 당신에게 조금 익숙할 수 있는 단위로 시작해보죠. em은 현재의 font-size를 정의합니다. 일례로, body 태그에 em값을 이용해 폰트 사이즈를 지정하면 모든 자식 요소들은 body의 폰트 사이즈에 영향을 받습니다.

여기, div에 font-size를 1.2em으로 지정했습니다. 이 예제에서는 14px을 기준으로 1.2배의 폰트 사이즈로 표현이 됩니다. 결과적으로 16.8px의 크기가 됩니다.

그런데 여기 em으로 정의한 폰트 사이즈를 각각의 자식에 선언하면 어떤 일이 생길까요? 같은 CSS를 적용한 동일한 코드를 추가해보았습니다. 각각의 div는 각 부모의 폰트 사이즈를 상속받아 점점 커지게 됩니다.

이것은 어떤 경우엔 바람직하겠지만 대부분의 경우, 단순하게 단일 사이즈로 표현하기도 하지요. 이런 경우 바로 rem 단위를 사용하면 됩니다. rem의 "r"은 바로 "root(최상위)"를 뜻합니다. 최상위 태그(요소)에 지정한 것을 기준으로 삼으며, 보통 최상위 태그는 html태그입니다.

이전 예제에서 만든 복잡한 단계의 세 div는 모두 16.8px의 폰트 사이즈로 표현되었습니다.

rem은 폰트에서만 사용하진 않습니다. 예를 들어, 그리드 시스템이나 rem을 이용한 기본 폰트 사이즈 기반으로 만든 UI 스타일, 그리고 em을 이용해 특정 위치에 특별한 사이즈를 지정할 수도 있습니다. 보다 정확한 폰트 사이즈나 크기 조정을 가능하게 해줄 겁니다.

개념적으로 보면, 이 아이디어는 여러분의 콘텐츠 사이즈를 조절 할 수 있는 인터페이스 전략과 유사합니다. 그러나 모든 경우에 반드시 이런 방법을 따를 필요는 없습니다.

rem (root em) 단위의 호환성은 caniuse.com에서 확인할 수 있습니다.

반응형 웹디자인 기술은 퍼센트 값에 상당히 의존하고 있습니다. 하지만 CSS의 퍼센트 값이 모든 문제를 해결할 좋은 방법은 아니지요. CSS의 너비 값은 가장 가까운 부모 요소에 상대적인 영향을 받습니다. 만약 너비값과 높이값을 부모 요소의 너비값의 뷰포트에 맞게 사용할 수 있다면 어떨까요? 바로 vh와 vw 단위가 그런 의도에 맞는 단위라는 사실.

vh 요소는 높이값의 100분의 1의 단위입니다. 예를 들어 브라우저 높이값이 900px일때 1vh는 9px이라는 뜻이 되지요. 그와 유사하게 뷰포트의 너비값이 750px이면1vw는 7.5px이 됩니다.

이 규칙에는 무궁무진한 사용방법이 있습니다. 예를 들면, 최대 높이값이나 그의 유사한 높이값의 슬라이드를 제작할때 아주 간단한 CSS만 입력하면 됩니다.

스크린의 너비값에 꽉 차는 헤드라인을 만든다고 상상해보세요. vw로 폰트 사이즈를 지정하면 쉽게 달성할 수 있습니다. 저 사이즈는 브라우저의 너비에 맞춰 변할 것입니다.

뷰포트 vw, vh 단위의 호환성은 caniuse.com에서 확인할 수 있습니다.

vh와 vw이 늘 뷰포트의 너비값과 높이값에 상대적인 영향을 받는다면 vminvmax는 너비값과 높이값에따라 최대최소값을 지정할 수 있습니다. 예를 들면 브라우저의 크기가 1100px 너비, 그리고 700px 높이일때 1vmin은 7px이 되고 1vmax는 11px이 됩니다. 너비값이 다시 800px이 되고 높이값이 1080px이 되면 vmin은 8px이 되고 vmax는 10.8px이 됩니다.

어때요, 이 값들을 사용할 수 있나요?

언제나 스크린에 보여지는 요소를 만든다고 상상해보세요. 높이값과 너비값을 vmin을 사용해 100으로 지정합니다. 예를 들어 터치화면 양 변에 가득차는 정사각형 요소를 만들때는 이렇게 정의하면 됩니다.

만약 커버처럼 뷰포트 화면에 보여야 하는(모든 네 변이 스크린에 꽉 차 있는) 경우에는 같은 값을 vmax로 적용하면 됩니다.

알려드린 이 규칙들을 잘 조합해 활용하면 뷰포트에 맞는 매우 유연한 방식으로 사이즈 조절을 가능하게 할 수 있습니다.

뷰포트 단위: vmin, vmax의 호환성은 caniuse.com에서 확인할 수 있습니다.

ex와 ch 단위는 현태 폰트와 폰트 사이즈에 의존한다는 점에서 em 그리고 rem과 비슷합니다. em과 rem과 다른 점은 이 두 단위가 font-family에 의존한다면 다른 두 단위는 폰트의 특정 수치에 기반한다는 점입니다.

ch 단위, 또는 글꼴 단위는 제로 문자인 0의 너비값의 "고급 척도"로 정의됩니다. 흥미로운 의견은 에릭 마이어의 블로그에서 확인할 수 있습니다. 그러나 기본 컨셉은 monospace 폰트의 N 의 너비값을 부여 받았다는 것이며, width: 40ch;는 40개의 문자열을 포함하고 있다는 뜻입니다. 이 특정 규칙은 점자 레이아웃에 기반하고 있지만, 이 기술의 가능성은 간단한 어플리케이션 그 이상으로 확장할 수 있습니다.

ex 단위의 정의는 "현재 폰트의 x-높이값 또는 em의 절반 값"이라고 할 수 있습니다.x-높이값은 소문자 x의 높이값이기도 합니다. 폰트의 중간 지점을 알아내기 위해 자주 사용하는 방법입니다.

x-높이값; 소문자 x의 높이값 (자세한 것은 웹 타이포그래피의 해부학 링크를 참조하세요)

이 단위는 타이포그래픽에서 세밀한 조정을 할 때 많이 사용합니다. 예를 들어, 위첨자 태그인  sup 에게 position을 relative로 하고 bottom 값을 1ex라고 하면 위로 올릴 수 있습니다. 아래첨자 역시 비슷한 방법으로 아래로 내릴 수 있습니다. 브라우저는 위첨자와 아래첨자의 기본값을 vertical-align으로 정의하고 있지만, 보다 정교한 사용법을 알고 싶다면 아래와 같이 작성할 수 있습니다.

ex는 CSS1부터 있던 단위였고, ch 단위는 아직 찾을 수 없습니다. 에릭 마이어의 블로그에 있는 CSS 단위와 값에서 보다 많은 상세 정보를 볼 수 있습니다.

여러분의 막강한 CSS 도구들의 무한한 확장과 지속되는 개발환경에 계속 눈을 뜨고 지켜보세요 아마 특정 문제를 해결하기 위해 예상치 못한 해결방법으로 이 애매한 특정 단위들을 사용할 수도 있을 것입니다. 새로운 스펙들을 시간을 들여 읽어보세요. cssweekly와 같은 좋은 사이트에도 가입해서 지속적인 뉴스를 업데이트 받아보세요. 그리고 주간 업데이트에 가입하는 거 잊지 마세요. 무료 튜토리얼과 Tuts+의 웹디자인에서 나오는 다양한 자료들을 만날 수 있습니다.


출처 : http://webdesign.tutsplus.com/ko/articles/7-css-units-you-might-not-know-about--cms-22573


저작자 표시
신고
Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

1 ~ n까지 합을 구하는 원리

관련글: 1부터 n까지의 합 구하기

전에 1 ~ n 까지 합 구하기 문제에 관해서 글을 올렸지만, 내용을 좀 더 보충하고자 합니다.

그럼 1에서 n까지의 합을 구하는 문제에 대해서 처음부터 다시 생각해 보겠습니다.

이 문제 자체의 정의를 그대로 프로그램으로 표현한다고 하면, 1에서 n까지의 수를 카운트해서 전부 더하면 됩니다. 일단 문제의 정의에 가장 충실하면서도, 구현도 비교적 간단합니다.

그러나, n이 10, 100, 1000, 10000 정도까지라면 이 알고리즘에 별다른 문제는 발생하지 않지만, 만일 n이 10억, 100억 단위로 커지게 되면 문제가 발생합니다.

반복적 제어구조를 이용하기 때문에, 그만큼의 숫자를 카운트하려다 보면 알고리즘의 수행성능이 대단히 느려집니다. 그러면, 주어진 문제에 대한 해법을 다른 방식으로 찾아볼 필요가 있습니다.


자, 우선 n = 5 라고 가정하고, 1부터 5까지의 합을 계산해 봅시다.


    1 + 2 + 3 + 4 + 5 = ?


잠깐... 이걸 한번 그래픽으로 표현해 볼까요?
인간의 뇌는 뭔가를 그림으로 표현할때 이해가 잘 되는 법입니다.


   ○
   ○○
   ○○○
   ○○○○
   ○○○○○


앗, 삼각형이 되는군요!

그렇다면, 1 ~ 5의 합계는 결국 삼각형의 넓이라는 것으로도 표현될 수 있을 겁니다.

바로 계산해 봅시다.


   삼각형의 넓이 = 밑변 x 높이 / 2

   → 5 x 5 / 2 = 12.5 (??)


어.. 뭔가 답이 이상하죠? 그야 당연한 결과입니다. 삼각형의 넓이는 사각형의 넓이의 절반이라는 개념에서 나온것입니다. 그러니까, 우선 삼각형을 사각형으로 변환하지 않으면 안됩니다. 그래서 밑변 x 높이를 해주는 것이죠.

그런데, 5 x 5를 하게되면...

   ○○○○○
   ○○
○○○
   ○○○
○○
   ○○○○

   ○○○○○


이런 사각형이 되는 겁니다. 구하고자 하는 삼각형의 2배 넓이를 가지는 사각형을 만들어야 하기 때문에, 제대로 하자면 이렇게 되어야 합니다.

   int sum = 0;

   ○○○○○○
   ○○
○○○○
   ○○○
○○○
   ○○○○
○○
   ○○○○○


자, 그럼 계산해 보죠.


   5 x (5 + 1) / 2 = 15


자, 그럼 이 공식을 일반화 해볼까요?
5라는 숫자 대신, n으로 바꿔주면 됩니다.


   n x (n + 1) / 2


자, 그러면 1 ~ n까지의 합이란 문제에 대해서... 위의 공식만 대입하면 끝나는 겁니다. n이 아무리 큰 숫자가 들어와도 단 한줄의 수식만 처리하면 됩니다. 알고리즘의 속도는 비교할 것이 못됩니다.

제가 여기서 강조하는 싶은 건, 공식이 아니라, 수학적인 사고 방법입니다. 수학은 복잡해 보이는 것을 단순하게 만들어 놓고 계산하는 것입니다. 이것이 바로 '추상화'의 과정입니다. 수학은 이런 추상화의 과정 위에서 비로소 계산을 시작하는 겁니다. 그래서 수학은 숫자의 학문이 아니라, 생각의 학문이라고 합니다.

그리고 또 한가지 말하고 싶은 것은, 문제를 해결하는 관점을 여러 각도에서 생각해 보자는 겁니다. 문제를 풀어나가는 방법은 여러가지가 있을 수 있습니다. 위에서 예를 든 경우도, 반복을 통한 누적계산으로 풀어나가는 방법과, 수식으로 계산하는 방법이 있습니다.


둘다 장단점은 있습니다.


누적계산은 문제의 정의를 가장 충실하게 구현한 것이고, 따라서 더 이해하기도 쉽습니다. 하지만 n이 무한히 커지면 수행속도가 현저히 떨어지는 문제가 있습니다. 반면 수식을 통한 방법은 성능에 있어서는 탁월하지만, 저 공식이 어떤 원리로 나왔는지 모를경우에는 저게 뭐하는 것인지 잘 이해가 안될겁니다. (주석이 안달려 있다면 말이죠)

제가 전에 올렸던 피보나치 수열 구하는 방법도 역시, 문제의 정의에 따라서 충실히 구현한 방법과, 황금분할비를 이용해서 곱셉으로 처리하는 방법이 있었습니다. 세상에 한가지 약으로 만병을 치료할 수 없듯이, 어떤 문제에 대해서도 하나의 알고리즘이 만능으로 적용되지는 않는다고 봅니다. 그때 그때 상황에 따라서 방법을 바꿀 필요도 있는 것입니다.

문제를 바라보는 관점에 따라서 얼마든지 방법은 달라질 수 있습니다.

마지막으로, 한가지 문제를 내보겠습니다.
심심하신 분들은 한번 도전(?)해 보시죠...(^^)


[문제]


위에서 1 ~ n까지의 합을 구하는 공식을 만들었습니다. 그러면 1부터가 아니라, a ~ b까지의 합을 구하는 것은 어떻게해야 할까요? 그리고 1씩 증가하는 수열이 아니라 2나 3 등으로 증가하는 수열에 대해서 공통으로 적용될 수 있는 방법은 무엇일까요?


이에 대한 저의 답안은 아래에 있습니다.




우선 a ~ b까지의 합입니다. 간단히 예제로 나가죠.
 
2 ~ 5 까지의 합을 계산해 보겠습니다.
 
   ○○
   ○○○
   ○○○○
   ○○○○○
 
이번엔 사다리꼴 모양이 됩니다.
그럼 이번에도 역시...
 
   ○○○○○○○
   ○○○○○○○
   ○○○○○○○
   ○○○○○○○
 
자, 그럼 여기서 저 사다리꼴의 면적을 구하려면?
 
밑변의 길이: 2 + 5
높이: 4
 
   (2 + 5) * 4 / 2 = 14
 
자, 그럼 이걸 일반화 해보죠.
 
   2 -> a
   5 -> b
 
음.. 그럼 높이 4는 뭘로?
 
여기서 높이는 수열에서의 원소 갯수로 표현할 수 있습니다. 즉 2 3 4 5 로 된 수열이니까, 4개의 숫자가 있는 건데... 여기서 수열의 길이는 구하는 것은 아주 쉽습니다.
 
   "수열의 마지막 값 - 첫번째 값 + 1"
 
마지막에 +1을 해주는 이유는, b - a만 해버리면, a 자신은 카운트에 포함되어 있지 않게 되기 때문입니다.
 
자, 그럼 이제 일반화 해보죠.
 
   (a + b) * (b - a + 1) / 2
 
이걸 풀이하면, (첫번째 원소 + 마지막 원소) x 원소의 갯수 / 2 가 되는 겁니다.
 
그러면....
 
1씩이 아닌, 임의의 수로 증가하는 등차수열의 경우도 이 식의 틀에서벗어나지 않습니다.
2씩 증가하는 수열로 예를 들어 보죠.
 
   2 4 6 8 10 12
 
   ○○
   ○○○○
   ○○○○○○
   ○○○○○○○○
   ○○○○○○○○○○
   ○○○○○○○○○○○○
 
이것 역시 2배를 해보면....
 
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
 
이런 모양이 되는데, 그래봐야 결국은...
 
   (첫번째 원소 + 마지막 원소) x 원소갯수 / 2
 
...인 겁니다.
 
즉, 원소갯수만 구할 수 있다면, 몇개씩 증가하든지 상관없다는 것이지요.
 
그럼 이때의 원소 갯수는 어떻게 구할까요.
 
시작값을 a, 증가분을 c라고 할때, a의 n번째 원소를 구하는 식은 이렇게 됩니다.
 
   A(n) = a + c x n
 
그러면, 마지막 원소값 b가 a로부터 몇번(n)째에 위치한 것인지를 알면, 전체 원소의 갯수를 구할 수 있습니다.
 
저 식으로부터 n을 계산해 내면...
 
   b = a + c x n
   → (b - a) / c = n
 
단 여기에는 시작값 a는 카운트에 포함되어 있지 않으므로, + 1을 시켜줘야 합니다.
그래서, 등차수열에서 전체 원소의 갯수는... → (b - a) / c + 1
그래서 최종적으로 나온 식은...
 
   (첫번째 원소 + 마지막 원소) x 원소갯수 / 2 
   → (a + b) x ((b - a) / c + 1) / 2
 
   a: 시작값
   b: 종료값
   c: 증가분
 
가 됩니다.

이것을 스몰토크에서 표현하면...

-----------------------------------------------
Interval>>sum

     ^(self first + self last) * self size / 2
-----------------------------------------------



출처 : http://sizuha-textcube.blogspot.kr/2006/04/1-n%EA%B9%8C%EC%A7%80-%ED%95%A9%EC%9D%84-%EA%B5%AC%ED%95%98%EB%8A%94-%EC%9B%90%EB%A6%AC.html


저작자 표시
신고

'프로그래밍 > 알고리즘' 카테고리의 다른 글

[알고리즘] 1 ~ n까지 합을 구하는 원리  (0) 2016.01.05
Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거


티스토리 툴바